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 {@Overridepublic void doFilter(ServletRequest request, ServletResponse repsonse,FilterChain chain) throws IOException, ServletException {System.out.println("过滤器。。。。。。。。。。。。");chain.doFilter(request, repsonse);}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}
@WebListener
public class AListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("死掉了");}@Overridepublic 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 {@Overridepublic 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);}
}

转载于:https://www.cnblogs.com/fengmingyue/p/6091045.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统遵循,自考《计算机系统结构》第10章精讲

第十章 新型计算机系统结构本章只作一般要求&#xff0c;了解基本原理和概况。一、计算模型分类(识记)计算模型是描述如何在计算机中完成计算的一种概念性方法&#xff0c;不涉及硬件和软件细节。它给出了完成计算所必须遵循的基本规则。计算机系统结构是有关计算模型的一个具体…

re模块的使用

import re # pip 包管理工具r re.match函数 原型&#xff1a;match(pattern, string, flags0) pattern: 匹配的正则表达式 string: 要匹配的字符串 flags:标志位&#xff0c;用于控制正则表达式的匹配方式,值如下 re.I 忽略大小写 re.L 做本地话识别 re.M 多行匹配&…

Random Forest随机森林概述

引言 在机器学习中&#xff0c;随机森林由许多的决策树组成&#xff0c;因为这些决策树的形成采用了随机的方法&#xff0c;因此也叫做随机决策树。随机森林中的树之间是没有关联的。当测试数据进入随机森林时&#xff0c;其实就是让每一颗决策树进行分类&#xff0c;最后取所…

走出半生,望你归来仍是程序员

在世二十七年&#xff0c;自认为积累了一点人生经验。思索着当你还在你娘胎的日子里&#xff0c;整理一番留给以后的你&#xff0c;当作你以后漫漫人生路上的参考。我保证&#xff0c;倘若哪天你发现某条不对或者跟你的想法不一样&#xff0c;你能敞开心扉与我交谈&#xff0c;…

kd tree学习笔记 (最近邻域查询)

https://zhuanlan.zhihu.com/p/22557068 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 KD树在算法竞赛中主要用来做各种各样的平面区域查询&#xff0c;包含则累加直接返回&#xff0c;相交则继续递归&#xff0c;相离的没有任何贡献也直接返回。可以处理圆&am…

正则表达式的元素符

import reprint("----------匹配单个字符与数字----------") r . 匹配除换行符以外的任意字符 [0123456789] []是字符集合&#xff0c;表示匹配方括号中所有所包含的任意一个字符 [liuwang] [] 匹配‘l&#xff0c;i&#xff0c;u 中任意一个字符…

图像影音型计算机主板选择什么,电脑主板型号在哪里看? 每日一答

电脑主板型号在哪里看&#xff1f;想要看主板的型号其实非常简单&#xff0c;一般来说&#xff0c;主板上都会有一个专门的身份标识&#xff0c;位于PCI-E显卡插槽之间&#xff0c;比如下方这张图&#xff0c;就清晰地写明了MAXIMUS X APEX的标识&#xff0c;熟悉的玩家一眼就能…

使用叶神模拟器无法访问本机服务器的问题(报错:java.net.ConnectException: failed to connect to /127.0.0.1 (port 5000) )

最近打算用夜神模拟器来和本机服务器做一些信息交互的功能&#xff0c;但是服务器搭建好了&#xff0c;用叶神模拟器却无法访问。折腾了大半天才发现原来是模拟器的问题。 具体过程如下&#xff1a; 搭建好服务器后&#xff0c;在本机上访问“http://127.0.0.1:5000/”&#…

NSObject协议中方法:description 和 debugDescription

description基本概念 1.NSLog("%", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息. 2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址) 3.description方法是基类NSObject 所带的方法,因为其默认实现是返回类名…

re模块的深入

import re 字符串切割str1 "allen is a good man" print(str1.split()) print(re.split((r" "),str1)) re.finditer函数 原型&#xff1a;finditer(pattern, string, flags0) pattern: 匹配的正则表达式 string: 要匹配的字符串 flags:标志位&…

身份证

<?php defined(IN_IA) or exit(Access Denied);class check {// $num为身份证号码&#xff0c;$checkSex&#xff1a;1为男&#xff0c;2为女&#xff0c;不输入为不验证public function checkIdentity($num, $checkSex ) {// 不是15位或不是18位都是无效身份证号if (strl…

鼓励参与计算机考试宣传标语,诚信考试的宣传标语(精选60条)

诚信考试的宣传标语(精选60条)诚信考试&#xff0c;做文明公民&#xff0c;既是时代需要&#xff0c;也是做人的基本准则。下面是小编收集的诚信考试的宣传标语(精选60条)&#xff0c;欢迎阅读。1、让舞弊远离校园&#xff0c;让诚信常驻心中2、刻苦学习&#xff0c;认真做人3、…

初学大数据之如何选择机器学习算法

最近在国外网站看到一篇不错的文章&#xff0c;所以就翻译过来给大家分享一下。主要介绍初学者怎么选择机器学习算法,希望对各位初学者有帮助。 原文如下: 一个初学者面临各种机器学习算法的典型问题是“我应该使用哪种算法&#xff1f;”问题的答案取决于许多因素&#xff0…

Django查询 – id vs pk

当编写django查询时&#xff0c;可以使用id / pk作为查询参数。 Object.objects.get(id1) Object.objects.get(pk1) pk代表主键(primary key)&#xff0c; pk更加独立于实际的主键字段&#xff0c;即不必关心主键字段是否被称为id或object_id或其他。 如果您具有不同主键字…

Tomcat的Session管理(三)

摘要&#xff1a;PersistentManager与StandardManager的异同。 之前两篇关于session的文章主要讨论了session相关的创建、查询、过期处理。而我们查看源码的时候都是默认实现是StandardManager类&#xff0c;实际上实现也可以是PersistentManager类&#xff0c;下面我们就查看下…

计算机基础的函数公式,大学计算机基础 excle 公式与函数

《大学计算机基础 excle 公式与函数》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《大学计算机基础 excle 公式与函数(32页珍藏版)》请在人人文库网上搜索。1、,.,场景1,发布日期:2011.11.09,新入职场,经理说&#xff1a; 小张&#xff0c;以后工资发放的事情就交给…

稳定和性能如何兼顾?58大数据平台的技术演进与实践

作者&#xff5c;赵健博 编辑&#xff5c;尚剑 本文将为你分享58大数据平台在最近一年半内技术演进的过程&#xff0c;包括&#xff1a;58大数据平台目前的整体架构是怎么样的&#xff1b;最近一年半的时间内我们面临的问题、挑战以及技术演进过程&#xff1b;以及未来的规划。…

Random Forest算法简介

转自JoinQuant量化课堂 一、相关概念 分类器&#xff1a;分类器就是给定一个样本的数据&#xff0c;判定这个样本属于哪个类别的算法。例如在股票涨跌预测中&#xff0c;我们认为前一天的交易量和收盘价对于第二天的涨跌是有影响的&#xff0c;那么分类器就是通过样本的交易量…

MySQL 学习笔记

01 import pymysql#连接数据库db pymysql.connect("192.168.1.179","root","liuwang","liu")#创建一个cursor对象 cursor db.cursor() sql "select version()"cursor.execute(sql)data cursor.fetchone() print(data)…

简单交互

控件有着各种事件&#xff0c;例如被点击的时候&#xff0c;我们可以在事件里面添加动作和命令&#xff0c;让控件可以和用户交互&#xff0c;这里我们演示一个简单的交互&#xff1a;当用户点击文字控件的时候&#xff0c;它开始动画向下移动然后动画旋转&#xff0c;效果入下…