这几天琐事太多,影响学习了,好在已经解决,还是继续,考研最后的冲刺阶段,我也跟随考研党们最后冲刺一波,三楼西的很多人都已经眼熟,愿你们一个月后有一个好的结果。
jsp用过好久了,这次又看了一遍,还是搞明白了很多以前半知半解的东西。
什么是jsp呢?
jsp=html+java脚本+jsp标签(指令)
为什么会出现它呢?
首先看看servlet:
之前学习的时候知道,它是服务器用来接收请求并响应请求的,想一下,响应的时候它是怎么把html的响应体发给浏览器的呢?是通过response.getWriter()得到的这个流对象输出到浏览器,如果每一句html都需要这么办,那不是要浪费很多代码吗?
这时候想可以用html啊,可是html是静态页面,并不能包含变量啊,它并不支持动态响应啊。那这也不行那么不行该怎么办呢
这时候jsp就出现了,它是在html的基础上添加java脚本,也就是把两者的优点混合了。
既然有jsp了,还要servlet干嘛?
想一想如果你所有的处理都用jsp,那么用户在页面一看F12,你怎么弄的这玩意不就都知道了吗。
所有jsp和servlet是明确分工的:
jsp:作为请求发起页面。
作为请求结束页面
servlet:请求中处理数据的环节。
那jsp为什么能干servlet的活呢?
这是因为jsp其实就是一个servlet,当jsp被第一次访问的时候,服务器会把jsp编译成java文件(这个java文件其实就是一个servlet类),然后再把java编译成.class,然后创建该类对象,最后调用他的service()方法,第二次请求统一jsp时,直接访问service()方法。
服务器是怎么知道要把jsp变成servlet的?
这也是需要明白的,在web.xml中进行配置,
这样所有的jsp也就是*.jsp这个url路径进来,会找到servlet-name对应的servlet-class,也就是JspServlet,通过这个类就能把jsp转换成servlet。
现在先看看一个jsp页面包含的东西再看看编译成servlet之后的代码。
jsp=html+java脚本+jsp标签(指令)
html就不用说了,来看看java脚本。
jsp指令也有三种:
jsp标签:
两者的作用都是处理所需要的文件,但处理方式和处理时间不同。
include指令标记是在编译阶段就处理所需要的文件,被处理的文件在逻辑和语法上依赖于当前的jsp页面,优点是执行速度快。
include动作标记在jsp页面运行时才被处理的文件,被处理的文件在逻辑和语法上独立与当前的JSP页面,其优点是可以使用param子标记更灵活的处理所需要的文件,缺点是执行要慢一点
自己写一个简单的jsp
我们到tomcat服务器下的work文件夹里面找到这个目录看一下
看到生成了两个servlet,说明动作标签是编译后再到一个页面上显示的。看看生成的这个NewFile.java,里面这个jsp页面到底变成了什么样
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.82 * Generated at: 2017-11-15 02:16:31 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 NewFile_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; static { _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(1); _jspx_dependants.put("/b.jsp", Long.valueOf(1510712186569L)); } 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; 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(" "); out.write(" "); out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> "); out.write("<html> "); out.write("<head> "); out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> "); out.write("<title>Insert title here</title> "); out.write("</head> "); out.write("<body> "); out.write(" <p>我的jsp</p> "); out.write(" "); int a=0; while(a<5){ a++; } out.write(" "); out.write(" "); out.print(a ); out.write(" "); out.write(" "); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "a.jsp", out, false); out.write(" "); out.write(" "); out.write(" "); out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> "); out.write("<html> "); out.write("<head> "); out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> "); out.write("<title>Insert title here</title> "); out.write("</head> "); out.write("<body> "); out.write("<p>B被包含了</p> "); out.write("</body> "); out.write("</html>"); out.write(" "); out.write("</body> "); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { 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); } } }
代码有点多,只看看这几点,首先是
html代码在里面是怎么表示的,然后是java脚本是怎么显示的。
然后第二点是看看
这里定义的是什么呢?
这里面就涉及到另一个东西了,那就是jsp的九大内置对象。
这九大内置对象是不用在jsp中定义就可以直接使用的,现在知道为什么了么?在转换之后它会给你自动定义。来看看这九大内置对象