Servlet 3.0 新特性全解

文章目录

  • 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 {@Overrideprotected 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必须设为falseactx.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{//异步调用完成时触发@Overridepublic void onComplete(AsyncEvent event) throws IOException {// 省略....       }//异步调用出错时触发@Overridepublic void onError(AsyncEvent event) throws IOException {// 省略....       }//异步调用开始触发@Overridepublic void onStartAsync(AsyncEvent event) throws IOException {// 省略....       }//异步调用超时触发@Overridepublic 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.rhkb.cn/news/461031.html

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

相关文章

[OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来

前言 又到了一年一度大家最爱的探会文章&#xff0c;非常荣幸收到OceanBase官方的邀请参加2024 OceanBase 年度发布会&#xff0c;作为一个经常参加线下探会的博主&#xff0c;每一次体验都有所不同&#xff0c;每一次新技术的突破都让人感到无比兴奋。同时&#xff0c;作为数…

【论文复现】短期电力负荷

作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 短期电力负荷 论文发表问题背景一. 基本问题二. 本论文发现的问题 对于论文发现问题的解决方案&#xff1a;复现…

Java-I/O框架:FileReader类使用、FileWriter类的使用、字符流复制文件

视频链接&#xff1a;16.19 字符流复制文件_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p19 1.FileReader类&#xff08;文件字符输出流&#xff09;使用 pac…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

网安秋招面试

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

Python小游戏14——雷霆战机

首先&#xff0c;你需要确保安装了Pygame库。如果你还没有安装&#xff0c;可以使用pip来安装&#xff1a; bash pip install pygame 代码如下&#xff1a; python import pygame import sys import random # 初始化Pygame pygame.init() # 设置屏幕大小 screen_width 800 scr…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

Python3 No module named ‘pymysql‘

在使用python3链接数据库时&#xff0c;总是提示 No module named pymysql 错误&#xff0c;执行pip3 install pymysql后&#xff0c;提示安装成功&#xff0c;但是执行py文件还是提示此错误。 使用python2 执行时&#xff0c;链接数据库正确&#xff0c;百思不得其解 先使用…

SpringBoot调用SOAP接口步骤详解。

1、引入依赖 <dependency><groupId>org.springframework.ws</groupId><artifactId>spring-ws-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</ar…

移远通信闪耀2024香港秋灯展,以丰富的Matter产品及方案推动智能家居产业发展

10月27-30日&#xff0c;2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信再次亮相&#xff0c;并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…

【万户软件-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

107. 阴影范围.shadow.camera

上篇文章2.平行光阴影计算讲解过&#xff0c;通过光源的阴影相机属性.shadow.camera,来控制阴影的渲染范围&#xff0c;本节课继续.shadow.camera的讲解。 平行光阴影相机属性.shadow.camera回顾 平行光DirectionalLight的.shadow属性是平行光阴影对象DirectionalLightShadow…

SpringBoot3+SpringSecurity6基于若依系统整合自定义登录流程

SpringBoot3SpringSecurity6基于若依系统整合自定义登录流程 问题背景 在做项目时遇到了要对接统一认证的需求&#xff0c;但是由于框架的不兼容性&#xff08;我们项目是springboot3&#xff0c;jdk17&#xff0c;springsecurity6.1.5&#xff09;等因素&#xff0c;不得不使…

如何解决品牌商和经销商对接的难题

本文分享知名啤酒商大品牌公司如何和经销商的数据进行对接 某啤酒商业务场景&#xff1a;品牌商例如某啤酒商需要推广自己的订货商城助力全国的各大经销商提高营销竞争力 如何解决核心问题之一&#xff1a;商城打通ERP&#xff1f; 根据调研&#xff0c;经销商ERP系统分布情况&…

书生-第四期闯关:完成SSH连接与端口映射并运行hello_world.py

端口映射完成后&#xff0c;访问127.0.0.1&#xff1a;7860成功展示如下界面&#xff1a; 书生浦语大模型实战营 项目地址&#xff1a;https://github.com/InternLM/Tutorial/

ValueError: Object arrays cannot be loaded when allow_pickle=False

文章目录 问题解决方法1&#xff1a;allow_pickleTrue解决方法2&#xff1a;降低numpy版本错误原因&#xff1a;python和numpy版本不兼容 问题 Traceback (most recent call last): File “D:\project\test_st\retrieval\read_npy.py”, line 4, in data np.load(‘mosi0__le…

聆听用户声音的3个方法,挖掘客户真实潜在需求

聆听用户反馈&#xff0c;去挖掘用户真实需求的重要性是企业非常重要的意向工作之一&#xff0c;因为它直接关联到企业的产品开发、市场定位、客户满意度以及最终的商业成果。了解并满足用户的真实需求可以帮助企业创造更有价值的产品和服务&#xff0c;提升用户体验&#xff0…

docker离线安装达梦数据库

文章目录 下载达梦数据库docker镜像上传DM8镜像文件将DM8镜像导入到本地docker镜像仓库中查看本地docker镜像仓库是否存在DM8镜像带参数启动DM8docker启动DM8默认用户名/密码 下载达梦数据库docker镜像 达梦数据库官网 https://www.dameng.com/ 点击下载中心&#xff0c;选择D…

产品宣传册制作成电子产品宣传册用什么软件?

​随着科技的飞速发展&#xff0c;电子产品已经渗透到我们生活的方方面面&#xff0c;电子宣传册作为一种新兴的传播媒介&#xff0c;受到企业的青睐。将传统的纸质产品宣传册制作成电子宣传册&#xff0c;不仅能够降低成本、提高传播效率&#xff0c;还能更好地满足消费者的阅…

linux之网络子系统- TCP连接建立过程 三次握手四次挥手

一、相关实际问题 为什么服务端程序都需要先listen一下半连接队列和全连接队列长度如何确定“Cannot assign requested address”这个报错是怎么回事一个客户端端口可以同时用在两条连接上吗服务端半/全连接队列满了会怎么样新连接的soket内核对象是什么时候建立的建立一条TCP…