一、从JSP到Servlet
1、JSP生命周期
(1)JSP最后会被容器转译为Servlet源代码、自动编译为.class文件、载入.class文件,然后生成Servlet对象,所以第一次请求JSP页面会慢许多才得到响应。
(2)JSP在转译为Servlet并载入容器生成对象后,会调用_jspInit()方法进行初始化操作,而销毁前则是调用_jspDestroy()方法进行善后操作,在Servlet中,每个请求到来时,容器会调用service()方法,而在JSP转译为Servlet后,请求的到来则是调用_jspService()方法。当请求到来而容器调用service()方法时,其中又调用了_jspService()方法,也因此在JSP转译为Service的源代码中,会看到所定义的代码是转译在_jspService()方法中。
(3)转译后的Servlet会重新定义_jspInit()、_jspDestroy(),如果想要在JSP网页载入执行时做些初始化操作,则可以重新定义jspInit()方法,如果想要做一些收尾操作,则可以重新定义jspDestroy()方法。
2、Servlet至JSP的简单转换
JSP会转换为Servlet,Servlet可实现的功能也可以用JSP实现,通常JSP会作为画面显示用。
(1)每个JSP中的元素,都可以对照至Servlet中某个元素或代码,如指示元素、隐式元素、Scriptlet元素、操作数元素等,斗鱼Servlet有实际的对应。
(2)使用JSP处理画面不必使用“”包括字符串来做HTML的输出。
(3)可直接用Scriptlet元素,也就是使<%与%>包括要编写的Java代码。
3、指示元素
(1)JSP指示元素的主要目的,在于指示容器将JSP转译为Servlet源代码时,一些必须遵守的信息,指示元素的语法如下:
<%& 指示类型 [属性=“值”]* %>
(2)在JSP中有三种常用的指示类型:page、include与taglib。
page指示类型告知容器如何转译目前的JSP网页。
page指示类型的import属性告知容器转译JSP时,必须在源代码中包括的import陈述。也可以在同一个import属性中,使用逗号分隔数个import的内容。可以在使用page指示类型时一行一行编写,也可以编写在同一个元素中。
例1、<%@ page import=”java.util.Data” %>
page指示类型的contentType属性告知容器转译JSP时,必须使用HttpServletRequest的setContentType()方法,调用方法时传入的参数就是contentType的属性值。
page指示元素的pageEncoding属性告知这个JSP网页中的文字编码,以及内容类型附加的charset设置。如果网页中包括得ASCII编码范围中的字符,就要指定正确的编码格式,才不会出现乱码。
例2、<%@page contentType=”text/html” pageEncoding=”UTF-8” %>
page指示类型的其他属性:
Info属性:用于设置目前JSP页面的基本信息,这个基本信息最后会转换为Servlet程序中使用getServletInfo()所取得的信息。
autoFlush属性:用于设置输出串流是否要自动清除,默认是true,如果设置为false,而缓冲区满了却没有调用flush()将数据送出至客户端,则会产生异常。
buffer属性:用于设置至客户端的输出串流缓冲区的大小,设置时必须指定单位,例如buffer=“16kb”。默认是8kb。
errorPage属性:用于设置当JSP页面执行错误而产生异常时,该转发哪一个页面处理这个异常。
extends属性:用来指定JSP网页转译为Servlet程序之后,该继承哪一个类。
isErrorPage属性:设置JSP页面是否为处理异常的页面,这个属性要与errorPage属性配合使用。
language属性:指定容器使用哪种语言的语法来转译JSP网页。
session属性:设置是否在转译后的Servlet源代码中具有创建HttpSession对象的语句,默认是true,若某些页面不需做进程跟踪,设成false可增加一些效能。
isELIgnored属性:设置JSP网页中是否忽略表达式语言,默认是false,如果设为true,则不转译表达式语言,这个设置会覆盖web.xml中的<el-ignored>设置。
isThreadSafe属性:告知容器编写JSP网页时是否注意到线程安全,默认值是true,如果设置为false,则转译之后的Servlet会实现SingleThreadModel接口,每次请求时将创建一个Servlet实例来服务请求,不建议设置为false。
include指示类型告知容器将别的JSP页面包括进来进行转译。会在转译时期就决定转译后的Servlet内容,是一种静态的包括方式。
例3、将header.jspf与foot.jspf的内容包括进来做转译:
<%&include file=”/WEB-INF/jspf/header.jspf” %>
<%&include file=”/WEB-INF/jspf/foot.jspf” %>
taglib指示类型告知容器如何转译这个页面中的标签库。
(3)指示元素中可以有多对属性/值,必要时,同一个指示类型可以用数个指示元素来设置。
4、声明、Scriptlet与表达式元素
JSP网页最后会转译为Servlet类,转译后的Servlet类应该包括哪些类成员,方法声明或哪些语句,可以使用声明元素、Scriptlet元素及表达式元素来指定。