1. JSP的核心运行原理
1) 客户端浏览器发送请求到服务器,访问a.jsp文件。
http://localhost:8989/应用名/a.jsp
2) 服务器端接收到请求后所做的处理
a) 创建request和response两个对象
b) 根据请求中的应用名找到该应用下面的web.xml文件,发现该应用的配置文件中没有关于a.jsp路径相关的<url-pattern>的配置,所以会去找tomcat服务器中的全局web.xml的配置。我们发现全局的web.xml配置文件中有关于a.jsp的<url-pattern>的配置内容:
根据上面这段配置我们就找到了JspServlet,这个JspServlet就是jsp引擎。它会把jsp文件转义成一个Java文件。我们可以查看tomcat安装目录下的路径:
Tomcat安装目录/work/catalina/localhost/jsp/org/apache/jsp
这个目录下有一个a_jsp.java和a_jsp.class两个文件。这就是tomcat帮我们把jsp文件转换成的Servlet类的源文件和.class文件。
我们平时在写Servlet时,会继承HttpServlet,然后覆盖service方法,但是我们发现这个a_jsp.java文件中没有service方法,但是有一个_jspService方法。其实,a_jsp类会继承org.apache.jasper.runtime.HttpJspBase类,这个HttpJspBase类有继承HttpServlet类,然后HttpJspBase类中的service方法,调用了_jspService(request, response)方法。到此,我们就知道了最后调用的还是a_jsp类中的_jspService方法。这也是整个a.jsp的核心执行流程。
1. page命令(page指令的作用:设置jsp在转译时的一些配置信息)
A) Page命令中的属性学习
1) <%@page language=”java”%>
声明jsp文件转译的语言,language=”java”的意思是转译为.java文件。
2) <%@page import=”java.util.*,java.lang.*”%>
上面的import属性还可以分开写:
<%@page import=”java.util.*”%>
<%@page import=”java.lang.*”%>
声明转译时导入的java包文件。
3) <%@page pageEncoding=”UTF-8”%>
设置Jsp的数据保存的编码格式
4) <%@page contentType=”text/html;charset=UTF-8”%>
设置数据的响应编码格式
注意:tomca帮我们把jsp文件转译为.java文件,我们查看.java文件时,发现其中有这样一行代码:response.setContentType(“text/html”);
pageEncoding=”UTF-8”和contentType=”text/html;charset=UTF-8”中的任何一个都可以让这行代码变成这样:
response.setContentType(“text/html;charset=UTF-8”);
5) <%@page session=”false”%>
设置session的状态,也就是转译成的.java文件中session是否开启。默认为true,是开启的,设置为false,session就是关闭的。
默认情况下是session=”true”,当session属性取默认值的时候,jsp文件对应的.java文件中会有这样一行代码:
javax.servlet.http.HttpSession session = null;
session = pageContext.getSession();
当我们设置为session=”false”后,.java文件中就没有了关于session的那两行代码。
6) <%@page isErrorPage=”true”%>
默认为false,如果设置为true,就等于开启异常对象的使用
7) <%@page errorPage=”error.jsp”%>
设置当本jsp页面出现异常或错误时,跳转到的指定页面。
B) 局部代码块、全局代码块、java脚本段(表达式)
1) 局部代码块<% Java代码 %>
局部代码块的特点:使用局部代码块声明的java代码会原样转译到_jspService方法中,也就是局部代码。
2) 全局代码块<%! java代码 %>
注意:全局代码块中声明的内容,到了jsp文件转译为.java文件时,会放在.java文件中的成员变量的位置,如上图中,我们就是声明了一个成员变量和一个成员方法,如果我们想调用test方法,应该在哪里调用呢?
我们应该在局部代码块中对test方法进行调用。<% test(); %>
1) Java脚本段(表达式)
声明方式:<%= 变量或调用方法 %>
作用:将java代码的运算结果数据或者其他数据响应给浏览器。一般是方法的调用或者变量。如果是调用方法,则把方法的返回值响应给浏览器。
注意:java脚本段中不能加分号”;”。
A) Jsp的注释
HTML注释:<!-- -->会被转译也会被响应给浏览器,但是浏览器不会执行。
CSS注释:/* */和HTML注释一样,会被转译也会被响应给浏览器,但是浏览器不会执行。
JavaScript注释://和/* */,同HTMl注释一样,会被转译也会被响应给浏览器,但是浏览器不会执行。
Java注释:会被转译,但是不会被执行。
Jsp注释:<%-- jsp注释 --%> 注释内容不会被转译,jsp的注释是最高级别的注释。