1.
JSP 注释的格式如下:
<%-- 在注释内容 --%>
HTML 注释的格式是
<!-- 注释内容 -->
2.
JSP 声明的格式如下:
<%! 声明部分 %>
3.
JSP 提供了一种输出表达式值的简单方法,输出表达式值的格式如下:
<%= 表达式 %>
4.
JSP 脚本
可通过Java 代码镶嵌在HTML 代码中,即使用JSP 脚本。
<table>
<%
for(int i=0;i<10;i++)
{
%>
<tr>
<td>循环</td>
<td><%=i %></td>
</tr>
<%
}
%>
</table>
5.
JSP 的编译指令是通知JSP 引擎的消息,它不直接生成输出。编译指令都有默认值,因此开发人员无须为每个指令设置值。
常见的编译指令有三个。
page: 该指令是针对当前页面的指令。
include: 用于指定如何包含另一个页面。
tablib: 用于定义和访问自定义标签。
编译指令的格式如下:
<%@ 编译指令名属性名="属性值" %>
1> page 指令,通常位于JSP 页面的顶端,对同一个页面可以有多个page 指令。
page指令的语法格式如下:
<%@page
[language="Java"]
[extends="package.class"]
[import= "package. class|package. *,…"]
[session=true|false"]
[buffer="none|8kb|size kb"]
[autoFlush="true|false"]
[isThread8afe="true|false"]
[info="text"]
[errorPage="relativeURL"]
[contentType=mimeType[;charset=characterSet]"|"text/html;charSet= ISO8859-1"]
[isErrorPage=" true|false"]
%>
下面依次介绍page 的各个属性。
language: 声明当前JSP 页面使用的脚本语言的种类,因为页面是JSP 页面,该属性的值通常都是java 。
extends: 确定JSP 程序编译时所产生的Java 类,需要继承的父类,或者需要实现的接口的全限定类名。
import: 用来导入包,下面几个包是默认自动导入的,不需要显式导入。默认导入的包有: java .lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet. http.*
session: 设定这个JSP 页面是否需要HTIP session 。
buffer: 指定输出缓冲区的大小。输出缓冲区的JSP 内部对象: out 用于缓存JSP页面对客户浏览器的输出,默认值为8kb,可以设置为none ,也可以设置为其他的值,单位为kb
autoFlush: 当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为true 时为正常输出:如果设置为false ,会在buffer 溢出时产生一个异常。
info: 设置该JSP 程序的信息,也可以看做其说明,可以通过Servlet. getServletInfo()方法获取该值。如果在JSP 页面中,可直接调用getServletInfo()方法获取该值,因为JSP 页面的实质就是Servlet 。
errorPage: 指定错误处理页面。如果本程序产生了异常或者错误,而该JSP 页面没有对应的处理代码,则会自动调用该指令所指定的JSP 页面。使用JSP 页面时,可以不处理异常,即使是checked 异常。
isErroePage: 设置本JSP 页面是否为错误处理程序。如果该页面本身己是错误处理页面,则无须使用errorPage 属性。
contentType: 用于设定生成网页的文件格式和编码方式,即MIME 类型和页面宇符集类型,默认的MIME 类型是textlhtml; 默认的字符集为ISO-8859-1 。
2> 使用include 指令,可以将一个外部文件嵌入到当前JSP 文件中,同时解析这个页面中的JSP 语句(如果有的话)。这是个静态的include 语旬,不会检查所包含JSP 页面的变化。
include 既可以包含静态的文本,也可以包含动态的JSP 页面。静态的编译指令include ,是将被包含的页面加入进来,生成一个完整的页面。
include 编译指令的语法:
<%@ include file="relativeURLSpec" %>
如果被嵌入的文件经常需要改变,建议使用<jsp:include>操作指令,因为它是动态的include 语句。
6.
JSP 动作指令主要有如下7 个。
jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。
jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用。
jsp:include: 用于动态引入一个JSP 页面。
jsp:plugin: 用于下载JavaBean 或Applet 到客户端执行。
jsp:useBean: 使用JavaBean 。
jsp:setProperty: 修改JavaBean 实例的属性值。
jsp:getProperty: 获取JavaBean 实例的属性值。
7.
useBean 的语法格式如下:
<jsp:useBean id="name" class="classname" scope="page|request|session|application" />
id 属性是JavaBean 的实例名, class 属性确定JavaBean 的实现类。
其中scope 属性用于确定JavaBean 实例的生存范围,该范围有以下四个值。
page: 该JavaBean 实例仅在该页面有效。
request: 该JavaBean 实例在本次请求有效。
session: 该JavaBean 实例在本次session 内有效。
application: 该JavaBean 实例在本应用内一直有效。
setProperty 的语法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" value="value"/>
其中name 属性确定需要设定JavaBean 的实例名; property 属性确定需要设置的属性名; value 属性则确定需要设置的属性值。
getProperty 的语法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" />
其中name'属性确定需要输出的JavaBean 的实例名; property 属性确定需要输出的属性名。
//将p1放入request 的生存范围
request. setAttribute ("p1" , p1) ;
//将p1放入session 的生存范围
session.setAttribute("p1" , p1);
//将p1放入applicatio口的生存范围
application. setAttribute ("p1" , p1) ;
8.
plugin 指令主要用于下载服务器端的JavaBean 或Applet 到客户端执行。由于程序在客户端执行,因此客户端必须安装虚拟机。
plugin 的语法格式如下:
<jsp:plugin
type="Bean|applet"
code="classFileName"
codebase="classFileDiretoryName"
[name="instanceName"]
[archive="URLtoArchive"]
[align= "bottom|top|middle|left|right"]
[heigh="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPiexels"]
[jreversion="JREVersionNumber|1.2"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]>
[<jsp:parames>
[jsp:param name="parameterName"value="parameterValue"I>]
</jsp:params>]
[<jsp:fallback>
text message for user that can no see the plugin
</jsp:fallback> ]
</jsp:plugin>
关于这些属性的说明如下。
type: 指定被执行的Java 程序的类型。
code: 指定被执行的文件名,该属性值必须以" .class" 扩展名结尾。
codebase: 指定被执行文件所在的目录。
name: 给该程序起一个名字用来标识该程序。
archive: 指向一些要预先载入的将要使用到的类的路径。
hspace,vspace: 显示左右,上下的留白。
jreversion: 能正确运行该程序必需的JRE 版本,默认值是1.2
nsplugin,ieplugin: Netscape Navigator, Internet Exploer 下载运行所需JRE 的地址。
<jsp:fallback>指令:当不能正确显示该Applet 时,代替显示的提示信息。
9.
param 指令用于设置参数值,这个指令本身不能单独使用,因为单独的Param 指令没有实际意义。
pararn 指令可以与以下三个指令结合使用:
jsp:include 当与include 指令结合使用时, pararn 指令用于将参数值传入被导入的页面
jsp:forward 当与forward 指令结合使用时, pararn 指令用于将参数值传入被转向的页面
jsp:plugin 当与plugin 指令结合使用时,则用于将参数传入页面中的JavaBean 实例或Applet 实例。
pararn 指令的语法格式如下:
<jsp:param name="pararnName" value="paramValue"/>
10.
JSP 的9 个内置对象
1> application: javax.servlet. ServletContext 的实例,该实例代表JSP 所属的Web 应用本身,可用于JSP 页面,或者Servlet 之间交换信息。
常用的方法有
getAttribute(String attName) , setAttribute(String attName , String attValue) 和getInitParameter(String paramName)等。
2> config: javax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。
常用的方法有
getInitParameter(String paramName) 及getInitParameternames() 等方法。
事实上, JSP 页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet 中有效。
3> exception: java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。
常用的方法有getMessage()和printStackTrace()等。
4> out: javax.servlet.jsp.JspWriter 的实例,该实例代表JSP 页面的输出流,用于输出内容,形成HTML 页面。
5> page: 代表该页面本身,通常没有太大用处。也就是Servlet 中的this ,其类型就是生成的Servlet 。
6> pageContext: javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据。
在设置属性时,如果没有指定属性存在的范围,则属性默认在page 范围内,如果指定了属性所在的范围,则属性可以被存放在application, session, request 等范围中。
常用的方法有
getServletContext()和getServletConfig()等。
7> request: javax.servlet.http:HttpServletRequest 的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。
常用的方法有
getParameter(String paramName), getParameterValues(String paramName), setAttribute(String atttibuteName,Object attributeValue),
getAttribute(String attributeName)和setCharacterEncoding(String env)等。
8> response: javax.servlet.http.HttpServletResponse 的实例,代表服务器对客户端的响应。通常,也很少使用该对象直接响应,输出响应使用out 对象,而response 对象常用于重定向。重定向会丢失所有的请求参数及请求属性。
常用的方法有
sendRedirect(java.lang.String location)等。
9> session: javax.servlet.http.HttpSession 的实例,该对象代表一次会话。从客户端浏览器与站点建立连接起,开始会话,直到关闭浏览器时结束会话。
session 通常用于跟踪用户的会话信息,如判断用户是否登录系统,或者在购物车应用中,系统是否跟踪用户购买的商品等。 session 里的属性可以在多个页面的跳转之间共享。一旦关闭浏览器,即session 结束, session 里的属性将全部清空。
常用的方法有:
getAttribute(String attName) 返回一个session 属性的值, setAttribute(String attName, String attValue) 设置一个session 属性。
11.
Servlet ,通常称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求。
Servlet 是个特殊的Java 类,这个Java 类必须继承HttpServlet 。每个Servlet 可以响应客户端的请求。Servlet 提供不同的方法用于响应客户端请求。
doGet: 用于响应客户端的get 请求。
doPost: 用于响应客户端的post 请求。
doPut: 用于响应客户端的put 请求。
doDelete: 用于响应客户端的delete 请求。
HttpServlet 还包含两个方法。
init(ServletConfig config): 创建Servlet 实例时,调用的初始化方法。
destroy(): 销毁Servlet 实例时,自动调用的资源回收方法。
通常无须重写init()和destroy()两个方法,除非需要在初始化Servlet 时,完成某些资源初始化的方法,才考虑重写init 方法。如果重写了init(ServletConfig config)方法,则应在重写该方法的第一行调用super.init(config) 。该方法将调用HttpServlet 的init 方法。
如果需要在销毁Servlet 之前,先完成某些资源的回收,比如关闭数据库连接等,才需要重写destroy 方法。
12.
配置Servlet 需要配置两个部分。
配置Servlet 的名字:对应web.xml 文件中的<servlet/>元素。
配置Servlet 的URL: 对应web.xrnl 文件中的<servlet-mapping/>元素。
FirstServlet 的配置如下:
<!-- 配置Servlet 的名字 -->
<servlet>
<!--指定Servlet 的名字-->
<servlet-name>firstServlet</servlet-name>
<!-- 指定Servlet 的实现类-->
<servlet-class>lee.FirstServlet</servlet-class>
</servlet>
<!--配置Servlet 的URL-->
<servlet-mapping>
<!--指定Servlet 的名字-->
<servlet-name>firstServlet</servlet-name>
<!--指定Servlet 映射的URL地址-->
<url-pattern>/firstServlet</url-pattern>
</servlet-rnapping>
13.
Servlet 在容器中运行,其实例的创建及销毁等都不是由程序员决定的,而是由容器进行控制。
Servlet 的创建有两个选择。
客户端请求对应的Servlet 时,创建Servlet 实例大部分的Servlet 都是这种Servlet 。
Web 应用启动时,立即创建Servlet 实例:即load-on-startup Servlet 。
每个Servlet 的运行都遵循如下生命周期。
(1)创建Servlet 实例。
(2) Web 容器调用Servlet 的init 方法,对Servlet 进行初始化。
(3) Servlet 初始化后,将一直存在于容器中,用于响应客户端请求。如果客户端有get 请求,容器调用Servlet 的doGet 方法处理并响应请求。对于不同的请求,有不同的处理方法,或者统一使用service 方法处理来响应用户请求。
(4) Web 容器角色销毁Servlet 时,调用Servlet 的destroy 方法,通常在关闭Web容器之时销毁Servlet。
怎么把servlet设置成load-on-startup servlet
<servlet>
<! -- Servlet--〉
<servlet-name>timerServlet</servlet-name>
<!-- Servlet 的实现类--〉
<servlet-class>lee.TimerServlet</servlet-class>
<!-- 配置应用启动时,创建Servlet 实例-->
<load-on-startup>1</load-on-startup>
</servlet>
14.
实现自定义标签按如下步骤进行:
(1)开发自定义标签处理类;
自定义标签类都必须继承一个父类: javax.Servlet.jsp.tagext.TagSupport 。
如果标签类包含属性,每个属性都有对应的getter()和setter()方法。
重写doStartTag()或doEndTag()方法,这两个方法生成页面内容。
如果需要在销毁标签之前完成资源回收,则重写re1ease()方法。
(2)建立一个*.t1d 文件,每个*.t1d 文件对应一个标签库,每个标签库对应多个标签;
标签库定义文件的根元素是taglib,它可以有多个tag 子元素,每个tag 子元素都对应一个标签。
<taglib>
<!-- 定义标签库版本 -->
<tlib-version>1.0</tlib-version>
<!-- 定义jsp版本 -->
<jsp-version>1.2</jsp-version>
<!-- 配置第一个标签 -->
<tag>
<!-- 配置标签名 -->
<name>helloworld</name>
<!-- 确定标签的处理类 -->
<tag-class>tag.HelloWorldTag</tag-class>
<!-- 确定标签的标签体,标签体为空 -->
<body-content>empty</body-content>
</tag>
</taglib>
(3)在web.xm1文件中增加自定义标签的定义;
在web.xml 文件中定义标签库时使用taglib 元素,该元素包含两个子元素: taglib-uri和taglib-location,前者确定标签库的URI; 后者确定标签库定义文件的位置。
<jsp-config>
<taglib>
<!-- 确定标签库的URI -->
<taglib-uri>/tags/myTag.tld</taglib-uri>
<!-- 确定标签库定义文件的位置 -->
<taglib-location>/WEB-INF/myTag.tld</taglib-location>
</taglib>
</jsp-config>
(4) 在JSP 文件中使用自定义标签;
使用标签库分成以下两步。
(1)导入标签库:使用taglib 编译指令导入标签。
taglib 的语法格式如下:
<%@ taglib uri= "/tags/myTag.tld" prefix="myTag"%>
(2) 使用标签:在JSP 页面中使用自定义标签。
使用标签的语法格式如下:
<myTag:tagName tagAttribute="tagValue">
<tagBody/>
</myTag>
15.
带标签体的标签,就是允许在标签内嵌套标签,通常可用于完成一些逻辑运算例如判断和循环等。
带标签体的标签需要继承BodyTagSupport,该类包含一个bodyContent 属性,该属性代表标签体。
BodyTagSupport 还包含两个方法。
doAfterBody(): 每次处理完标签体后调用该方法。
void doInitBody(): 开始调用标签体时调用该方法。
16.
在处理标签类的各个方法中,不同的返回值对应不同的含义,常用的返回值有如下几个。
SKIP_BODY: 不处理标签体,直接调用doEndTag()方法。
SKIP_PAGE: 忽略标签后面的JSP 页面。
EVAL_PAGE: 处理标签结束,直接处理页面内容。
EVAL_BODY_BUFFERED: 处理标签体。
EVAL_BODY_INCLUDE: 处理标签体,但忽略setBodyContent()和doInitBody()方法。
EVAL_BODY_AGAIN: 对标签体循环处理。
17.
Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
Filter 有如下几个用处。
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest,根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse,根据需要检查HttpServletResponse,也可以修改HttpServletResponse 头和数据。
Filter 有如下几个种类。
用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。
日志Filter: 详细记录某些特殊的用户请求。
负责解码的Filter: 包括对非标准编码的请求解码。
能改变XML 内容的XSLTFilter 等。
一个Filter 可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。
创建一个Filter 只需两个步骤:
(1)创建Filter 处理类,
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
void init(FilterConfig config): 用于完成Filter 的初始化。
void destroy(): 用于Filter 销毁前,完成某些资源的回收。
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
(2) 在web.xml 文件中配置Filter.
Filter 的配置和Servlet 的配置非常相似,都需要配置两个部分:
1.配置Filter 名。
2.配置Filter 拦截URL 模式。
区别在于, Servlet 通常只配置一个URL ,而Filter 可以同时拦截多个请求的URL。因此,可以配置多个Filter 拦截模式。
<!-- 定义Filter -->
<filter>
<!-- Filter的名字 -->
<filter-name>log</filter-name>
<!-- Filter的实现类 -->
<filter-class>filters.LogFilter</filter-class>
</filter>
<!-- 定义Filter拦截地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>log</filter-name>
<!-- Filter负责拦截的URL -->
<servlet-name>*</servlet-name>
</filter-mapping>
18.
Listener 的作用非常类似于load-on-startup Servlet。用于在Web 应用启动时,启动某些后台程序,这些后台程序负责为系统运行提供支持。
Listener 与load-on-startup Servlet 的区别在于: Listener 的启动时机比load-on-startup Servlet早,只是Listener 是Servlet 2.3 规范之后才出现的。
使用Listener 只需要两个步骤:
(1)创建Listener 实现类。
创建Listener 类必须实现ServletContextListener 接口,该接口包含两个方法。
contextInitialized(ServletContextEvent see): 启动Web 应用时,系统调用该Filter的方法。
contextDestroyed(ServletContextEvent see): 关闭Web 应用时候,系统调用Filter的方法。
(2) 在web.xml 文件中配置Listener。
正如load-an-startup Servlet 一样, Listener 用于启动Web 应用的后台服务程序,但不负责处理及响应用户请求,因此无须配置URL。
若将Listener 配置在Web 容器中(如果Web 容器支持Listener),则Listener 将随Web 应用的启动而启动。
<!-- 配置listener -->
<listener>
<!-- 指定listener实现类 -->
<listener-class>listener.Listener_test</listener-class>
</listener>