- 浏览: 850379 次
文章分类
- 全部博客 (365)
- java (124)
- spring mvc (21)
- spring (22)
- struts2 (6)
- jquery (27)
- javascript (24)
- mybatis/ibatis (8)
- hibernate (7)
- compass (11)
- lucene (26)
- flex (0)
- actionscript (0)
- webservice (8)
- rabbitMQ/Socket (15)
- jsp/freemaker (5)
- 数据库 (27)
- 应用服务器 (21)
- Hadoop (1)
- PowerDesigner (3)
- EJB (0)
- JPA (0)
- PHP (2)
- C# (0)
- .NET (0)
- html (2)
- xml (5)
- android (7)
- flume (1)
- zookeeper (0)
- 证书加密 (2)
- maven (1)
- redis (2)
- cas (11)
最新评论
-
zuxianghuang:
通过pom上传报错 Artifact upload faile ...
nexus上传了jar包.通过maven引用当前jar,不能取得jar的依赖 -
流年末年:
百度网盘的挂了吧???
SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) -
953434367:
UfgovDBUtil 是什么类
Java发HTTP POST请求(内容为xml格式) -
smilease:
帮大忙了,非常感谢
freemaker自动生成源代码 -
syd505:
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
在infoq上有关于servlet3.0的新特性说明,个人觉得比较全面
- 可插拔的Web框架
- 几乎所有基于Java的web框架都建立在servlet之上。现今大多数web框架要么通过servlet、要么通过Web.xml插入。利用标注(Annotation)来定义servlet、listener、filter将使之(可插拔)成为可能。程序访问web.xml和动态改变web应用配置是所期望的特性。该JSR将致力于提供把不同web框架无缝地插入到web应用的能力。
- EOD
- 标注——利用标注来作为编程的声明风格。
- web应用零配置是EoD努力方向之一。部署描述符将被用来覆盖配置。
- 范型(generic)——在API中尽可能利用范型。
- 使用其它语言增强可能需要改善API可用性的地方。
- 支持异步和Comet
- 非阻塞输入——从客户端接收数据,即使数据到达缓慢也不会发生阻塞。
- 非阻塞输出——发送数据到客户端,即使客户端或网络很慢也不会发生阻塞。
- 延迟请求处理——Ajax web应用的Comet风格,可以要求一个请求处理被延迟,直到超时或一个事件发生。延迟请求处理对以下情况也很有用:如果远程的/迟缓的资源必须在为该请求服务之前被获得;或者如果访问一个特殊资源,其需要扼杀一些请求以防止太多的并发访问。
- 延迟响应关闭——Ajax web应用的Comet风格,可以要求响应保持打开,以允许当异步事件产生时发送额外的数据。
- 阻塞/非阻塞通知——通知阻塞或非阻塞事件。
- 频道概念——订阅一个频道,以及从该频道获取异步事件的能力。这意味着可以创建、订阅、退订,以及应用一些诸如谁能加入、谁不能加入的安全限制。
- 安全
- login/logout能力。
- 自注册。
- 结合
- 其它
- 支持更好的欢迎文件(welcome file)。
- ServletContextListener排序。
- 容器范围内定义init参数。
- 文件上载——过程侦听——存储中间或最终文件。
- 澄清线程安全问题。
我们下面就看看其中几个特性:
1.可插拔的Web框架,其实就是web.xml中可以又多个子模块的配置文件组成,而各个子模块的配置文件可以放在各个jar包的META-INFO中,这样就实现web应用的模块化。
类似,可以按照配置的顺序指定了web片段的顺序。通过absolute-ordering进行绝对顺序配置,通过每个fragment的order的after和before标签进行相对顺序配置。
- <?xml version="1.0" encoding="GB18030"?>
- <web-app version="3.0"
- 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">
- <absolute-ordering>
- <name>web-fragment1</name>
- <name>web-fragment2</name>
- </absolute-ordering></web-app>
<?xml version="1.0" encoding="GB18030"?> <web-app version="3.0" 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"> <absolute-ordering> <name>web-fragment1</name> <name>web-fragment2</name> </absolute-ordering></web-app>
每个fragment1的配置如下:
- <?xml version="1.0" encoding="GB18030"?>
- <web-fragment version="3.0"
- 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">
- <name>web-fragment1</name>
- <ordering><after>web-fragment1</after><before><others/></before></ordering>
- </web-fragment>
<?xml version="1.0" encoding="GB18030"?> <web-fragment version="3.0" 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"> <name>web-fragment1</name> <ordering><after>web-fragment1</after><before><others/></before></ordering> </web-fragment>2. servlet3.0的annotation支持
对于原来在web.xml定义的servlet,filter,listener,InitParam都可以通过annotation来配置了,而不需要在web.xml中定义。
@WebFilter
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.annotation.WebFilter;
- import javax.servlet.annotation.WebInitParam;
- //asyncSupported=true 对应filter也需要定义asyncSupported=true
- @WebFilter(urlPatterns={"/*"}, filterName="my3Filter", asyncSupported=true)
- @WebInitParam(name="a", value="valuea")
- public class My3Filter implements Filter{
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- }
- @Override
- public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
- System.out.println("servlet 3 filter");
- arg2.doFilter(arg0, arg1);
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- System.out.println("servlet 3 filter init");
- }
- }
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; //asyncSupported=true 对应filter也需要定义asyncSupported=true @WebFilter(urlPatterns={"/*"}, filterName="my3Filter", asyncSupported=true) @WebInitParam(name="a", value="valuea") public class My3Filter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("servlet 3 filter"); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("servlet 3 filter init"); } }
@WebServlet
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.annotation.WebFilter;
- import javax.servlet.annotation.WebInitParam;
- //asyncSupported=true 对应filter也需要定义asyncSupported=true
- @WebFilter(urlPatterns={"/*"}, filterName="my3Filter", asyncSupported=true)
- @WebInitParam(name="a", value="valuea")
- public class My3Filter implements Filter{
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- }
- @Override
- public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
- System.out.println("servlet 3 filter");
- arg2.doFilter(arg0, arg1);
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- System.out.println("servlet 3 filter init");
- }
- }
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; //asyncSupported=true 对应filter也需要定义asyncSupported=true @WebFilter(urlPatterns={"/*"}, filterName="my3Filter", asyncSupported=true) @WebInitParam(name="a", value="valuea") public class My3Filter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("servlet 3 filter"); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("servlet 3 filter init"); } }支持的annotation如下,都可以通过eclipse的提示查到对应的参数配置,
@WebServlet支持的参数有
3. servlet3.0的异步支持
很多时候Servlet要和其他的资源进行互动,例如访问数据库,调用web service。在和这些资源互动的时候,Servlet不得不等待数据返回,然后才能够继续执行。这使得Servlet调用这些资源的时候阻塞。Servlet3.0通过引入异步处理解决了这个问题。异步处理允许线程调用资源的时候不被阻塞,而是直接返回。AsyncContext负责管理从资源来的回应。AsyncContext决定该回应是应该被原来的线程处理还是应该分发给容器中其他的资源。AsyncContext有一些方法如start,dispatch和complete来执行异步处理。
要想使用Servlet3.0的异步处理,我们需要设置@Webservlet和@WebFilter注解的asyncSupport属性。这个属性是布尔值,缺省值是false。
所以,可以在servlet阻塞处理网络,数据库查询等时,可以暂时释放线程资源,处理更多请求,当请求处理完之后重新唤醒线程继续处理原来的请求,达到NIO的效果。
我们看下一个示例
AsyncContext 可以添加监听器作为异步处理过程中状态的跟踪等
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.AsyncContext;
- import javax.servlet.AsyncEvent;
- import javax.servlet.AsyncListener;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet(asyncSupported=true,name="asyncServlet", urlPatterns="/async")
- public class AsyncServlet extends HttpServlet{
- /**
- *
- */
- private static final long serialVersionUID = 3903580630389463919L;
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- resp.getWriter().write("hello, async test");
- resp.getWriter().println("start:"+new Date()+".<br/>");
- resp.getWriter().flush();
- final AsyncContext async = req.startAsync(req,resp);
- async.setTimeout(3000);
- async.start(new Runnable() {
- @Override
- public void run() {
- ServletRequest request = async.getRequest();
- try {
- Thread.sleep(2000);
- async.getResponse().getWriter().write("aync thread processing");
- async.getResponse().getWriter().flush();
- async.getResponse().getWriter().println("async end:"+new Date()+".<br/>");
- async.getResponse().getWriter().flush();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- });
- async.addListener(new AsyncListener() {
- @Override
- public void onTimeout(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- public void onStartAsync(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- public void onError(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- public void onComplete(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- });
- resp.getWriter().println("end:"+new Date()+".<br/>");
- resp.getWriter().flush();
- }
- }
import java.io.IOException; import java.util.Date; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(asyncSupported=true,name="asyncServlet", urlPatterns="/async") public class AsyncServlet extends HttpServlet{ /** * */ private static final long serialVersionUID = 3903580630389463919L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("hello, async test"); resp.getWriter().println("start:"+new Date()+".<br/>"); resp.getWriter().flush(); final AsyncContext async = req.startAsync(req,resp); async.setTimeout(3000); async.start(new Runnable() { @Override public void run() { ServletRequest request = async.getRequest(); try { Thread.sleep(2000); async.getResponse().getWriter().write("aync thread processing"); async.getResponse().getWriter().flush(); async.getResponse().getWriter().println("async end:"+new Date()+".<br/>"); async.getResponse().getWriter().flush(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); async.addListener(new AsyncListener() { @Override public void onTimeout(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onStartAsync(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onError(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } @Override public void onComplete(AsyncEvent arg0) throws IOException { // TODO Auto-generated method stub } }); resp.getWriter().println("end:"+new Date()+".<br/>"); resp.getWriter().flush(); } }
输出如下: 这里先对线程后面的println先输出,最后在处理输出异步线程输出的内容。
- hello, async teststart?Mon Dec 10 20:23:35 CST 2012.
- end?Mon Dec 10 20:23:35 CST 2012.
- aync thread processingasync end?Mon Dec 10 20:23:37 CST 2012.
hello, async teststart?Mon Dec 10 20:23:35 CST 2012. end?Mon Dec 10 20:23:35 CST 2012. aync thread processingasync end?Mon Dec 10 20:23:37 CST 2012.
这里有个主意点,对于servlet配置了asyncSupported=true,那么对于所有异步经过的filter也需要配置这个参数,否则这里会报错,不支持异步处理。
4.@MultipartConfig 文件上传的支持,以前servlet要处理上传文件一般会使用common file upload组件,现在servlet3.0原生支持了文件上传的处理
location参数指定临时文件存放目录,
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.MultipartConfig;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.Part;
- @WebServlet(asyncSupported=true,name="upload", urlPatterns="/upload")
- @MultipartConfig(fileSizeThreshold = 10000, maxFileSize = 1000000, maxRequestSize = 1000000, location="E:/logs")
- public class MultiPartServlet3 extends HttpServlet {
- /**
- *
- */
- private static final long serialVersionUID = 7306582588845300635L;
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- Part part = req.getPart("file");
- String value = part.getHeader("content-disposition");
- System.out.println(value);
- String filename = value.substring(value.lastIndexOf("=") + 2,value.length() - 1);
- System.out.println(filename);
- System.out.println(part.getInputStream().toString());
- }
- }
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet(asyncSupported=true,name="upload", urlPatterns="/upload") @MultipartConfig(fileSizeThreshold = 10000, maxFileSize = 1000000, maxRequestSize = 1000000, location="E:/logs") public class MultiPartServlet3 extends HttpServlet { /** * */ private static final long serialVersionUID = 7306582588845300635L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Part part = req.getPart("file"); String value = part.getHeader("content-disposition"); System.out.println(value); String filename = value.substring(value.lastIndexOf("=") + 2,value.length() - 1); System.out.println(filename); System.out.println(part.getInputStream().toString()); } }
我们写一个文件上传的页面
- <form action="upload" method="post" enctype="multipart/form-data">
- <input type="file" name="file"><br> <input type="submit"
- value="submit">
- </form>
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="submit"> </form>
随便上传一个文件,我这边的输出为:
form-data; name="file"; filename="22.log" 22.log java.io.ByteArrayInputStream@1bdce67
5.已有API改进,特别是支持动态加载servlet,热部署功能
- HttpServletRequest
- To support the multipart/form-data MIME type, the following methods have been added to the HttpServletRequest interface:
- 为了支持multipart/form-data MIME类型,在HttpServletRequest接口中添加了项目的方法:
- * Iterable<Part> getParts()
- * Part getPart(String name)
- Cookies
- 为了避免一些跨站点攻击,Servlet3.0支持HttpOnly的cookie。HttpOnly cookie不想客户端暴露script代码。Servlet3.0在Cookie类中添加了如下的方法来支持HttpOnly cookie:
- * void setHttpOnly(boolean isHttpOnly)
- * boolean isHttpOnly()
- ServletContext
- 通过在ServletContext中添加下面的方法,Servlet3.0允许Servlet或filter被编程的加入到context中:
- * addServlet(String servletName, String className)
- * addServlet(String servletName, Servlet servlet)
- * addServlet(String servletName, Class<? extends Servlet> servletClass)
- * addFilter(String filterName, String className)
- * addFilter(String filterName, Filter filter)
- * addFilter(String filterName, Class<? extends Filter>filterClass)
- * setInitParameter (String name, String Value)
HttpServletRequest To support the multipart/form-data MIME type, the following methods have been added to the HttpServletRequest interface: 为了支持multipart/form-data MIME类型,在HttpServletRequest接口中添加了项目的方法: * Iterable<Part> getParts() * Part getPart(String name) Cookies 为了避免一些跨站点攻击,Servlet3.0支持HttpOnly的cookie。HttpOnly cookie不想客户端暴露script代码。Servlet3.0在Cookie类中添加了如下的方法来支持HttpOnly cookie: * void setHttpOnly(boolean isHttpOnly) * boolean isHttpOnly() ServletContext 通过在ServletContext中添加下面的方法,Servlet3.0允许Servlet或filter被编程的加入到context中: * addServlet(String servletName, String className) * addServlet(String servletName, Servlet servlet) * addServlet(String servletName, Class<? extends Servlet> servletClass) * addFilter(String filterName, String className) * addFilter(String filterName, Filter filter) * addFilter(String filterName, Class<? extends Filter>filterClass) * setInitParameter (String name, String Value)
下面这篇文章还是比较全面的解析
http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/index.html
发表评论
-
eclispe 实用插件大全
2016-03-31 10:17 828在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的 ... -
单点登录 SSO Session
2016-03-14 16:56 4050单点登录在现在的 ... -
通用权限管理设计 之 数据库结构设计
2016-01-26 13:22 2945通用权限管理设计 之 ... -
分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
2016-01-26 13:22 1479分享一个基于ligerui的系统应用案例ligerRM V2 ... -
通用权限管理设计 之 数据权限
2016-01-26 13:20 734通用权限管理设计 之 数据权限 阅读目录 前 ... -
使用RSA进行信息加密解密的WebService示例
2015-12-28 10:30 868按:以下文字涉及RS ... -
防止网站恶意刷新
2015-10-22 10:55 697import java.io.IOExcept ... -
单点登录
2015-10-19 14:24 759Cas自定义登录页面Ajax实现 博客分类: ... -
session如何在http和https之间同步
2015-09-14 09:25 2249首先说下 http>https>http ... -
基于 Quartz 开发企业级任务调度应用
2015-08-17 11:17 830Quartz 是 OpenSy ... -
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
2015-08-17 11:17 873今天来点实际工 ... -
Java加密技术(十)——单向认证
2015-08-13 10:13 676在Java 加密技术(九)中,我们使 ... -
Java加密技术(九)——初探SSL
2015-08-13 10:12 873在Java加密技术(八)中,我们模拟 ... -
Java加密技术(八)——数字证书
2015-08-13 10:12 885本篇的主要内容为Java证书体系的实 ... -
Java加密技术(七)——非对称加密算法最高级ECC
2015-08-13 10:12 964ECC ECC-Elliptic Curv ... -
Java加密技术(六)——数字签名算法DSA
2015-08-13 10:11 1045接下来我们介绍DSA数字签名,非对称 ... -
Java加密技术(五)——非对称加密算法的由来DH
2015-08-12 16:13 860接下来我们 ... -
Java加密技术(四)——非对称加密算法RSA
2015-08-12 16:11 1086接下来我们介绍典型的非对称加密算法—— ... -
Java加密技术(三)——PBE算法
2015-08-12 16:10 946除了DES,我们还知道有DESede( ... -
Java加密技术(二)——对称加密算法DES&AES
2015-08-12 16:09 713接下来我们介绍对称加密算法,最常用的莫 ...
相关推荐
### 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 ...
第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 新特性详解 .doc",这可能是一个详细的文档,涵盖了Servlet 3.0的所有新功能和技术亮点;另一个是"servlet-api-3.0.jar",这是Servlet 3.0 API的实现库,用于在...
#### 一、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. **安全性**:...
1. **Servlet3.0特性**: - 自动扫描:Servlet3.0引入了自动扫描容器,无需在web.xml中配置Servlet,只需在类上添加`@WebServlet`注解即可。 - 异步处理:Servlet3.0支持异步处理,提高了服务器对高并发请求的响应...
此外,Servlet3.0引入了注解配置,允许在Servlet类上直接声明: ```java @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { // ... } ``` 在Servlet中处理请求和响应主要通过重写`doGet()...
最后,Servlet 3.0还引入了一些其他特性,比如支持异步处理、过滤器和监听器的注解配置,以及更灵活的部署选项。这些改进进一步简化了Servlet的开发和管理,增强了其功能。 总结来说,Java Servlet通过XML配置或...
### Spring 3.0 MVC框架知识点详解 #### 一、Spring 3.0 MVC框架概述 **Spring 3.0 MVC**是Spring框架的一个重要组成部分,专注于构建Web应用程序。相较于之前的版本,Spring 3.0 MVC引入了许多重要的改进和新特性...
7. **Servlet 3.0及以上版本的新特性**:Servlet 3.0引入了注解配置,无需在web.xml中配置Servlet,可以直接在类上使用`@WebServlet`注解。此外,还支持异步处理,使Servlet能更高效地处理长时间运行的任务。 8. **...