1. 什么是JSP
JSP
的全称是Java Server Pages
,意为Java服务器端页面,和Servlet
一样,用于开发动态Web技术。
其实JSP
的语法和HTML
非常相似,标签也大多都一样,但是JSP中可以嵌入JAVA代码并且也可以为用户提供动态的数据。
2.JSP原理
首先我们需要知道的是:不管客户端向服务器发送请求,不管是访问的是什么资源,其实都是在访问Servlet!
所以JSP也会被转换成一个Java类。
我们可以在项目的文件中可以找到JSP
转换之后的Java类。(一般在....\Catalina\localhost\项目名\org\apache\jsp
目录之下)
我们之前所说,客户端给服务器发送请求,访问到的资源都是Servlet,在我们打开index_jsp.java
之后,却发现这个Java类并没有直观的继承Servlet相关的类:
但是如果我们继续查看它继承的org.apache.jasper.runtime.HttpJspBase
类,我们可以发现,HttpJspBase
类是继承的HttpServlet
类,也就是说其实JSP转换之后的Java类也是Servlet类
。
(需要知道的是,我们在IDEA中不能直接访问HttpJspBase
的代码,需要首先导入对应的依赖:
<!-- https://mvnrepository.com/artifact/tomcat/jasper-runtime -->
<dependency>
<groupId>tomcat</groupId>
<artifactId>jasper-runtime</artifactId>
<version>5.5.23</version>
</dependency>
)
那么接下来我们继续看index_jsp.java
类之中的代码,其中有三个方法需要我们来注意一下:
// jsp初始化
public void _jspInit() {
}
// jsp销毁
public void _jspDestroy() {
}
// jsp服务
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
其中的_jspService我们可以简化一下:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
我们可以发现,在把参数的包名简化之后,这其实就是Servlet中的service
方法。
这个方法中主要实现以下功能:
- 判断请求类型(JSP页面请求只允许GET、POST、HEAD、METHOD这四种请求类型)
- 设置内置对象(JSP页面中有九大内置对象)
final javax.servlet.jsp.PageContext pageContext; //页面内容pageContext
javax.servlet.http.HttpSession session = null; //Session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config设置对象
javax.servlet.jsp.JspWriter out = null; //out 输出对象
final java.lang.Object page = this; //page 当前页面对象
HttpServletReqeust request; //请求对象
HttpServletResponse response; //响应对象
- 为输出页面内容做准备
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
这些代码的功能是获取各个内置对象的内容,为接下来输出页面内容做准备
- 输出页面内容
out.write("<html>\n");
out.write("<body>\n");
out.write("<h2>Hello World!</h2>\n");
out.write("</body>\n");
out.write("</ht。ml>\n");
我们在JSP中编写的HTML代码,都会放到out.write()
中。(需要注意的是,我们在JSP页面中编写的JAVA代码是原封不动的编译过来的)
其实客户端访问JSP的流程我们可以用一张图来很直观的描写出来: