|
JSP2 特性
1、JSP 2 主要增加了如下的新特性:
·直接配置JSP属性。
·表达式语言
·简化自定义标签API
·Tag文件语法。
2、如需使用JSP2语法,其web.xml文件必须使用Servlet2.4以上版本的配置文件。Servlet2.4以上版本的配置文件的根元素写法如下:
<?xml version=”1.0”, encoding=”GBK”?>
<!-- 不再使用DTD,而是使用schema描述,版本也升级为2.4 -->
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlhs:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4”>
...
</web-app>
3、使用<jsp-property-group/>子元素配置JSP属性,主要包括如下4个方面:
·是否使用表达式语言:使用<el-ignored/>元素指定,默认值为false,即允许使用表达式语言。
·是否允许使用JSP脚本: 使用<scriping-invalid>子元素确定,默认值为false,即允许使用JSP脚本。
·声明JSP页面的编码:使用<page-encoding/>元素指定,配置该元素后,可以替代每个页面里的page指令contentType属性的charset部分。
·使用隐式包含:使用<include-prelude/>和<include-coda/>元素确定,可以替代每个页面里使用include编译命令来包含页面。
4、配置样例:
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 关于JSP的配置信息 -->
<jsp-config>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>/noscript/*</url-pattern>
<!-- 忽略表达式语言 -->
<el-ignored>true</el-ignored>
<!-- 页面编码的字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 不允许使用Java脚本 -->
<scripting-invalid>true</scripting-invalid>
<!-- 隐式导入页面头 -->
<include-prelude>/inc/top.jspf</include-prelude>
<!-- 隐式导入页面尾 -->
<include-coda>/inc/bottom.jspf</include-coda>
</jsp-property-group>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 允许使用Java脚本 -->
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>/inc/*</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 不允许使用Java脚本 -->
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
<context-param>
<param-name>author</param-name>
<param-value>yeeku</param-value>
</context-param>
</web-app>
5、表达式语言(Expression Language)是一种简化的数据访问方式。使用表达式语言可以方便地访问JSP的隐含对象和JavaBeans组件,在JSP2规范中,建议尽量使用表达式语言使JSP文件的格式一致,避免使用Java脚本。
6、表达式语言语法格式:
${expression}
7、表达式语言支持算术运算符:
表达式语言
计算结果
${1}
1
${1.2 + 2.3}
3.5
${1.2E4 + 1.4}
12001.4
${-4-2}
-6
${21 * 2}
42
${3/4}
0.75
${3 div 4}
0.75
${3/0}
Infinity
${10%4}
2
${10 mod 4}
2
${(1 == 2) ? 3 : 4}
4
表达式语言会将所有数值视作浮点数处理。
8、表达式语言支持逻辑运算符:
表达式语言
计算结果
数字之间的比较
${1 < 2}
true
${1 lt 2}
true
${1 > (4/2)}
false
${1 gt (4/2)}
false
${4.0 >= 3}
true
${4.0 ge 3}
true
${4 <= 3}
false
${4 le 3}
false
${100.0 == 100}
true
${100.0 eq 100}
true
${(10*10) != 100}
false
${(10*10) ne 100}
false
字符之间的比较
${‘a’ < ‘b’}
true
${‘hip’ > ‘hit’
false
${‘4’ > 3}
true
表达式语言中,字符串的比较是根据UNICODE值来比较大小的。
9、表达式语言包含的11个内置对象:
·pageContext:代表页面的pageContext对象,与JSP的PageContext内置对象相同。
·pageScope:用于获取page范围内的属性值。
·requestScope:用于获取request范围内的属性值。
·sessionScope:用于获取session范围内的属性值。
·applicationScope:用于获取application范围内的属性值。
·param:用于获取请求的参数值。
·paramValues:用于获取请求的参数值,与param的区别在于,该对象用于获取属性值为数组的属性值。
·header:用于获取请求头的属性值。
·headerValues:用于获取请求头的属性值,与header的区别在于,该对象用于获取属性值为数组的属性值。
·initParam:用于获取请求web应用的初始化参数。
·cookie:用于获取指定的cookie值。
10、表达式语言除了可以使用基本运算符外,还可以使用自定义函数。通过自定义函数,能够大大加强表达式语言的功能。自顶一个函数的开发步骤非常类似于标签的开发步骤,定义方式也几乎一样。区别在于自定义标签直接在页面上生成输出,而自定义函数则在表达式语言中使用。
11、函数功能大大扩充了EL的功能,EL本身只是一种数据访问语言,因此它不支持调用方法。如果需要在EL中进行更复杂的处理,就可以通过函数来完成。函数的本质是:提供一种语法允许在EL中调用某个类的静态方法。
12、开发自定义函数步骤:
① 开发函数处理类:函数处理类就是普通类,这个普通类中包含若干个静态方法,每个静态方法都可以定义成一个函数。实际上这个步骤也是可省略的——完全可以直接使用JDK或其他项目提供的类,只要这个类包含静态方法即可。
② 使用标签库定义函数:定义函数的方法与定义标签的方法大致类似。在<taglib../>子元素下增加<tag..>元素用于定义自定义标签;增加<functions.../>元素则用于定义自定义函数。每个<function...>元素只要三个子元素即可:
·name:指定自定义函数的函数名。
·function-class:指定自定义函数的处理类。
·function-signature:指定自定义函数对应的方法。
样例如下:
<taglib>
...
<function>
<name> reverse </name>
<function-class>
lee.Functions
</function-class>
<function-signature>
java.lang.String
reverse(java.lang.String)
</function-signature>
</function>
...
</taglib>
③ 在JSP页面的EL中使用函数:一样需要先导入标签库,然后在使用函数:
<%@ taglib prefix=”crazyit”
uri=”http://www.crazyit.org/tags” %>
${crazyit: reverse(param[“name”]}
13、Tag File 是自定义标签的简化用法,使用Tag File可以无需定义标签处理类和标签库文件,但任然可以在JSP页面中使用自定义标签。
14、利用Tag File开发自定义标签的步骤:
① 建立Tag 文件。在JSP所支持Tag File的规范下,Tag File 代理了标签处理类,它的格式类似于JSP文件。可以这样理解:如果JSP可以代替Servlet的表现层一样,Tag File则可以代替标签处理类。
Tag File 具有以下5个编译命令。
·taglib:作用与JSP文件中的taglib指令效果相同,用于导入其他标签库。
·include:作用与JSP文件中的include指令效果相同,用于导入其他JSP或静态页面。
·tag:作用类似于JSP文件中的page指令,有pageEncoding、body-content等属性,用于设置页面编码等属性。
·attribute:用于设置自定义标签的属性,类似于自定义标签处理器类中的标签属性。
·variable:用于设置自定义标签的变量,这些变量传给JSP页面使用。
样例:
<%@ tag pageEncoding="GBK" import="java.util.List"%>
<!-- 定义了四个标签属性 -->
<%@ attribute name="bgColor" %>
<%@ attribute name="cellColor" %>
<%@ attribute name="title" %>
<%@ attribute name="bean" %>
<table border="1" bgcolor="${bgColor}">
<tr>
<td><b>${title}</b></td>
</tr>
<%List<String> list = (List<String>)
request.getAttribute("a");
//遍历输出list集合的元素
for (Object ele : list){%>
<tr>
<td bgcolor="${cellColor}">
<%=ele%>
</td>
</tr>
<%}%>
</table>
tag File的命名规则是:tagName.tag,即文件名就是标签名,文件名的后缀必须是tag。该文件放置在web应用的某个路径下,这个路径相当于标签库的URI名。
② 在页面中使用自定义标签时,需要先导入标签库,再使用标签。使用Tag File标签与普通自定义标签的用法完全相同,只是在导入标签库时存在一些差异。格式如下:
<%@ taglib prefix=”tags” tagdir=”/WEB-INF/tags” %>
<tags:iterator bgColor=”#99dd99” cellColor=”#9999cc”
title=”Iterator Tag” bean=”a” />
15、Tag File 支持的内置对象:
·request:与JSP脚本中的request对象对应。
·response:与JSP脚本中的response对象对应。
·session:与JSP脚本中的session对象对应。
·application:与JSP脚本中的config对象对应。
·config:与JSP脚本中的config对象对应。
·out:与JSP脚本的out对象对应。
Servlet 3.0 新特性
1、伴随着Java EE 6一起发布的Servlet 3.0 规范是Servlet规范历史上最重要的变革之一,它的许多特性都极大地简化了Java Web 的开发。
2、Servlet 3.0 的一个显著改变是“顺应”了潮流,抛弃采用web.xml配置Servlet、Filter、Listener的繁琐步骤,允许开发人员使用Annotation修饰它们,从而进行部署。
3、Servlet 3.0 规范在javax.servlet.annotation包中提供了如下的Annotation:
@WebServlet:用于修饰一个Servlet 类, 用于部署Servlet 类。
@WebInitParam:用于与@WebServlet或@WebFilter一起使用,为Servlet、Filter配置参数。
@WebListener:用于修饰Listener类,用于部署Listener类。
@WebFilter:用于修饰Filter类,用于部署Filter类。
@MultipartConfig:用于修饰Servlet,指定该Servlet将会负责处理multipart/form-data类型的请求(主要用于文件上传)。
@ServletSecurity:这是一个与JAAS有关的Annotation,修饰Servlet指定该Servlet的安全与授权控制。
@HttpConstraint:用于与@ServletSecurity一起使用,用于指定该servlet的安全与授权控制。
@HttpMethodConstraint:用于与@ServletSecuity一起使用,用于指定该Servlet的安全与授权控制。
4、Servlet 3.0 为模块化开发提供了良好的支持,Servlet 3.0 规范不再要求所有的Web组件都部署在web.xml文件中,而是允许采用“Web 模块”来部署、管理他们。
5、一个Web模块通常对应与一个JAR包,这个JAR包有如下的文件结构:
<webModule>.jar
|----META-INF
| |----web-fragment.xml
|----Web模块所用的类文件、资源文件等。
Web模块文件与普通的JAR的最大区别在于需要在META-INF目录下添加一个web-fragment.xml文件,这个文件也被称为Web模块部署描述符。
6、web-fragment.xml文件与web.xml文件的作用、文档结构都基本相似。但web-fragment.xml文件可以多指定如下两个元素:
·<name.../>:用于指定该Web模块名称。
·<ordering.../>:用于指定加载该Web模块的相对顺序。
7、样例:
<?xml version="1.0" encoding="GBK"?>
<web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" version="3.0">
<!-- 指定该Web模块的唯一标识 -->
<name>crazyit</name>
<listener>
<listener-class>lee.CrazyitListener</listener-class>
</listener>
<ordering>
<!-- 用配置该Web模块必须位于哪些模块之前加载 -->
<before>
<!-- 用于指定位于其他所有模块之前加载 -->
<others/>
</before>
</ordering>
</web-fragment>
8、将Web模块打包成JAR包后,放置在任意一个Web应用中的WEB-INF/lib目录下,启动Web应用,Web模块就会被加载。
9、Web应用除了可以按照web-fragment.xml文件指定的顺序来加载Web模块之外,还可以通过web.xml文件指定加载的绝对顺序,这将覆盖web模块中web-fragment.xml文件指定的顺序。如下:
<absolute-ordering>
<!-- 指定Web模块按照如下顺序加载 -->
<name> leegang </name>
<name> crazyit</name>
</absolute-ordering>
10、Servlet的Web模块支持为模块化开发、框架使用提供了巨大的方便,例如需要在Web应用中使用Web框架,这就只要将该框架的JAR包赋值到Web应用中即可。因为这个JAR包的META-INF目录下可以通过web-fragment文件来配置该框架所需的Servlet、Listener、Filter等,从而避免修改Web应用的web.xml文件。
11、Servlet 3.0 规范引入了异步处理,使得Servlet 可以重新发起一条新线程去调用耗时的业务方法,这样就可以避免等待。
12、通过AsyncContext类来处理异步过程,Servlet可通过ServletRequest的如下两个方法开启异步调用、创建AsyncContext对象:
·AsyncContext startAsyncContext();
·AsyncContext startAsync(ServletRequest, ServletResponse);
重复调用上面的方法将得到同一个AsyncContext对象,该对象代表异步处理的上下文,它提供了一些工具方法,可以完成设置异步调用的超时时长,dispatch用于请求、启动后台过程获取request、response对象等功能。
13、对于需要启用异步调用的Servlet而言,开发者必须显式指定开启异步调用,有两种方式:
·为@WebServlet指定asyncSupported = true.
·在web.xml文件的<servlet.../>元素增加<async-supported.../>子元素
14、当Servlet启用异步调用的线程之后,该线程的执行过程对开发者是透明的。但在有些情况下,开发者需要了该异步线程的执行细节,并针对特定的执行结果进行针对性处理,这可借助于Servlet 3.0 提供的异步监听器来实现。
15、异步监听器需要实现AsyncListener接口,实现该接口的监听器类需要实现如下4个方法。
·onStratAsync(AsyncEvent event):当异步调用开始时触发该方法。
·onComplete(AsyncEvent event):当异步调用完成时触发该方法。
·onError(AsyncEvent event):当异步调用出错时,触发该方法。
·onTimeout(AsyncEvent event):当异步调用超时时,触发该方法。
16、提供异步监听器之后,还需要通过AsyncContext来注册监听器,调用该对象的addListener()方法即可注册监听器:
actx.addListener(new MyAsyncListener());
17、Filter和Servlet具有很大的相似性,因此,Servlet 3.0 规范完全支持Filter中使用异步调用,在Filter中进行异步调用与在Servlet中进行异步调用的效果完全相似。
18、Servlet 3.0 改进了部分API,这种改进很好地简化了Java Web开发。其中两个较大的改进是:
·HttpServletRequest增加了对文件上传的支持
·ServletContext允许通过编程的方式注册Servlet、Filter。
19、HttpServlet提供了如下两个方法来处理文件上传
·Part getPart(String name):根据名称来获取文件上传域。
·Collection<Part> getParts():获取所有的文件上传域。
每个Part对象对应与一个文件上传域,该对象提供了大量方法来访问上传文件的文件类型、大小、输入流等,并提供一个write(String file)方法将上传文件写入服务器磁盘。
20、为了向服务器上传文件,需要在表单里使用<input type=”file”.../>的文件域,这个文件域会在HTML页面上产生一个单行文本框和一个“浏览”按钮,浏览者可通过该按钮选择需要上传的文件。除此之外,上传文件一定要为表单域设置enctype属性。
21、表单的enctype属性指定的是表单数据的编码方式,该属性有如下三个值:
·application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
·multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
·text/plain:这种编码方式当表单的action属性为mailto:url的形式比较方便,这种方式主要适用于这届通过表单发送邮件的方式。
如果将enctype属性设定为:application/x-www-form-unrencoded,或不设置enctype属性,提交表单时只会发送文件域的文本框里的字符串,也就是浏览者所选择文件的绝对路径,对服务器获取该文件在客户端上的绝对路径没有任何作用,因为服务器不可能访问客户机的文件系统:
<form method=”post” action=”upload” enctype=”multipart/form-data”>
文件名: <input type=”text” id=”name” name=”name” /> <br/>
选择文件:<input type=”file” id=”file” name=”file”/><br/>
<input type=”submit” value=”上传” /> <br/>
</form>
22、上传文件Servlet端代码:
String fileName = request.getParameter(“name”);
Part part = request.getPart(“file”);
part.write(getServletContext().getRealPath(“/uploadFiles”)
+ “/” + fileName);
Servlet类需要使用@MultipartConfig来修饰。或者在web.xml中添加<multi part-config.../>子元素进行配置。
23、ServletContext提供了如下方法来动态地注册Servlet:
·多个重载的addServlet:动态地注册Servlet。
·多个重载的addFilter:动态地注册Filter。
·多个重载的addListener:动态地注册Listener。
·setInitParameter(String name, String value);
程序猿的技术大观园:www.javathinker.net
|
|