- 浏览: 308338 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lzz3717845:
有道理,受教了~谢谢
关于SQL中自动增长列值回复(还原)的问题 -
桃汁天天:
ExtJs中如何动态设置其选中状态!! -
sangumaolv2:
你TM在说什么啊。。。。
关于SQL中自动增长列值回复(还原)的问题 -
duyupeng:
你好,我最近也是在使用这个控件,只是用了_id、_parent ...
ExtJs 中的TreeGrid(Ext.ux.maximgb.tg.EditorGridPanel详解与其他问题解决办法) -
wokao_wg:
大伙可以看看作者说的http://www.sencha.com ...
ExtJs 中的TreeGrid(Ext.ux.maximgb.tg.EditorGridPanel详解与其他问题解决办法)2
Servlet 3.0 新特性概览
1.Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;
2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置。
3.Servlet异步处理,应对复杂业务处理;
4.异步Listener,对于异步处理的创建、完成等进行监听;
5. 文件上传API简化;
tomcat 7.0.X 支持Servlet 3.0
一、Annotation支持
1.Servlet
原本Servlet开发完后,必须在web.xml中配置如下代码:
<servlet> <servlet-name></servlet-name> <servler-class></servlet-class> <load-on-startup></load-on-startup> <init-param> <param-name></param-name> <param-value></param-value> </init-param> </servlet> <servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping>
现在只需要在java源文件的Servlet类前面加上:
@WebServlet(name="",urlPatterns={""},initParams={@WebInitParam(name="",value=""),loadOnStartup=1})
public class FirstServlet extends HttpServlet{}
代码示例:
实现一个最简单的Servlet。
package org.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; /* name == <servlet-name> urlPatterns == <url-pattern>, loadOnStartup == <load-on-startup> initParam == <init-param> name == <param-name> value == <param-value> */ @WebServlet(name="HelloServlet" ,urlPatterns={"/HelloServlet"},loadOnStartup=1, initParams={ @WebInitParam(name="name",value="xiazdong"), @WebInitParam(name="age",value="20") }) public class HelloServlet extends HttpServlet{ public void init(ServletConfig config)throws ServletException{ super.init(config); } public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ request.setCharacterEncoding("GBK"); ServletConfig config = getServletConfig(); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("Hello world"+"<br />"); out.println(config.getInitParameter("name")); out.println("</body>"); out.println("</html>"); } }
这样的话只需要将class文件放入WEB-INF\classes 中,不需要再web.xml中作任何改动就完成部署;
2.Filter
原本Filter的配置如下:
<filter> <filter-name></filter-name> <filter-class></filter-class> <filter> <filter-mapping> <filter-name></filter-name> <url-pattern></url-pattern> </filter-mapping>
现在只需要在java源文件的Filter类前面加上
@WebFilter(filterName="",urlPattern={"/"});
3.Listener
原本在web.xml中配置如下:
<listener> <listener-class></listener-class> </listener>
现在只需要在java源文件的Listener类前面加上@WebListener即可;
二、web模块化
原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件,这个配置文件的名称为 web-fragment.xml ;
制作一个Servlet模块的步骤:
1.编写Servlet,并编译;
2.将此编译class文件及所在包通过jar包命令打成jar包;
3.将此jar包用winrar打开,并将其中的META-INF中的manifest删除并添加 web-fragment.xml;
4.将此jar包放入WEB-INF\lib中即可;
web-fragment.xml注意点:
1.根元素为<web-fragment>;
2.<name></name>表示模块名称;
3.<ordering></ordering>是此模块的加载顺序;
4.<before><others/></before>表示第一个加载;
5.<after><name>A</name></after>表示比A后面加载;
6.可以在里面部署listener、filter、servlet
当然可以不设置任何的模块加载顺序;
代码示例:
配置两个listener模块;
FirstListener.java
package org.listener; import javax.servlet.annotation.*; import javax.servlet.http.*; import javax.servlet.*; import java.util.*; import java.sql.*; import javax.naming.*; public class FirstListener implements ServletRequestListener{ public void requestInitialized(ServletRequestEvent event){ System.out.println("FirstListener created"); } public void requestDestroyed(ServletRequestEvent event){ System.out.println("FirstListener destroyed"); } }
FirstListener 的 web-fragment.xml内容:
<?xml version="1.0" encoding="ISO-8859-1"?> <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 <A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <name>FirstListener</name> <listener> <listener-class>org.listener.FirstListener</listener-class> </listener> <ordering> <before> <others/> </before> </ordering> </web-fragment>
SecondListener.java
package org.listener; import javax.servlet.annotation.*; import javax.servlet.http.*; import javax.servlet.*; import java.util.*; import java.sql.*; import javax.naming.*; public class SecondListener implements ServletRequestListener{ public void requestInitialized(ServletRequestEvent event){ System.out.println("SecondListener created"); } public void requestDestroyed(ServletRequestEvent event){ System.out.println("SecondListener destroyed"); } }
SecondListener的 web-fragment.xml内容是:
<?xml version="1.0" encoding="ISO-8859-1"?> <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 <A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <name>SecondListener</name> <listener> <listener-class>org.listener.SecondListener</listener-class> </listener> <ordering> <after> <name>FirstListener</name> </after> </ordering> </web-fragment>
然后分别打成jar包,放入 WEB-INF\lib中即可;
随便访问一个web应用,然后发现 tomcat控制台输出:
看出先加载FirstListener,再加载SecondListener;
三、Servlet 异步处理
Servlet在MVC中作为控制器,控制器负责分发任务给MODEL完成,然后把结果交给JSP显示;
而如果有许多MODEL,其中有一个MODEL处理时间很长,则会导致整个页面的显示很慢;
异步处理关键点:将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面;
一句话:先显示一部分,再显示一部分;
异步处理Servlet的注意点是:
1.需要在Annotation中注明 asyncSupported=true;
package org.sync; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.*; @WebServlet(name="AsyncServlet",urlPatterns={"/AsyncServlet"},asyncSupported=true) public class AsyncServlet extends HttpServlet{ public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("====页面开始====<hr />"); AsyncContext actx = request.startAsync(); actx.setTimeout(30*3000); actx.start(new MyThread(actx)); out.println("====页面结束====<hr />"); out.println("</body>"); out.println("</html>"); out.flush(); } } class MyThread implements Runnable{ private AsyncContext actx; public MyThread(AsyncContext actx){ this.actx = actx; } public void run(){ try{ Thread.sleep(5*1000); //消耗5秒 actx.dispatch("/1.jsp"); } catch(Exception e){} } }
1.jsp
<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" session="false"%> <html> <body> <% out.println("======复杂业务方法===="); %> </body> </html>
四、异步监听器
异步监听器用来监听异步处理事件;即“三”中讲到的知识点;
此监听器类似于ServletContextListener的机制;
只需要实现AsyncListener接口即可;
此接口有4个方法:
public void onStartAsync(AsyncEvent event)throws IOException;
public void onComplete(AsyncEvent event);
public void onTimeout(AsyncEvent event);
public void onError(AsyncEvent event);
以下是监听器实现的代码:
package org.listener; import javax.servlet.annotation.*; import javax.servlet.http.*; import javax.servlet.*; import java.util.*; import java.sql.*; import javax.naming.*; import java.io.*; public class MyListener implements AsyncListener{ public void onStartAsync(AsyncEvent event)throws IOException{} public void onComplete(AsyncEvent event){ System.out.println("-----------------------Complete"); } public void onTimeout(AsyncEvent event){ } public void onError(AsyncEvent event){} }
在Servlet异步处理处添加:
actx.addListener(new MyListener());就可以添加监听器,每当异步处理完成时就会触发onComplete()事件,输出Complete;
五、文件上传改进API
原本文件上传时通过 common-fileupload或者SmartUpload,上传比较麻烦,在Servlet 3.0 中不需要导入任何第三方jar包,并且提供了很方便进行文件上传的功能;
注意点:
1. html中 <input type="file">表示文件上传控件;
2. form的 enctype="multipart/form-data";
3.在Servlet类前加上 @MultipartConfig
4.request.getPart()获得;
下面是一个文件上传的例子:
upload.html
<html> <body> <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" id="file" name="file"/> <input type="text" id="name" name="name"/> <input type="submit" value="提交"/> </form> </body> </html>
UploadServlet.java
package org.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name="UploadServlet" ,urlPatterns={"/upload"}) @MultipartConfig public class UploadServlet extends HttpServlet{ public void init(ServletConfig config)throws ServletException{ super.init(config); } public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ Part part = request.getPart("file"); PrintWriter out = response.getWriter(); out.println("此文件的大小:"+part.getSize()+"<br />"); out.println("此文件类型:"+part.getContentType()+"<br />"); out.println("文本框内容:"+request.getParameter("name")+"<br />"); out.println(UploadUtil.getFileName(part)+"<br />"); part.write("F:\\1."+UploadUtil.getFileType(part)); } }
UploadUtil.java
由于在Servlet 3.0中很难获取上传文件的类型,因此我写了两个工具类,可以方便开发;
/** * 此工具类只适用于Servlet 3.0 * 为了弥补 Servlet 3.0 文件上传时获取文件类型的困难问题 * * @author xiazdong */ import javax.servlet.http.*; public class UploadUtil{ public static String getFileType(Part p){ String name = p.getHeader("content-disposition"); String fileNameTmp = name.substring(name.indexOf("filename=")+10); String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\"")); return type; } public static String getFileName(Part p){ String name = p.getHeader("content-disposition"); String fileNameTmp = name.substring(name.indexOf("filename=")+10); String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\"")); return fileName; } }
发表评论
-
P6Spy应用:Hibernate显示真正SQL(3)
2012-08-03 18:44 1237更改p6spy.jar中的以下文件即可控制FileLogger ... -
P6Spy应用:Hibernate显示真正SQL(2)
2012-08-03 18:14 1447下表列出了 spy.properties 配置文件 ... -
P6Spy应用:Hibernate显示真正SQL(1)
2012-08-03 18:05 1633P6 ... -
ResultSet用法集锦
2012-02-23 16:56 139743ResultSet用法集锦 结 ... -
ResultSet 参数設置使用實例
2012-02-23 14:32 1156public static String[][] ... -
可供参考的【数据库连接池(DBCP)】2
2012-02-10 12:01 1004import java.sql.Connection; ... -
可供参考的【数据库连接池(DBCP)】
2012-02-10 10:10 1019package com.spring.test; ... -
类型检查(RTTI与反射机制)转载
2012-02-02 10:35 1142... -
如何在web.xml文件中引入其他的xml文件(web.xml如何拆分)
2011-11-14 20:08 8105如何在web.xm ... -
URL的Encoder、Decoder
2011-09-14 17:47 951URL : java.net.URLEncoder.e ... -
java中的DateAdd
2011-04-18 21:58 2347/** * 追溯到 startDate ... -
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE
2011-04-18 21:52 2344Statement stmt = con.createSt ... -
都是空格惹得祸
2010-10-28 11:06 1158在一个属性文件中获取相关信息时:如 database.p ... -
SVN提交工作时需要注意的事项
2010-10-14 20:31 940一.提交之前先更新 1. ...
相关推荐
相较于之前的版本,Spring 3.0引入了许多新特性,使得开发者能够更加灵活高效地构建Web应用。 1. **丰富的功能**:Spring MVC提供了丰富的功能,如数据绑定、验证、格式化以及国际化支持,这有助于构建强大的Web...
- **Servlet 3.0**:Servlet 3.0 的推出带来了诸多新特性,如异步处理、过滤器的异步支持、嵌入式Servlet容器以及对HTTP请求参数的改进等,这些都极大地提升了Web应用程序的性能和响应速度。 - **JPA 2.0**:Java ...
#### Spring3.0新特性 - **Java5支持与注解配置**:Spring3.0全面支持Java5的特性,如泛型、注解和可变参数,简化了代码编写和维护。 - **Spring Expression Language (SpEL)**:引入了一种新的表达式语言,可用于...
1. **Java 5支持**:Spring3.0支持Java 5,包括泛型、注解和可变参数等特性,简化了配置和编程。 2. **Spring Expression Language (SpEL)**:引入了Spring表达式语言,可用于XML和注解Bean定义中,增强了表达能力。...
- **异步处理**:Servlet 3.0引入了异步处理的支持,使得Servlet能够处理长时间运行的任务而不会阻塞服务器线程。 #### 三、JSP技术详解 - **JSP基本语法**: - 脚本元素(Scriptlets):如`<% %>`用来执行Java...
Spring MVC 3.0 是一个功能强大且灵活的框架,它不仅简化了 Web 应用程序的开发过程,还提供了丰富的特性来支持现代 Web 开发的需求。从 DispatcherServlet 和 ContextLoaderListener 到控制器、视图解析器以及 ...
Spring 3.0注解是该版本引入的重要特性,极大地简化了Spring MVC框架的配置和使用。Spring MVC是一个强大的Web应用程序开发框架,它允许开发者构建模块化的、松耦合的Web应用,支持RESTful风格的请求处理。在这个...
### MyEclipse 10.5:全面解析与新特性概览 #### 一、MyEclipse概述 MyEclipse是一款强大的集成开发环境(IDE),主要用于Java和J2EE应用程序的开发。它作为Eclipse的一个插件集合,不仅提供了丰富的功能,还支持...
Spring 3.0新特性 - **Java 5的支持**:Spring 3.0全面支持Java 5,利用其特性如泛型和枚举等来提高类型安全性和代码可读性。 - **文档改进**:官方文档进行了大幅度更新,提供了更清晰的指南和示例。 - **新的...
- **JDBC 2.0/3.0新特性**:JDBC(Java Database Connectivity)是Java平台的标准数据库访问接口。JDBC 2.0/3.0引入了许多新特性,如RowSet、批处理等,极大地提高了数据库操作的灵活性和性能。 - **JDBC Optional ...
- **Servlet3.0规范的新特性**: - 异步处理支持:Servlet 3.0引入了异步处理能力,允许Servlet在非阻塞模式下运行,从而提高响应速度和服务器效率。 - 文件上传改进:增强了文件上传功能,提供了更简单的API来...
- **Servlet 3.0 下的 MultipartResolver**:对于 Servlet 3.0 及以上版本,Spring MVC 提供了内置的文件上传支持。 - **处理表单中的文件上传**:通过控制器方法来接收和处理上传的文件。 #### 异常处理 ...
- **组件模型**:包括 EJB 3.1、Servlet 3.0、JSP 2.2 等核心组件模型,支持更灵活的应用程序架构设计。 - **Web 应用框架**:如 JSF 2.0,提供了更强大的 Web 开发工具和库。 - **服务端技术**:包括 CDI (Contexts...
- **简化开发**: 引入了简化企业级应用开发的新特性,如POJOs (Plain Old Java Objects) 和依赖注入。 - **面向注解的配置**: 支持使用注解进行配置,减少了XML配置文件的使用,提高了开发效率。 - **统一EL语言**: ...
- **Servlet技术**:使用Servlet 3.0的新特性简化应用开发。 #### 框架学习 - **Struts2**:了解Struts2框架的基本原理、Action处理机制及常用的标签库。 - **Hibernate**:深入学习Hibernate的API、配置文件、检索...