JSP简介

JSP的核心实质是Servlet技术。JSP是后来添加的基于Servlet的一种扩展技术。但二者在使用上有不同的方向。
由于Servlet实质是一个Java类,因此非常适合用来处理业务逻辑。而如果Servlet要展示网页内容,就必须通过输出流对象将view层的代码通过字符串的形式输出,非常麻烦,且不易阅读和维护。另一方面,在JSP中可以直接编写视图层的代码如HTML,因此JSP的它主要用来展示网页内容。但是由于JSP实质是Servlet,因此JSP也是一种动态网页技术。
 
 
而我们实际开发时,JSP只会用来展示网页视图内容,用Servlet来处理业务逻辑。因为 JSTL标签库 以及第三方框架提供的标签足够强大,我们甚至可以自定义标签 ,因此根本没有理由在JSP中写Java代码。
 
JSP的视图代码可以是任何文本内容,如 HTML / XHTML ,XML , JSON , 甚至是txt。通常我们叫这些直接写在JSP中的文本叫做 模板文本数据。
 

JSP, Servlet 和 JSP引擎

我们常说,Tomcat是一个Servlet容器,而不说它是JSP容器,因为JSP实质是被转换为Servlet后再工作的。
那我们为什么不直接使用Servlet呢?因为在Servlet中写视图层代码(HTML)非常狗血。但是Tomcat又只“认识”Servlet,因此就需要JSP引擎做一个转换工作。
 
举个的例子,一切程序都是计算机可执行的机器代码,而直接编写机器代码是非常困难的,于是我们可以用C语言,用C写代码更加直观和易于阅读理解,C编译器会将C代码转换成对应的机器代码。这个例子中,Servlet就好比是机器代码,JSP好比是C语言,而JSP引擎 就好比是C编译器。
 
因此:如果客户端请求的是一个JSP,则该JSP文件传递给JSP引擎,JSP引擎将JSP文件转译为Servlet的java文件,其实质就是这个Servlet来处理客户端的请求。
 

JSP转换为Servlet的细节

 JSP按如下规则转换为Servlet:

1、所有的 非  JSP 文本 ( 如HTML代码,XML代码),都将在生成的_jspService方法中以字符串的形式使用out对象输出。
2、所有的<% %> 和 <%= %>脚本,将在他所在的地方原原本本对应插入到_jspService方法中去。所有的<%!  %>都将成为Servlet的类级别的成员。
       因此<%!  %>写在JSP页面代码的任何地方都没有任何区别。 <%-- --%>  JSP注释 将只保留在JSP代码中,不会存在转换后的servlet代码中
3、EL,JSTL等被JSP引擎使用特殊转换。
 
 

public void _jspService()
{
//..... try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(
this,
request,
response,
null, /*page指令配置的error page 的URL*/
true, /*page质量配置的是否使用session*/
8192, /*page指令配置的out对象的缓存大小(kb)*/
true); /*page指令配置的out对象是否autoFlush*/ //.....
}

JSP转译后的Servlet的继承结构

JSP转译后的java文件在tomcat home下的work目录下找到。

public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public void destroy();
public String getServletInfo();
public ServletConfig getServletConfig();
} public interface JspPage extends Servlet {
public void jspInit();
public void jspDestroy();
} public interface HttpJspPage extends JspPage {
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
private static final long serialVersionUID = 1L;
protected HttpJspBase() {
} @Override
public final void init(ServletConfig config)
throws ServletException
{
super.init(config);
jspInit();
_jspInit();
} @Override
public String getServletInfo() {
return Localizer.getMessage("jsp.engine.info");
} @Override
public final void destroy() {
jspDestroy();
_jspDestroy();
} /**
* Entry point into service.
*/
@Override
public final void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
_jspService(request, response);
}
@Override
public void jspInit() {
}
public void _jspInit() {
}
@Override
public void jspDestroy() {
}
protected void _jspDestroy() {
} @Override
public abstract void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException;
}
可以看出,转译后的Servlet要实现上面的3个接口中的共 8 个 接口方法。然而,由于HttpJspBase 继承了HttpServlet,因此,7个方法已经全部间接实现了(只有_jspService方法没实现 )。
由于JSP的特殊性,HttpJspBase 还是 重写了来自HttpServlet中的3方法,这3个方法正是一个Servlet的标准生命周期方法。而这3个方法内部又委托了 jspInit() 、  jspDestroy()  、 _jspService() 方法去实现。
因此:
1、可以认为,一个JSP的生命周期方法分别是通过 jspInit() 、  jspDestroy()  、 _jspService() 来实现的。如果某个JSP要做初始化和清理工作,则可以重写jspInit() 和 jspDestroy()方法实现。
2、JSP转译后的Servlet必须实现_jspService方法,作为处理响应的逻辑方法。这点我们不用关心,JSP转译后自动根据你写的JSP代码实现。
3、 因为HttpJspBase重写了 HttpServlet中的service方法,覆盖了根据请求发生选择不同处理方法doXXX的派发逻辑,对一个JSP使用任何HTTP请求方法都会调用_jspService方法处理。
 

 
 

JSP的生命周期

要理解JSP的生命周期就必须理解Servlet的生命周期,因为JSP的生命周期相比于Servlet只多了最开始的一步:转译工作。且这个工作只做一次(在JSP文件不改变的情况下)。
在JSP被请求时,容器会先检查这个JSP是否被修改过,如果修改过,则重新转译,然后编译,其后的过程和Servlet生命周期一致。 如果没有,则直接调用内存中驻留的实例的方法。
 
1、如果JSP文件是新的,则转译为Servlet java文件,然后编译为class文件。加载类到内存,创建一个(仅仅一个)Servlet对象。并执行jspInit,表示这个servlet被启用。
     如果不是,则直接调用驻留在内存上的实例的_jspService 方法。
2、通过_jspService方法处理请求。多个请求同时请求同一个JSP的servlet实例,则这些请求会使用独立的线程去调用_jspService 方法。
3、当此Servlet实例不再被使用、或者服务器关机时,调用jspDestroy,GC
 

 
 

【JSP】JSP的介绍和基本原理的更多相关文章

  1. jsp标签的介绍

    cankao:http://www.cnblogs.com/xdp-gacl/p/3788369.html jsp常用的标签有以下3个 1.<jsp:include>标签 2.<js ...

  2. java.lang.NoClassDefFoundError: org/apache/jsp/jsp/Container_jsp

    1.错误描述 八月 20, 2014 7:10:18 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.servi ...

  3. jsp jsp属性范围

    jsp提供了4中属性分别是 当前页:一个属性只能在一个页面中取得,跳转淘其他页面无法取得. 一次服务器请求:一个页面中设置的属性,只要经过了服务跳转,而跳转之后的页面可以继续取得 一次回话:一个用户设 ...

  4. jsp jsp标签

    JSP标签页称为Jsp Action(JSP动作元素),用于在Jsp页面中提供业务逻辑功能,避免在Jsp页面中直接编写java代码,造成jsp页面难以维护. jsp常用标签 jsp:include标签 ...

  5. JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术

    JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术.从这一点来看,非常类似Microsoft ASP.PHP等技术.借助形式上的内容和外观表现的分 ...

  6. JSP<jsp:forward>与<%@ include%>

    JSP<jsp:forward>与<%@ include%><jsp:include> <jsp:forward file="forwardTo_p ...

  7. <jsp:include page="${pageContext.request.contextPath/index.jsp" ></jsp:include> 引发的错误

    路径引发的错误 如下使用项目路径对jsp页面进行获取,会报javax.servlet.ServletException: File "/web/dbwx/web/public/page_to ...

  8. JavaWeb——JSP,JSP指令,注释

    什么是JSP JSP原理 JSP页面中的java代码服务器是如何执行的 Web服务器在调用jsp时会给jsp提供一些什么java对象 JSP执行过程 JSP页面的元素包括 JSP模版元素 JSP脚本片 ...

  9. JSP的简单介绍

    什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写htm ...

随机推荐

  1. synchronized关键字的用法总结

    synchronized关键字主要有以下这3种用法: 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代 ...

  2. 在 ubuntu 【6.06、6.10】 上安装 oracle 10.2.0.1,并打补丁 10.2.0.5

    特点: ubuntu 6.06.6.10 算是很古老的ubuntu了,其应该是基于 debian 4 的 tesing/unstable 分支.所以,毛病较多. 如何安装oracle10g? 几个技术 ...

  3. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

  4. tomcat设置debug模式

    1.设置 编辑catalina.bat,在 rem Guess CATALINA_HOME if not definedset "CURRENT_DIR=%cd%"if not & ...

  5. c# 匿名反序列化

    1.先new一个匿名对象,然后再反序列化好处是能点点点,坏处是得先new匿名对象 2.借用Newtonsoft.Json.Linq.JObject.Parse,好处是不需要new匿名对象,坏处是不能点 ...

  6. Visual Assist X 10.8.2042的Crack破解补丁. 2014.06.25 (General release.)

    VA小组时隔一个月又公布了新的版本号,这个版本号新添加了5个特性,修复了7-8个bug.而且也是稳定的Release版.所以这是很推荐更新的一个版本号. 对于破解补丁还是老规矩,请到我的下载空间下载, ...

  7. it码农之心灵鸡汤(一)

    到底该怎么面对工作,到底怎么面临人生.到底怎么面临青春,对于打工的人来说这些一直都是心中一直无法解惑的谜团. 对于人们怎样看待工作,以前华为创始人任正非说过:非常多人问我,来公司工作有没有双休?需不须 ...

  8. ios开发之--所有设备的屏幕尺寸

    所有设备型号官网地址:https://www.theiphonewiki.com/wiki/Models iPhone: 机型 像素 比例 像素密度 屏幕尺寸 机型代码 发布日期 iPhone 2g ...

  9. Code-audit-Learning

    代码审计精华文章收录: 关于php的一些'特性'或漏洞  https://github.com/80vul/phpcodz [干货分享]PHP漏洞挖掘——进阶篇    http://blog.nsfo ...

  10. Libjingle库 综述

    国内现在很多语音聊天工具都是基于TURN方式实现的,包括YY.AK等等,这种方式对于服务器的性能要求很高,而且在用户量增大的时候,服务器压力也会越来越大,用户的语音质量也会受到很大影响.而基于P2P方 ...