Servlet 3.0 新特性全解

news2024/11/24 22:24:53

文章目录

  • Servlet3.0新特性全解
    • Servlet 3.0 新增特性
    • Servlet3.0的注解
    • Servlet3.0的Web模块支持
    • servlet3.0提供的异步处理
      • 提供异步原因
      • 实现异步原理
      • 配置servlet类成为异步的servlet类
      • 具体实现
      • 异步监听器
      • 改进的ServletAPI(上传文件)

在这里插入图片描述


Servlet3.0新特性全解

tomcat 7以上的版本都支持Servlet 3.0

在这里插入图片描述

Servlet 3.0 新增特性

  1. 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;
  2. 支持Web模块;
  3. Servlet异步处理;
  4. 文件上传API简化;

Servlet3.0的注解

  1. @WebServlet :修饰Servlet类,用于部署该Servlet类。
  2. @WebFilter:修饰Filter类,用于部署该Filter类
  3. @WebInitParam:与@WebServlet或@WebFilter注解连用,为它们配置参数
  4. @MultipartConfig:修饰Servlet类,指定该Servlet类负责处理multipart/form-data类型的请求(主要用于处理上传文件)
  5. @ServletSecurity:修饰Servlet类,与JAAS(Java验证和授权API)有关的注解
  6. @HttpConstrait:与@ServletSecurity连用
  7. @HttpMethodConstrait:与@ServletSecurity连用

示例代码片
修饰过滤器Filter:

@WebFilter(
        filterName="log",
        urlPatterns={"/*"},
        initParams={
        @WebInitParam(name="encoding",value="GBK"),
        @WebInitParam(name="loginPage",value="/login.jsp")
        })
public class MyFilter implements Filter {
    //内容省略......
}

修饰Servlet

@WebServlet(name="test",
    urlPatterns={"/basic.do"},
    initParams={
        @WebInitParam(name="userName",value="peter"),
        @WebInitParam(name="age",value="100")
        })
public class TestServlet extends HttpServlet{
    //内容省略....
}

修饰监听器Listener:

@WebListener
public class MyRequestListener implements ServletRequestListener{
    //内容省略...
}

Servlet3.0的Web模块支持

  1. 原来一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差。现在可通过Web模块来部署管理它们。
  2. Web模块对应一个Jar包,即Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中。
  3. 每个模块都有自己的配置文件,这个配置文件的名称为 web-fragment.xml 。
  4. 制作一个Servlet模块的步骤:
    1. 正常编写Servlet,并编译;
    2. 将此编译class文件及所在包通过jar包命令打成jar包;
    3. 将此jar包用winrar打开,将META-INF中的manifest删除后添加 web-fragment.xml;
    4. 将此jar包放入WEB-INF\lib中即可;
  5. 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
    7. 值得注意的是,web.xml中用<absolute-ordering>标签指定的模块加载顺序将会覆盖web模块的web-fragment.xml文件中指定的加载顺序。
  6. 如何用myEclipse打jar包(有些人不知道)
    右键你web项目里的编写的servlet(或filter或listener)类——>Export…——>JAR file——>NEXT——>(Browse)填写导出名字和存放位置——>finish
    这样就生成了我们需要的jar包了
  7. 示例
    servlet类代码片:
@WebServlet(value = "/hello/snow")
public class HelloWorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("DO GEt..." + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }

}

访问:
在这里插入图片描述

servlet3.0提供的异步处理

提供异步原因

​ 在以前的servlet中,如果作为控制器的servlet调用了一个较为耗时的业务方法,则servlet必须等到业务执行完后才会生成响应,这使得这次调用成了阻塞式调用,效率比较差

实现异步原理

​ 重新开一个线程单独去调用耗时的业务方法。

配置servlet类成为异步的servlet类

  1. 通过注解asyncSupported=true实现
  2. 通过web.xml配置
<servlet>
        <servlet-name>test1</servlet-name>
        <servlet-class>com.zrgk.servlet.AsyncServlet</servlet-class>
        <async-suppored>true</async-suppored>       
    </servlet>
    <servlet-mapping>
        <servlet-name>test1</servlet-name>
        <url-pattern>/basic.do</url-pattern>
    </servlet-mapping>

具体实现

java代码:

@WebServlet(name="AsyncServlet",urlPatterns={"/testAsyn.do"},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");  
       //通过request获得AsyncContent对象
       AsyncContext actx = request.startAsync(); //重点方法**
       //设置异步调用超时时长
        actx.setTimeout(30*3000);  
        //启动异步调用的线程
        actx.start(new MyThread(actx));//重点方法**

       // 直接输出到页面的内容(不等异步完成就直接给页面)
        //但这些内容必须放在标签内,否则会在页面输出错误内容,这儿反正我测试是这样,具体不知对不对??
       PrintWriter out = response.getWriter();
       out.println("<h1>不等异步返回结果就直接返到页面的内容</h1>");  
       out.flush(); 
   }  
}  

//异步处理业务的线程类
public class MyThread implements Runnable {
     private AsyncContext actx;  
     //构造
     public MyThread(AsyncContext actx){  
            this.actx = actx;  
     }  
     public void run(){  
        try{  
            //等待5秒,模拟处理耗时的业务
           Thread.sleep(4*1000); 
           //获得request对象,添加数据给页面
           ServletRequest req = actx.getRequest();
           req.setAttribute("content","异步获得的数据");
           //将请求dispath到index.jsp页面,该页面的session必须设为false
           actx.dispatch("/index.jsp");  
        }catch(Exception e){
            e.printStackTrace();
        }  
     }   
}

​ 页面代码(页头里session设为false,表时该页面不会再创建session):

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>  
  <body>
    <a href="<%=basePath%>/testAsyn.do">测试异步调用</a>
    异步结果:${content}
  </body>
</html>

异步监听器

​ 异步监听器用来监听异步Servlet的异步处理事件,通过实现AsyncListener接口实现,代码如下:

public class MyAsyncListener implements AsyncListener{

    //异步调用完成时触发
    @Override
    public void onComplete(AsyncEvent event) throws IOException {
        // 省略....       
    }

    //异步调用出错时触发
    @Override
    public void onError(AsyncEvent event) throws IOException {
        // 省略....       
    }

    //异步调用开始触发
    @Override
    public void onStartAsync(AsyncEvent event) throws IOException {
        // 省略....       
    }

    //异步调用超时触发
    @Override
    public void onTimeout(AsyncEvent event) throws IOException {
        // 省略....       
    }

}

​ 还需要在异步Servlet里注册异步监听器,即添加如下代码即可:

 actx.addListener(new MyAsyncListener());

​ Filter异步调用与Servlet一样。

改进的ServletAPI(上传文件)

  1. 改进内容

    1. HttpServletRequest增加了对上传文件的支持
    2. ServletContext允许通过编程的方式动态注册Servlet、Filter
  2. HttpServletRequest提供了如下两个方法处理文件的上传

    Part getPart(String name) 根据名称获取文件上传域

    1. Collection<Part> getParts() 获取所有文件上传域
  3. 上传文件时一定要为表单域设置enctype属性,它表示表单数据的编码方式,有如下三个值:

    application/x-www-form-urlencoded (默认),它只处理表单里的value属性值,它会将value值处理成URL编码方式。如果此时表单域里有上传文件的域(type=”file”),则只会获取该文件在上传者电脑里的绝对路径串,该串没什么实际意义。

    1. multipart/form-data 此处编码方式会以二制流的方式来处理表单数据,此时会将文件内容也封装到请求参数里。
    2. texst/plain 当表单的action属性为mailto:URL的形式时比较方便,主要适用于直接通过表单发送邮件的方式
  4. 上传文件的Servlet需要加上@MultipartConfig注解

  5. 通过request获取的Part对象就可以操作文件域了

  6. 示例

@WebServlet(name="uploadServlet",urlPatterns="/upload.do")
@MultipartConfig
public class UploaderServlet extends HttpServlet {

    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
        //获得Par对象(每个Part对象对应一个文件域)
        Part part = request.getPart("file");
        long size = part.getSize(); //获取上传文件大小
        String info = part.getHeader("content-disposition");//获得包含原始文件名的字符串
        //获取原始文件名
        String fileName = info.substring(info.indexOf("filename=\"")+10,info.length()-1);
        //将文件上传到某个位置
        part.write(getServletContext().getRealPath("/uploadFiles")+"/"+fileName);
    }
}

ServletContext 提供了如下方法动态注册Servlet、Filter
addServlet(); 动态注册Servlet
addFilter(); 动态注册Filter
addListener(); 动态注册Listener
setInitParameter(String name ,String value); 为Web应用设置初始化参数。


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

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

相关文章

全球最大开源系统遭“绑架”,华为携国产系统冲出国门,优势尽显

被“绑架”的Linux 在科技飞速发展的今天&#xff0c;开源软件已成为全球技术合作与创新的重要基石。其中大家熟知的开源系统Linux内核项目&#xff0c;自1991年由芬兰学生Linus Torvalds创建以来&#xff0c;一直以其开放性、协作性和透明性著称。它鼓励全球各地的开发者共同…

一体化运维监控管理平台:构建高效、可靠的IT运维体系

在当今数字化转型的浪潮中&#xff0c;企业的IT系统日益复杂&#xff0c;运维工作面临着前所未有的挑战。如何确保IT基础设施的稳定运行&#xff0c;提高运维效率&#xff0c;成为每个企业关注的焦点。为此&#xff0c;我们推出了一体化运维监控管理平台&#xff0c;旨在通过全…

操作系统笔记(五)信号量,经典的IPC问题(读写者问题...)

信号量 一个信号量是一个包含两部分内容的数据结构&#xff1a; (a) 一个整数计数器, COUNT (b) 一个记录阻塞进程ID的队列, Q 信号量有两个原子操作&#xff1a; UP(V操作&#xff09; 和 DOWN (P操作) DOWN(S): if (S.count > 0) S.count …

基于SpringBoot+Vue的前后端分离的大学自动排课系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在这个背景下&#xf…

【IEEE出版|:IEEE Xplore,EI Compendex,Scopus检索|征稿正在进行中!】

第七届机械工程与智能制造国际会议&#xff08;WCMEIM 2024&#xff09; 2024 7th World Conference on Mechanical Engineering and Intelligent Manufacturing 【会议信息】 会议日期&#xff1a;2024年11月15-17日 会议地点&#xff1a;中国武汉&#xff08;武汉纺织大学…

HTMLCSS:3D旋转动画机器人摄像头

效果演示 创建了一个3D机器人摄像头效果。 HTML <div class"modelViewPort"><div class"eva"><div class"head"><div class"eyeChamber"><div class"eye"></div><div class&quo…

ZeroNL2SQL:零样本 NL2SQL

发布于&#xff1a;2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL&#xff08;NL2SQL&#xff09;的转换是一个重要的研究领域&#xff0c;它允许非技术用户轻松访问和分析数据&#xff0c;在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

Qgis 开发初级 《ToolBox》

Qgis 有个ToolBox 的&#xff0c;在Processing->ToolBox 菜单里面&#xff0c;界面如下。 理论上Qgis这里面的工具都是可以用脚本或者C 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析&#xff0c;和arcgis软件类似的。点…

三合一无线键鼠中射频芯片-PHY6233

PHY6233 三合一键鼠芯片在键鼠领域占据着重要的地位。它以其强大的性能和广泛的适用性&#xff0c;成为众多键鼠产品的核心组件。PHY6233 芯片能够提供出色的操作体验。它可以支持多达几乎 100 个按键的支持&#xff0c;满足了用户对多功能键鼠的需求。同时&#xff0c;该芯片还…

基于STM32F103的计秒设计

基于STM32F103的计秒设计 仿真软件&#xff1a; Proteus 8.17 编程软件&#xff1a; Keil 5 仿真实现&#xff1a; 在4位数码管上进行计秒显示&#xff0c;每100ms改变一次数值。 数码管原理&#xff1a; 数码管是一种常用的显示器件&#xff0c;主要用于显示数字和一些字母…

万圣夜,Codigger

在这个神秘的万圣节&#xff0c;让Codigger&#xff0c;一个专业的分布式操作系统&#xff0c;带领你踏入未知的编程世界&#xff01;就像变装成各种角色一样&#xff0c;Codigger也以其独特的能力和技巧&#xff0c;在数字世界中展现无穷魅力。让我们一起在这个神秘的节日里&a…

探索光耦:光耦——光伏逆变器中的智慧守护者

在全球清洁能源的浪潮中&#xff0c;光伏产业正以前所未有的速度蓬勃发展。作为光伏发电系统的核心设备&#xff0c;光伏逆变器扮演着将直流电转化为交流电的关键角色&#xff0c;其性能直接关系到整个系统的效率和安全性。而在这一复杂而精细的转换过程中&#xff0c;光电耦合…

关于AES加密的思考与总结 | 内容详细

今天心血来潮&#xff0c;想把AES加密的内容做一个总结&#xff0c;方便日后观看查阅。 学艺不精&#xff0c;如有错误&#xff0c;欢迎各位老师批评指正&#xff01; AES简介 AES是目前广泛应用的对称加密算法&#xff0c;主要用于保护电子数据。 对称加密&#xff1a;加密…

航顺芯片HK32MCU版图再扩张,深圳南山新基地助力集成电路核心圈突破

【中国&#xff0c;深圳&#xff0c;2024年10月24日】深圳市南山区&#xff0c;作为中国高新技术产业的重要聚集地&#xff0c;一直是集成电路企业的必争之地。近期&#xff0c;深圳市航顺芯片技术研发有限公司&#xff08;下文简称“航顺芯片”&#xff09;随着高精尖人才团队…

qt配置https请求

qt应用版本 windows 32位 先说下心理路程&#xff0c;你能遇到的我都遇到了&#xff0c;你能想到的我都想到了&#xff0c;怎么解决看这一篇就够了&#xff0c;从上午12点到晚上12点几乎没离开电脑&#xff08;除了吃饭&#xff09;&#xff0c;对于openssl这种用的时候无感&am…

LVGL-从入门到熟练使用

LVGL简介 LVGL&#xff08; Light and Versatile Graphics Library &#xff09;是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件&#xff1a;按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等…

【判断推理】翻译推理

7.1 等价推出 等价推出指的是将题干逻辑关系和选项逻辑关系分别翻译后&#xff0c;二者完全一致。考察的是对翻译规则的掌握&#xff0c;常用知识点有命题的传递和原命题、逆否命题等价。 题干中无逻辑关联词的部分不需要关注&#xff0c;直接寻找带有逻辑关联词的语句即可。 …

圣麟易安中医:微搭助力中医诊所实现数字化问诊接诊

“只用了下班时间&#xff0c;每天写一点点&#xff0c;2个月就基于微搭搭建出来了现在问诊小程序和接诊管理后台&#xff0c;大概节约70%的工作量吧” ——项目负责人 邓小静 私人中医诊所也能定制小程序&#xff0c;传统中医诊所如何实现服务流程的智能化和个性化&#x…

基于SSM校园生活电子商城管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;餐厅信息管理&#xff0c;菜品类型管理&#xff0c;闲置物品管理&#xff0c;订单管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xf…

python mac vscode 脚本文件的运行

切换到脚本文件的目录下 路径的修改 当前文件组织形式&#xff1a; 脚本文件在文件夹下&#xff1a; 赋予权限&#xff1a;chmod x ./scripts/fscd_test.sh 运行&#xff1a;./scripts/fscd_test.sh