致敬即将退出历史舞台的JSP
今天小课堂本来是准备讲JSP的隐藏对象的,以前一直以为页面这种东西都是切图仔的事情,JSP的东西我们不用管,关于几个属性的介绍还是比较简单的。赶鸭子上架,临时看了资料,随着查阅的深入,我发现JSP不是我想象的那么简单,在html文件中使用java,表现层实现页面和后台的分离。虽然说JSP技术已经不再是当今的主旋律,但它在web程序设计中所体现的思想和实现技术还是值得我们探讨一下。
一、JSP是什么
我感觉想要准确的给一个名词下定义是很难的,对于JSP尤为如此,因为他的表现形式和它的本质,大相径庭。想要认识JSP是什么,还是先认识JSP文件在web应用中是怎么执行的,他的作用是什么。
JSP的执行原理和流程:
假设:容器=具体的Jsp引擎
(Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面)
1 ----- 客户通过浏览器向服务器端的JSP页面发送请求。、
2 ----- 容器接受到客户请求后,会检查JSP文件对应编译后的Servlet文件(.class)是否存在。
如果不存在,则跳转到第 4 步,否则执行下一步。
3 ----- 容器检查JSP页面是否有更新(修改),没有更新,则跳转到第 5 步,否则执行下一步。
4 ----- 容器将JSP文件转换为Servlet类源文件(.java)。(此步会检查和捕获JSP语法错误)
5 ----- 容器将Servlet源文件(.java)编译成相应的字节码(.class)文件。(会检查和捕获Java语法错误)
6 ----- 容器将字节码(.class)文件加载到内存。
7 ----- 容器实例化Servlet(调用构造函数),然后调用初始化方法(jspInit())初始化Servlet。到此为止,Servlet对象真正成为一个Servlet,准备就绪,可以处理客户的请求了。
8 ----- 容器创建一个新的线程来运行Servlet并运行Servlet的_jspService()方法处理客户的请求。
9 ----- Servlet生成并向客户返回一个响应(或把请求转发给另一个Web应用组件处理)。
我们结合一个简单的JSP页面,看看转译的过程
hello world
<html>
<head>
<title>欢迎页</title>
</head>
<body>
<h2>hello world</h2>
</body>
</html>
我们的JSP页面转译的.java和.class 文件会保存在Tomcat的work目录下
这是转译后的.java
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.88
* Generated at: 2018-06-06 15:32:53 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 index_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 volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
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");
pageContext = _jspxFactory.getPageContext(