Java Web 10 JSP 10.3 JSP 原理
Java Web
【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】
10 JSP
文章目录
- Java Web
- 10 JSP
- 10.3 JSP 原理
10.3 JSP 原理
JSP 中可以写HTML标签,这好像是个页面,但是为何它还能写Java 代码。
Because JSP的本质就是一个Servlet。!
【访问jsp 的流程】
- 浏览器第一次访问 hello.jsp 页面
- tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
- tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class
- tomcat 会执行该字节码文件,向外提供服务
查看target目录:
看看这是啥
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.47
* Generated at: 2022-09-12 08:13:33 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
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 {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
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("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h1>Hello JSP</h1>\r\n");
System.out.println("Hello,JSP.");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
看看代码:
可以看到这个类继承了一个叫 HttpJspBase 的类。
查看Tomcat 源码
OMG,可以看到这个类继承了 HttpServlet ,那这样子的话 hello_jsp 这个类就间接的继承了 HttpServlet ,也就说明 hello_jsp 是一个 servlet 。 【Java 多重继承】
再看下面
这个方法就是每次访问 JSP 时自动执行的方法,和 servlet 中的 service 方法一样 。
它往浏览器中的写了标签代码。
像上次那个JD案例,HTML 代码是咱们自己通过writer 对象写进浏览器的,但是现在有了JSP 后,由Tomcat 完成这个功能。
OMG。