本文共 7300 字,大约阅读时间需要 24 分钟。
我在这里首先要明确一点JSP技术的实现是依赖于Servlet的
好了我们先明确一下这个真理然后来看jsp的几大内容
<%@ page attr="value"%>
<%@ include file="url"%>include指令称之为静态包含指令,其作用是在include指令处静态包含另一个文件的内容。
<%@ taglib prefix="xxx" uri="XXX" %>taglib指令用于导入第三方标签库,关于标签库的内容我们以后在来学习。
<% int i = 12 / 0; %>内容遵循java语法格式,并且在这里面执行的代码,相当于是在servlet的service()方法中的本位置执行的代码。
<%! private String a = "123456789"; private int add(int a,int b) { return a + b; } %> <% int a = add(1,2); out.print(a); %>
<%= a %><%= string1 %>相当于计算该表达式,在调用print方法输出到客户端。
response | HttpServletResponse |
request | HttpServletRequest |
session | HttpSession |
out | JspWriter |
application | ServletContext |
pageContext | PageContext |
config | ServletConfig |
page | HttpJspPage |
exception | Throwable |
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" errorPage="/jsp/error.jsp" %><%-- <%@ include file="url"%> <%@ taglib prefix="xxx" uri="XXX" %> --%>哦了,让我们揭下他真正的面具吧!主页面 <%! private String string1 = "123456789"; private int add(int a,int b) { return a + b; } %> <% int a = add(1,2); out.print(a); %> <% int i = 12 / 0; %> <%= a %> <%= string1 %>
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.75 * Generated at: 2017-03-23 12:10:36 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.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class jsp1_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { /* <%! private String string1 = "123456789"; private int add(int a,int b) { return a + b; } %>*/ private String string1 = "123456789"; private int add(int a,int b) { return a + b; } private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map那么既然道最后编译成了servlet,我们是不是应该在web.xml又该servlet的映射呢?_jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map 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 {/*获取9大内置对象*/ 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, "/jsp/error.jsp", 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'); out.write('\n'); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\t 主页面 \r\n"); out.write("\r\n"); out.write("\r\n"); out.write(" \r\n"); out.write("\t"); out.write("\r\n"); out.write(" \r\n"); out.write("\t");/*我们的Scriptlet脚本*/ int a = add(1,2); out.print(a); out.write("\r\n"); out.write(" \r\n"); out.write("\t"); int i = 12 / 0; out.write("\r\n"); out.write(" \r\n"); out.write("\t"); /*我们的表达式*/ out.print( a ); out.write('\r'); out.write('\n'); out.write(' '); out.print( string1 ); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); } 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); } }}
大家看到我们在请求jsp页面时实际上是在请求org.apache.jasper.servlet.JspServlet这个他妈的servlet,这不是坑爹吗,来让我们看看这小子做了什么jsp *.jsp *.jspx jsp org.apache.jasper.servlet.JspServlet fork false xpoweredBy false 3
转载地址:http://muelf.baihongyu.com/