扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
众所周知,每一个JSP页面都会被Web容器编译成一个Java类,供web容器调用,并且生成HTML叶面回馈给用户。而了解其中的变异方法和规则,对我们学习JSP是非常有好处的,可以说学习好了这个编译原理,就已经学习好了大部分的JSP知识,剩下的工作就只剩下熟记一些tablib和反复应用以使自己更加熟练而已了。。
先来看一下JSP页面所对应的Class的基本结构。每一个JSP页面都会被编译成成如下的格式样子,先给一个大致的印象,详细的说明在后面。
public class My$jsp extends HttpJspBase {
static {}
public date$jsp() {}
private static boolean _jspx_inited = false;
public final void _jspx_init()
throws org.apache.jasper.runtime.JspException {};
public void _JSP pageservice(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String _value = null;
try {
if (_jspx_inited == false) {
synchronized (this) {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
"", true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
// HTML // begin [file="/date.jsp";from=(0,0);to=(7,6)]
out.write("<html>\r\n<head>\r\n<title>Date</title>\r\n" +
"</head>\r\n<body>\r\n<h3>\r\n" +
"The date is\r\n");
// end
// begin [file="/date.jsp";from=(7,8);to=(7,57)]
out.println((new java.util.Date()).toString());
// end
// HTML // begin [file="/date.jsp";from=(7,59);to=(10,7)]
out.write("\r\n </h3>\r\n </body>\r\n</html>");
// end
} catch (Throwable t) {
if (out != null && out.getBufferSize() != 0) {
out.clearBuffer();
}
if (pageContext != null) {
pageContext.handlePageException(t);
}
} finally {
if (_jspxFactory != null) {
_jspxFactory.releasePageContext(pageContext);
}
}
}
}
我们可以清楚地看到,这里面最重要的函数就是pageservice,web容器在编译好一个JSP类以后,就申请这个类的对象,并且直接调用pageservice来获得Response,最后返回给客户。作为细节,我们可以总结如下:
省写方式<%= object.doSomething()%> 这么理解? 这种省写方式调用doSomething所得到的Object的toString(),然后直接写到out里面。相当于:
以上是JSP翻译过程的简单探讨,更加详细的细节可以参考tomcat的源代码,了解这些原理对于学习JSP来说,是非常重要的,能大大的提高学习的效率。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者