Servlet3.0新特性
1 Servlet3.0新特性概述
使用要求:MyEclipse10.0或以上版本,发布到Tomcat7.0或以上版本,创建JavaEE6.0应用!
Servlete3.0的主要新特性如下三部分:
使用@WebServlet、@WebFilter、@WebListener三个注解来替代web.xml文件中的Servlet、Filter、Listener的配置;
Servlet异步处理:当Servlet处理比较费时的问题时,这会让客户感觉到很卡(原来(Servlete2.5),在服务器没有结束响应之前,浏览器是看不到响应内容的,只有响应结束时,浏览器才能显示结果!)。当使用异常处理时可以把已经处理好的内容先一步响应给客户端浏览器,然后使用另一个线程来完成费时的操作,也就是把内容一部分一部分的显示出来;
上传组件:不用再使用commons-fileupload等第三方的上传组件,使用Servlet3.0的上传组件会更方便。
2 @WebServlet、@WebFilter、@WebListener(使用前提:删除web.xml文件,好处:配置信息少,缺点:不方便修改)
@WebServlet( urlPatterns="/AServlet",
initParams={ //初始化参数
@WebInitParam(name="p1", value="v1"),
@WebInitParam(name="p2", value="v2")
},
//标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法),值代表优先级,正数的值越小,优先级越高,启动时就越先加载
loadOnStartup=1
)
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().print("hello servlet3.0!!");
}
}
@WebFilter(urlPatterns="/*")
public class AFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse repsonse,
FilterChain chain) throws IOException, ServletException {
System.out.println("过滤器。。。。。。。。。。。。");
chain.doFilter(request, repsonse);
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
@WebListener
public class AListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("死掉了");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("出生了");
}
}
3 Servlet异步处理
Servlet异步处理就是让Servlet在处理费时的请求时不要阻塞,而是一部分一部分的显示。也就是说,在使用Servlet异步处理之后,页面可以一部分一部分的显示数据,而不是一直卡,等到请求响应结束后一起显示。
在使用异步处理之前,一定要在@WebServlet注解中给出asyncSupported=true,不然默认Servlet是不支持异步处理的。如果存在过滤器,也要设置@WebFilter的asyncSupportedt=true。注意,响应类型必须是text/html,所以要设置:response.setContentType(“text/html;charset=utf-8”);
使用异步处理大致可以分为两步:Servlet正常响应数据,Servlet异常响应数据。
在Servlet正常响应数据时,没什么可说的,可通知response.getWriter().print()来向客户端输出,但输出后要使用response.getWriter().flush()刷新,不然数据只是在缓冲区中,不能向客户端发送数据的。
异步响应数据需要使用request.startAsync()方法获取AsyncContext对象。然后调用AsyncContext对象的start()方法启动异步响应,start()方法需要一个Runnable类型的参数。在Runnable的run()方法中给出异步响应的代码。注意在异步处理线程中使用response做响应后,要使用response.getWriter().flush()来刷新流,不然数据是不能响应到客户端浏览器的。
@WebServlet(urlPatterns="/AServlet", asyncSupported=true)
public class AServlet extends HttpServlet {
public void doGet(final HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//兼容IE!如果输出不足512B,IE没有异步效果!
for(int i = 0; i <= 512; i++) {
resp.getWriter().print("a");
}
resp.getWriter().flush();
//得到异步上下文对象
final AsyncContext ac = req.startAsync(req, resp);
/**
* 设置超时时间为10秒,Tomcat需要知道异步响应是否结束,如果响应不结束,虽然客户端浏览器会看到响应的数据,但是鼠标上只是有个圈圈的不行的转啊转的,表示还没有结束响应。Tomcat会等待到超时为止,这个超时的时间可以通过AsyncContext类的getTimeout()方法获取,Tomcat默认为20000毫秒。当然也可以通过此方法方法设置
*/
ac.setTimeout(1000*10);
//给上下文对象一个Runnable对象,让它执行这个任务
ac.start(new Runnable() {
public void run() {
println("现在马上开始<br/>", resp);
sleep(2000);
for(char c = 'A'; c <= 'Z'; c++) {
println(c+"", resp);
sleep(250);
}
ac.complete();// 通知Tomcat我们已经执行结束了!
}
});
}
public void println(String text, HttpServletResponse resp) {
try {
resp.getWriter().print(text);
resp.getWriter().flush();
} catch (IOException e) {
}
}
public void sleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
}
}
}
4 文件上传
Servlet3.0提供了文件上传的处理方案。只需要在Servlet上添加@MultipartConfig注解即可。
当然也可以为@MultipartConfig注解指定属性值,它有四个属性:
int filesizeThreshold:指定缓存的大小,当超出这个大小后,文件会保存到磁盘上;
String location:指定临时文件的目录;
long maxFilesize:指定上传单个文件的大小限制,如果上传的谁的超出了这个大小,那么就会抛出异常;
long maxRequestSize:指定整个表单的大小限制。
当在Servlet上使用了@MultipartConfig注解后,那么就可以使用request.getPart(“fieldName”)来获取<input:file>的内容,其中Part表示一个文件表单项。
<form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
简 历:<input type="file" name="resume"/><br/>
<input type="submit" value="注册"/>
</form>
@WebServlet(urlPatterns="/AServlet")
@MultipartConfig(maxFileSize=1024*1024)
public class AServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//getParameter()方法可以使用了!!!
String username = req.getParameter("username");//可以使用了!!!
//获取文件表单字段,对应的Part对象
Part part = req.getPart("resume");
//从Part中获取需要的数据
System.out.println(part.getContentType());//获取上传文件的MIME类型
System.out.println(part.getSize());// 获取上传文件的字节数
System.out.println(part.getName());// 获取文件字段名称
System.out.println(part.getHeader("Content-Disposition"));// 获取头,这个头中包含了上传文件的名称
part.write("C:/xxx.jpg");// 保存上传文件
// 截取上传文件名称
String filename = part.getHeader("Content-Disposition");
int start = filename.lastIndexOf("filename=\"") + 10;
int end = filename.length() - 1;
filename = filename.substring(start, end);
System.out.println(filename);
}
}
Servlet3.0新特性的更多相关文章
- 【servlet3.0新特性】Annotation注解配置
servlet3.0新特性Servlet3.0引入的若干重要新特性,包括异步处理.新增的注解支持.可插性支持等等,为读者顺利向新版本过渡扫清障碍.Servlet3.0新特性概述Servlet3.0作为 ...
- 【Servlet3.0新特性】第03节_文件上传
这是一个Web Project 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web- ...
- 使用Servlet3.0新特性asyncSupported=true时抛异常java.lang.IllegalStateException: Not supported
最近在运用Servlet3.0新特性:异步处理功能的时候出现以下了2个问题: 运行时会抛出以下两种异常: 一月 19, 2014 3:07:07 下午 org.apache.catalina.core ...
- Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)
1. Annotation注解 1.1. Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...
- Servlet3.0新特性(从注解配置到websocket编程)
Servlet3.0的出现是servlet史上最大的变革,其中的许多新特性大大的简化了web应用的开发,为广大劳苦的程序员减轻了压力,提高了web开发的效率.主要新特性有以下几个: 引入注解配置 支持 ...
- Java自学手记——servlet3.0新特性
servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...
- Servlet3.0新特性WebFilter(Annotation Filter)详解
摘要: Servlet3.0作为J2EE 6规范一部分,并随J2EE6一起发布,WeFilter是过滤器注解,是Servlet3.0的新特性,不需要在web.xml进行配置,简化了配置. Name T ...
- Servlet3.0新特性使用详解
可插拔的Web框架 几乎所有基于Java的web框架都建立在servlet之上.现今大多数web框架要么通过servlet.要么通过Web.xml插入.利用标注(Annotation)来定义servl ...
- servlet3.0 新特性——异步处理
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: 首先,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 接着,调用业务接口的某些方法,以完成业 ...
随机推荐
- 数学软件 之 基于MATLAB的DFP算法
DFP算法是本科数学系中最优化方法的知识,也是无约束最优化方法中非常重要的两个拟Newton算法之一,上一周写了一周的数学软件课程论文,姑且将DFP算法的实现细节贴出来分享给学弟学妹参考吧,由于博客不 ...
- Lock+Condition 相对于 wait+notify 的一个优势案例分析
问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18, ...
- SAP 工厂日生产计划待排维护
*&---------------------------------------------------------------------* *& Report ZPPR0024 ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
- 【QT】C++ GUI Qt4 学习笔记5
折腾了好几天,终于把这本书的第三章和第四章给看了个大概. 里面的函数调用关系可谓是复杂. 整理了一部分的函数关系如下: cell关系清理 data(role) 返回应该显示的值 或者对齐方式 或者公式 ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- 9.27js拓展、bootstrap菜鸟教程
js(点击挂上 与 点击移除) <div id="dd" style="width:200px; height:200px; background-color:#6 ...
- Callable 和 Future接口 学习
* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. * Callable和Runnable有几点不同: * (1)C ...
- NYOJ题目101两点距离
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsEAAAIBCAIAAAAnO/WXAAAgAElEQVR4nO3dq3IbSeM34L0Jc/O9BW
- Android 反编译 -- apktool、dex2jar、jd-gui
原文:http://blog.csdn.net/vipzjyno1/article/details/21039349/ apktool 最新官网: http://ibotpeaches.github. ...