JSP学习笔记
1.JSP是什么?
JSP技术是servlet的一个改进,将java代码和html代码的分离简化了编程的复杂度,jsp其实也是一个servlet。
2.JSP执行过程
JSP发起请求 → action接收请求 → service层执行相关业务逻辑代码返回结果 → action通过javabean传递变量给jsp → jsp通过jsp引擎编译成servlet源码 → servlet源码编译成class文件 → 执行class文件并响应
以下内容引用http://blog.sina.com.cn/s/blog_4e57731f0100b1k6.html中的分析:
注意该Servlet的url-pattern为“*.jsp”及所有后缀为“.jsp”等请求将会访问该Servlet,例如:在浏览器地址栏输入“.../应用名/test.jsp”将访问该Servlet。
可以做一个小的实验,在conf/web.xml中替换JspServlet对应的url-pattern(例如:改成hey),重启Tomcat服务器,访问内容如下所示的hello.jsp(地址为".../应用名/hello.jsp")
<html>
<head>
<title>hello.jsp</title>
</head>
<body>
<%
for (int i = 0; i <= 100; i++) {
out.println("helloworld");
}
%>
</body>
</html>
通过在浏览器中"单击右键->查看源文件"的方式可以看到浏览器你收到的内容为:
<html>
<head>
<title>hello.jsp</title>
</head>
<body>
<%
for (int i = 0; i <= 100; i++) {
out.println("helloworld");
}
%>
</body>
</html>
可见该jsp并没有被解析,而是以静态文本的方式原样输出。
在Tomcat安装目录下的\work\Catalina下可以找到JSP经过“翻译”后的Java源文件和编译后类文件,对于上面hello.jsp而言,“翻译”后的Servlet源文件为:\work\Catalina\localhost\tst\org\apache\jsp\hello_jsp.java
该文件的主要内容如下:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
... ... ...
public void _jspService
(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
... ... ...
out.write("<html>\r\n");
out.write("\t<head>\r\n");
out.write("\t\t<title>hello.jsp</title>\r\n");
out.write("\t</head>\r\n");
out.write("\r\n");
out.write("\t<body>\r\n");
out.write("\t\t");
for (int i = 0; i <= 100; i++) {
out.println("helloworld");
}
out.write("\r\n");
out.write("\t</body>\r\n");
out.write("</html>");
... ... ...
}
}
可以看出hell.jsp经过“翻译”后的类名为hello_jsp 该类继承了org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase类又是HttpServlet的子类。HttpJspBase在其service方法中调用了_jspService方法,针对特定的jsp页面,Tomcat的JSP引擎将其“翻译”成HttpJspBase的子类并重写其_jspService方法。该类的很多初始化内容有JSP引擎完成。
在上面的_jspService方法中可以看到hello.jsp的“影子”,在JSP中使用<%...%>所书写的Java代码被原样的置于_jspService方法中;另外在JSP中的HTML脚本通过流对象out原样输出...当然,JSP的“翻译”不可能如此简单,因为JSP页面还可能写有指令、标签等复杂的结构。
从上面的_jspService方法还可以看出,所谓JSP内建对象(request、reponse、application、session等)其实并不神秘,它们或是_jspService方法的参数变量,或是由JSP引擎在_jspService方法中预先定义好的变量,我们在JSP的<%...%>中可以直接使用。
3.JSP的内建对象:
所谓内建对象就是不需要我们创建,他们由容器创建和实现。
Request request 表示HttpServletRequest 对象。取客户端表单域信息及cookie,header, 和session
Response response 表示HttpServletResponse 对象,对客户端的响应返回文本、写cookies。
Out out 向客户端打印html 文本.
PageContext 当前jsp 页面的上下文环境,可以得到session、request、application等内置对象,在自定义标签中使用的很多。
Session session 表示一个请求的javax.servlet.http.HttpSession 对象。Session 一个用户多个页面共享同一变量。
Application applicaton 表示一个javax.servle.ServletContext 对象。存放容器级的变量。
Config config 表示一个javax.servlet.ServletConfig 对象。该对象用于存取servlet实例的初始化参数。
Page page 表示从该页面产生的一个servlet 实例.
Exception 异常,当iserrorpage=true.
9个内建对象对应全部方法参考这篇文章:https://blog.csdn.net/sweetsoft/article/details/782939