1.jsp原理图
其步骤如下:
1.jsp引擎将jsp文件翻译为Servlet源程序;
2.之后又将Servlet源程序编译为.class类文件;
其中:
1.Jsp引擎是通常一个Servlet程序,Tomcat中的jsp引擎就是org.apache.jasper.servlet.JspServlet;
2.在Tomcat中编译的源文件和.class文件放在”[TOMCAT_HOME]\work\Catalina\[主机名,如localhost]\应用程序名称” 目录下;
3.默认情况下,第一次访问某jsp文件时,才对该jsp文件进行翻译、编译,所以较慢。不过在以后的访问中将不会在出现该情况,因为已经被编译过了,呵呵。
2.jsp相关类
2.1 jsp相关uml图
其中,org.apache.jsp.index_jsp是tomcat将index.jsp转化为servlet源代码后的结果。其代码可以在如下目录中看到(当然,你要首先访问index.jsp才会翻译,编译)
2.2 具体类源代码
2.2.1 JspPage源代码
package javax.servlet.jsp;
import javax.servlet.Servlet;
public abstract interface JspPage extends Servlet
{
public abstract void jspInit();
public abstract void jspDestroy();
}
2.2.2 HttpJspPage源代码
package javax.servlet.jsp;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract interface HttpJspPage extends JspPage
{
public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
throws ServletException, IOException;
}
2.2.2 HttpJspBase 源代码
和HttpJspPage名称虽然很香精 ,但已经位于不同的包中了。下面的源代码是我从tomcat6中的jasper.jar拉出来的。
package org.apache.jasper.runtime;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import org.apache.jasper.compiler.Localizer;
public abstract class HttpJspBase extends HttpServlet
implements HttpJspPage
{
public final void init(ServletConfig config)
throws ServletException
{
super.init(config);
jspInit();
_jspInit();
}
public String getServletInfo() {
return Localizer.getMessage("jsp.engine.info");
}
public final void destroy() {
jspDestroy();
_jspDestroy();
}
public final void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
_jspService(request, response);
}
public void jspInit()
{
}
public void _jspInit()
{
}
public void jspDestroy()
{
}
protected void _jspDestroy()
{
}
public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
throws ServletException, IOException;
}
2.2.2 JspSourceDependent源代码
package org.apache.jasper.runtime;
public abstract interface JspSourceDependent
{
public abstract Object getDependants();
}
2.2.2
org.apache.jsp.index_jsp 源代码
上面提到过org.apache.jsp.index_jsp是tomcat将index.jsp转化为servlet的源代码。
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=GB18030");
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');
out.write('\n');
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <base href=\"");
out.print(basePath);
out.write("\">\r\n");
out.write(" \r\n");
out.write(" <title>My JSP 'index.jsp' starting page</title>\r\n");
out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"expires\" content=\"0\"> \r\n");
out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
out.write("\t<!--\r\n");
out.write("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">\r\n");
out.write("\t-->\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" This is my JSP page. <br>\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (Throwable t) {
if (!(t instanceof 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);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
其对应的index.jsp为
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
</body>
</html>
2.2.3 九大隐藏对象
从jsp转换的源码中,很容易的就可以发现了传说中的9大jsp内置隐藏对象中的8个。如下:
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
至于第9个,只有page指令被设置为:
<%@ page isErrorPage="true" %>
才会出现:
Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
9大内置对象中,exception几乎不用,其他则是耳熟能详。唯独 PageContext pageContext 少见,我们以后娓娓道来。
参考:《深入体验Java_Web开发内幕-核心基础\》
……
……
- 大小: 6.6 KB
- 大小: 12.1 KB
- 大小: 5.6 KB
分享到:
相关推荐
JavaEE之JSP原理—写个简易计算器.doc
基于JavaEE的数据库原理及应用题库管理系统_JSP网站设计_SqlServer数据库设计.rar
我们计划在未来添加新的数据库支持,届时将使用 MongoDB 验证该原理 本项目在 Apache License 2.0 下获得许可 测试 该项目在 Junit + Arquillian 下提供独立(无需安装第 3 方软件即可运行)测试。 默认情况下,...
2.jsp运行原理-----jsp本质就是servlet(面试) 3.jsp指令(3个) 4.jsp内置/隐式对象(9个)----- 笔试 5.jsp标签(动作) 1.EL 表达式概述 2.EL从域中取出数据(EL最重要的作用) 3.EL的内置对象11个 4.EL...
3年JAVA开发经验,有多个项目开发经验,可独立开发; ...熟练掌握Spring IOC、AOP 的使用和实现原理,掌握java内部面向接口,实现InvocationHandler的动态代理,和Cglib面向父类,实现MethodIn
jsp技术中JDBC的规范 第二次规范 对数据库的封装
推荐完整精品J2EE课件 JavaEE程序设计与应用开发教程 10 MVC和Struts 基本原理(共26页).ppt 推荐完整精品J2EE课件 JavaEE程序设计与应用开发教程 11 Struts标签和错误处理(共38页).ppt 推荐完整精品J2EE课件 ...
在传统的影视行业中,影视最重要的原理是”视觉暂留”, 通过蒙太奇组合成顺畅而生动的影片整体将按照一定的时序摄制的景物各运动阶段的静止画面连续映现出来,把外界事物的影像及声音摄录在胶片上,运用照相以及...
一、课程简介『Java学习指南系列』的第6篇教程,介绍JavaEE中的网站开发相关的技术 ( Servlet / JSP )。相关术语: Servlet | JSP | AJAX | RESTful | 文件上传 | HTTP GET | HTTP POST | URL Encode | 框架 | 抓...
10.IoC和DI概念理解? IOC(Inverse of Control控制反转):从字面上理解就是控制反转了,将对在自身对象中的一个内置...环绕通知的工作原理? 答:Before、After-returning、After-throwing、Around、Introduction;
内容概要:通过带着读者以JavaEE为基础,基于MVC设计模式,设计并实现一套智慧农业软件 平台。对软件平台的系统需求进行分析后,对系统进行整体设计,得出其功能结构 和整体架构。软件平台分为3个软件子系统:企业...
01 JavaEE介绍和环境配置(共30页) 02 JDBC(共45页) 03 JSP基础编程(共46页) 04 JSP内置对象(共48页) 05 JSP和JavaBean(共31页) 06 Servlet基础编程(共25页) 07 Servlet高级编程(共30页) 08 EL和JSTL...
第三章 EJB原理.320 第四章 Session Bean(会话Bean).....322 第五章 消息驱动Bean(MDB).........327 EJB3.0.....329 第一章 EJB3.0 Foundation...............329 第二章 Session Bean........................330 ...
JSP中有个概念,静态包含和动态包含? Strust2和Springmvc的对比? SpringMvc的核心组件和运行流程 SpringMvc常用的注解 Shiro核心组件 Shiro的运行流程 什么RESTful(表现层状态转化)架构? Redis...
Filter(过滤器)简介和工作原理
第02章 JSP应用基础 课堂.ppt JavaEE 是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用。在2004年底中国软件技术大会Ioc微容器(也就是Jdon框架的实现原理)演讲中指出:我们需要一个跨...
01 JavaEE介绍和环境配置.ppt 02 JDBC.ppt 03 JSP基础编程.ppt 04 JSP内置对象.ppt 05 JSP和JavaBean.ppt 06 Servlet基础编程.ppt 07 Servlet高级编程.ppt 08 EL和JSTL.ppt 09 Ajax.ppt 10 MVC和Struts 基本原理.ppt...
2.2.2 理解JSP运行原理 2.3 使用JSP指令标识 2.3.1 页面指令page的使用 2.3.2 文件包含指令include的使用 2.3.3 引用标签库指令taglib的使用 2.4 使用JSP脚本 2.4.1 在JSP中应用代码片段 2.4.2 使用JSP表达式 2.4.3 ...
2.1.1 JavaEE简介 3 2.1.2 MVC开发模式简介 4 2.1.3 JDK简介 4 2.2 前端技术简介 4 2.2.1 LayUI框架简介 4 2.2.2 JSP简介 4 2.2.3 HTML5技术简介 4 2.2.4 JavaScript技术简介 5 2.3后端技术简介 5 2.3.1 Servlet简介...