>>分享Java Web开发技术,并且对孙卫琴的《Tomcat与Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23844 个阅读者 刷新本主题
 * 贴子主题:  JSP2和Servlet3的一些新特性 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2018-08-22 06:17:34     消息  查看  搜索  好友  邮件  复制  引用

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
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=502

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员