当前位置: 首页 > 图灵资讯 > 技术篇> JSP原理深度刨析

JSP原理深度刨析

来源:图灵教育
时间:2023-06-01 09:48:53

1.第一个JSP程序351.1原理35

在WEB-INF目录之外创建index.jsp文件,然后文件中没有任何内容。

-部署上述项目后,启动服务器,打开浏览器,访问以下地址:

-http://localhost:8080/jsp/index.jsp在大家面前展示的是一个空白。

-事实上,访问以上内容:index.jsp,底层执行如下:index_jsp.java程序class。

-这个index.tomcat翻译将jsp生成index_jsp.java文件,tomcat服务器将index_jsp.生成index_java编译jsp.class文件

-访问index.jsp,实际上,index__jsp.class中的方法。

1.2JSP实际上是Servlet。35

-index.jsp访问时,自动翻译生成index_jsp.java,index_会自动编译生成index_jsp.class,那么index_jsp就是一个类。

-index_jsp类继承HttpJspbase,HttpJspbase类继承Httpservlet。所以index_jsp类是servlet类。

-jsp的生命周期与servlet的生命周期完全相同。完全是一件事。没有区别。

-jsp和servlet一样,都是单例。(假单例。)

1.3jsp文件第一次访问比较慢。为什么?35

-为什么大多数运维人员在向客户演示项目时提前访问所有jsp文件?

-第一次更麻烦:

-将jsp文件翻译成java源文件

-编译生成class字节码文件的java源文件

-然后通过class创建servlet对象

-然后调用servlet对象的init方法

-最后,调用servlet对象的service方法。

-第二次比较快,为什么?

-因为单例servlet对象的service方法可以第二次直接调用。

2.什么是JSP?

-JSP是Java程序。(JSP本质上是Servlet)

-JSP是:JavaServerPages缩写。(基于Java语言的服务器端页面。)

-Servlet是JavaEE的13个子规范之一,因此JSP也是JavaEE的13个子规范之一。

-JSP是一套规范。所有web容器/web服务器都遵循这一规范,按照这一规范进行“翻译”

-每个web容器/web服务器都会内置JSP翻译引擎。

-对JSP进行错误调试时,应直接打开JSP文件对应的java文件,检查java代码。

-JSP开发的最高境界:

-JSP代码出现在我面前,但java代码出现在我的脑海里。

3.既然JSP本质上是Servlet,JSP和Servlet有什么区别?35

-职责不同:

-Servlet的职责是什么:收集数据。(Servlet的优势在于逻辑处理、业务处理,然后链接数据库获取/收集数据。)

-JSP的职责是什么:显示数据。(JSP的优势是显示数据)

4.JSP的基本语法354.1直接在JSP文件中编写文字,会自动翻译到哪里?35

-将service方法翻译成servlet类的out.write(“翻译到这里”),直接翻译到双引号,用java程序作为普通字符串打印输出到浏览器。

-JSP中编写的HTMLCSJS代码对JSP来说只是一个普通的字符串。但一旦JSP将普通字符串输出到浏览器,浏览器将解释HTMLCSSJS。显示一个效果。

4.2解决响应中的中文乱码问题:35

-JSP的page指令(这个指令稍后再详细说明,这里先解决中文乱码问题)

-响应的内容类型是通过page指令设置的,并添加到内容类型的最后:charset=UTF-8

-<%@pagecontentType="text/html;charset=UTF-8"%>,text///html,UTF-8使用的字符集

WEB-INF1代码.jsp

<%@page contentType="text/html; charset=UTF-8" %>  <%--解决中文乱码问题  35--%><html>    <head>        <title>my first jsp page</title>        <script>            function sayHello(){                alert("你好,jsp");            }        </script>    </head>    <body>    <input type="button" value="hello jsp" onclick="sayHello()"/>    <h1>my first jsp page</h1>    abcdefghijklmnopqrstuvwxyz    </body></html>

5.Java程序如何在JSP中编写?365.1基本符号365.1.如何在JSP中编写JSP专业注释36

- <%--JSP的专业注释不会被翻译成Java源代码。-%>

- <!--本注释属于HTML注释,该注释信息仍将翻译成java源代码,不推荐。-->

5.1.2<%java语句;%>

-编写在这个符号中的java程序被视为翻译成Servlet的java程序service方法内部。

-在这里你要小心,你要思考,在这里<%%>在这个符号中写java代码时,你应该永远记住你在“方法体”中写代码

WEB-INF2代码.jsp

<%--在jsp中编写java代码  36--%><%@page contentType="text/html; charset=UTF-8" %><%    System.out.println("hello,jsp");%><!--不专业的HTML注释仍将被翻译成java源代码。不要在JSP中使用此注释--><%--JSP专业注释不会将注释信息翻译成Java源代码。建议使用这种注释方法。--%><%--错误报告原因:在service方法中定义的变量不能用private等访问权限修改。--%><%--    private int i;--%><%--在方法体中,静态代码块不能直接编写,方法不能直接编写,方法套不允许。--%><%--    static {        System.out.println(“静态代码块执行”);    }--%><%--    public static void m(){        System.out.println("m method execute");    }--%><%    int num = 100;%><%    System.out.println("num="+num);%><%--错误原因:方法体中的每一行代码都是java语句,java语句要分号;结尾。--%><%--    System.out.println("hello world")--%>

5.1.3方法体能写什么,不能写什么,你心里明白吗?36

-编写在service方法中的代码是有序的,方法体中的代码应按照自上而下的顺序逐一执行。

-不能在service方法中写静态代码块,不能写方法,不能定义成员变量。。

-在同一JSP中<%%>多个符号可以出现这个符号。

5.1.4<%!%>36

-编写在这个符号中的java程序将自动翻译到除了service方法。

-这种语法很少使用。为什么?不建议使用,因为在service方法外写静态变量和实例变量时,会出现线程安全问题,因为JSP是servlet,servlet是单例。在多线程并发的环境下,一旦修改了静态变量和实例变量,必然会出现线程安全问题。

WEB-INF3代码.jsp

<%--在这个符号<%! %>  java程序将自动翻译到service方法之外。 36 --%><%@ page contentType="text/html;charset=UTF-8"  %><%    System.out.println("hello servlet");%><%--以上这一点在此解释<% %>service方法体中会放置java代码,而下面的<%! %>java代码将被放置在service外,因此在3_jsp.java中,<%! %>java代码将被放置在service外,因此在3_jsp.java中,<%! %>在上而<% %>在下--%><%!    ///成员变量    private String name = "jackson";    ///静态代码块    static {        System.out.println(“静态代码块执行”);    }    //方法    public static void m1(){        System.out.println(m1()执行方法);    }%>

5.2JSP输出语句36-37

-如何在浏览器上输出java变量?

-<%Stringname=“jack”;

out.write("name="+name);

%>

-注:上述代码中的out是JSP的九个内置对象之一。可以直接使用。当然,它只能在service方法中使用。

-如果在输出到浏览器的内容中没有“java代码”,例如,输出的字符串是一个固定的字符串,可以直接在jsp中编写,而无需编写<%%>这里。

-若输出内容中含有“java代码”,此时可采用以下语法格式:

-<%=%>注:将要输出的内容写在=的后面。

-<%=%>这个符号会翻译到哪里?最后翻译成什么?

-将这个java代码翻译成:out.print();

-将其翻译成service方法。

-何时使用<%=%>输出呢?输出内容包含java变量,输出内容是动态内容,而不是死字符串。如果输出是固定字符串,可以直接在JSP文件中编写。

WEB-INF4代码.jsp

<%@ page import="javax.crypto.spec.PSource" %><%--  JSP输出语句    36--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%    String name = "jack";    System.out.println(name);///这里输出到控制台    //如何在浏览器上输出java变量?    ///可以直接在这个符号中使用out对象  36    out.write("name="+name);    //如果将字符串输出到浏览器上。可以直接写在外面  37%><%--写在外面--%><br>asdsg<br><%--若输出内容中含有“java代码”,此时可采用以下语法格式:   37--%><%--- <%= %> 这个符号最终会被翻译成 java代码:   out.print(); 将其翻译成service方法。--%><%= 100+200%><%--输出是固定的,纯字符串。--%><%= 100+200%><%--输出是固定的,纯字符串。这样输出毫无意义。--%><%="hello world" %>  <%--  out.print("hello world");  --%><br><%--就这样写吧。--%>hello world<br><%    int a = 100;    int b = 200;    int c = a + b;%><%=c %><%    String username = "jack";%><%=“成功登录,欢迎" + username %>  <%-- 等于out.print(“成功登录,欢迎” + username); --%>

JSP原理深度刨析_java代码

6.JSP基础语法总结:37

- 直接在JSP中编写普通字符串 将outt翻译到service方法.write(这里”)

- <%%> 将其翻译到service方法体内,内部是java语句。

- <%! %> 除了service方法的翻译。

- <%= %> 将其翻译成service方法体,翻译成:out.print();

- <%@page contentType="text/html;charset=UTF-8"%>

- 通过contenttype属性设置响应内容类型的page指令。