- 浏览: 1151976 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
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; } }
发表评论
-
一个例子全部说明java泛型中的K,V,T,E,?,object的意思及其用法
2013-03-07 11:09 70541.意思 jdk中的K,V,T,E等泛型名称很多人以为 ... -
Log4j 把不同包的日志打印到不同位置
2012-11-29 08:23 1153需要的包和测试的代码下载附件! 如果需要将不同的日 ... -
Java多线程发展简史
2012-09-16 14:25 1039转自:http://www.raychase.ne ... -
Java编码易疏忽的十个问题
2012-09-06 08:52 918在Java编码中,我们容易 ... -
网络编程
2012-09-04 13:30 976计算机网络基础 什么是计算机网络 把分布在 ... -
获取Java程序运行的路径 | 获取当前jar包的路径
2012-09-04 11:55 14087经过试验,不管是否是 Jar 包,不管是否是 Tom ... -
java的concurrent用法详解
2012-08-03 11:28 1023我们都知道,在JDK1.5之前,Java中要进行业务并发时 ... -
Java程序员必知的8大排序
2012-07-05 09:56 10308 种排序之间的关系: ... -
Comparator与Comparable的区别
2012-07-05 08:38 1224当需要排序的集合或数组不是单纯的数字类型的时候,通常可以使用C ... -
RSA算法Java实现
2012-06-27 08:22 1419Java代码 package c ... -
队列阻塞浅析
2012-06-17 18:10 936这几天所做的项目中涉及到了队列阻塞机制,通过研究整理如下 ... -
Java面试过程中会遇到的问题
2012-06-13 13:04 11491、abstract的method是否可同时是static,是 ... -
【解惑】深入jar包:从jar包中读取资源文件
2012-06-13 13:02 1104我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。 ... -
java 处理文件路径中的空格
2012-06-13 12:57 1542问题背景: windows下有个目录名称Program ... -
java内存分配机制
2012-06-13 12:52 1176通过这几天对一个 ... -
byte[]转化成其他数据类型
2012-05-14 16:41 1666Java与其他语言数据类型之间的转换方法实例程序 /*** ... -
java中byte转换int时为何与0xff进行与运算
2012-05-14 16:39 1075java中byte转换int时为何 ... -
java整型数与网络字节序的 byte[] 数组转换关系
2012-05-14 16:31 6478工作项目需要在 java 和 c/c++ 之间进行 ... -
利用 Base64 缩短 UUID 至22位
2012-04-15 18:57 7185UUID还是比较常用的,尤其在web应用里。 有时在UR ... -
图解Java中的值传递与引用传递(更新版)
2012-04-09 12:49 1187编程的人,都会遇到值传递与引用传递的困惑,不过很快都会迎 ...
相关推荐
### Servlet 3.0 新增功能详解 #### 引言 Servlet 技术自问世以来一直是 Java Web 开发的核心组成部分之一。随着技术的发展,Servlet 规范也在不断更新以适应新的需求和技术趋势。Servlet 3.0 版本是 Java EE 6 的...
Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...
Servlet 3.0 新特性详解 Servlet 3.0 的出现标志着 Servlet 历史上最大的变革,其中的许多新特性大大简化了 Web 应用开发,为广大劳苦的程序员减轻了压力,提高了 Web 开发效率。下面,我们将详细解释 Servlet 3.0 ...
这个压缩包包含了两个关键资源,一个是"Servlet 3.0 新特性详解 .doc",这可能是一个详细的文档,涵盖了Servlet 3.0的所有新功能和技术亮点;另一个是"servlet-api-3.0.jar",这是Servlet 3.0 API的实现库,用于在...
第03课 servlet3.0新特性之@WebServlet_@WebInitParam详解 第04课 servlet3.0新特性之@WebFilter_@WebListener 第05课 JQuery AJAX 注册验证+二级菜单(JSON) 第06课 mybatis 框架搭建 第07课 mybatis 增删改查 第...
这篇详解将深入剖析Servlet3.0的特性,以及如何利用这些特性构建微框架。 1. **注解驱动的配置** Servlet3.0引入了注解来替代传统的XML配置,大大简化了部署描述符web.xml的编写。例如,可以使用`@WebServlet`直接...
《Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用》内容全面,涵盖了从事Java Web开发所应掌握的所有知识,同时还讲解了最新的Servlet 3.0和JSP 2.2规范新增的特性。在知识的...
### Servlet 3.0 新特性详解 #### 一、异步处理支持 Servlet 3.0 最引人注目的新特性之一就是异步处理支持。在此之前,Servlet 的生命周期模型是同步阻塞式的,即Servlet 接收客户端请求后,会执行一系列业务逻辑...
#### 一、Servlet 3.0概述与新特性 Servlet 3.0 是 Java EE 6 的一部分,它引入了许多新的特性和改进,使得开发者能够更方便地开发 Web 应用程序。其中一个重要特性就是支持使用注解来配置过滤器(Filter),这大大...
Servlet 3.0是Java Servlet规范的一个重要版本,它引入了许多新特性,显著提升了开发效率和灵活性。在Servlet 3.0之前,我们通常需要一个`web.xml`部署描述符文件来配置Servlet,但在Servlet 3.0之后,我们可以实现...
Tomcat 7.0.x及更高版本开始支持Servlet 3.0规范,因此,使用这些新特性的应用可以部署在这些版本的Tomcat服务器上。 总之,Servlet 3.0的注解配置、模块化编程、异步处理和简化文件上传API等功能显著提升了Java EE...
xt.complete(); // 结束异步上下文 } catch (IllegalStateException e) { ...为了充分利用这些特性,你需要确保你的应用服务器支持Servlet 3.0或3.1规范,同时在编写Servlet时适配这些新特性,以实现高效的异步处理。
本教程将深入解析JSP 3.0的核心概念、新特性以及如何使用这些特性来构建实际应用,例如购物车系统。 ### JSP 3.0 的核心特点 1. **简化语法**:JSP 3.0引入了更简洁的声明标签,比如可以直接在HTML中声明Java...
- **MyEclipse10.0或以上版本**:为了确保能够使用Servlet3.0的新特性,开发环境至少需要是MyEclipse10.0或更高版本。 - **Tomcat7.0或以上版本**:部署Servlet3.0的应用程序时,服务器环境也需支持新特性,因此...
8. **Servlet 3.0新特性**:从Servlet 3.0版本开始,支持注解驱动的Servlet配置,无需web.xml,可以直接在Servlet类上使用`@WebServlet`注解。同时,还引入了异步Servlet处理和WebSocket协议支持。 9. **安全性**:...
此外,Servlet3.0引入了注解配置,允许在Servlet类上直接声明: ```java @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { // ... } ``` 在Servlet中处理请求和响应主要通过重写`doGet()...
1. **Servlet3.0特性**: - 自动扫描:Servlet3.0引入了自动扫描容器,无需在web.xml中配置Servlet,只需在类上添加`@WebServlet`注解即可。 - 异步处理:Servlet3.0支持异步处理,提高了服务器对高并发请求的响应...
最后,Servlet 3.0还引入了一些其他特性,比如支持异步处理、过滤器和监听器的注解配置,以及更灵活的部署选项。这些改进进一步简化了Servlet的开发和管理,增强了其功能。 总结来说,Java Servlet通过XML配置或...
### Java EE 6 新特性详解 #### Java EE 发展历程概览 自1998年12月8日发布以来,Java EE(最初称为 J2EE)已历经十余年的发展,成为了搭建具备高可伸缩性、灵活性及易维护性的商务系统的首选平台。随着技术的不断...
Servlet 3.0引入了许多新特性,如注解配置、异步处理、过滤器链等,大大简化了Web应用的开发。在“JavaWeb网络相册”中,Servlet用于处理用户的登录、上传、下载等操作,通过注解配置可以减少XML配置文件,提高开发...