javaweb入门(二)——JSP学习01——JSP的原理

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方法
这个方法中主要实现以下功能:

  1. 判断请求类型(JSP页面请求只允许GET、POST、HEAD、METHOD这四种请求类型)
  2. 设置内置对象(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;						//响应对象
	
  1. 为输出页面内容做准备
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;

这些代码的功能是获取各个内置对象的内容,为接下来输出页面内容做准备

  1. 输出页面内容
      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的流程我们可以用一张图来很直观的描写出来:
请添加图片描述