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 新增特性
- 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;
- 支持Web模块;
- Servlet异步处理;
- 文件上传API简化;
Servlet3.0的注解
- @WebServlet :修饰Servlet类,用于部署该Servlet类。
- @WebFilter:修饰Filter类,用于部署该Filter类
- @WebInitParam:与@WebServlet或@WebFilter注解连用,为它们配置参数
- @MultipartConfig:修饰Servlet类,指定该Servlet类负责处理multipart/form-data类型的请求(主要用于处理上传文件)
- @ServletSecurity:修饰Servlet类,与JAAS(Java验证和授权API)有关的注解
- @HttpConstrait:与@ServletSecurity连用
- @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模块支持
- 原来一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差。现在可通过Web模块来部署管理它们。
- Web模块对应一个Jar包,即Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中。
- 每个模块都有自己的配置文件,这个配置文件的名称为 web-fragment.xml 。
- 制作一个Servlet模块的步骤:
- 正常编写Servlet,并编译;
- 将此编译class文件及所在包通过jar包命令打成jar包;
- 将此jar包用winrar打开,将META-INF中的manifest删除后添加 web-fragment.xml;
- 将此jar包放入WEB-INF\lib中即可;
- web-fragment.xml说明:
<web-fragment>
为根元素;<name></name>
表示模块名称(模块的唯一标识);<ordering></ordering>
定义模块加载顺序的标签,当然可以不设置模块加载顺序;<before><others/></before>
表示在所有模块前面加载(第一个加载);<after><name>A</name></after>
表示在A模块后面加载;- 可以在里面部署listener、filter、servlet
- 值得注意的是,web.xml中用
<absolute-ordering>
标签指定的模块加载顺序将会覆盖web模块的web-fragment.xml文件中指定的加载顺序。
- 如何用myEclipse打jar包(有些人不知道)
右键你web项目里的编写的servlet(或filter或listener)类——>Export…——>JAR file——>NEXT——>(Browse)填写导出名字和存放位置——>finish
这样就生成了我们需要的jar包了 - 示例
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类
- 通过注解asyncSupported=true实现
- 通过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(上传文件)
-
改进内容
- HttpServletRequest增加了对上传文件的支持
- ServletContext允许通过编程的方式动态注册Servlet、Filter
-
HttpServletRequest提供了如下两个方法处理文件的上传
Part getPart(String name)
根据名称获取文件上传域Collection<Part> getParts()
获取所有文件上传域
-
上传文件时一定要为表单域设置enctype属性,它表示表单数据的编码方式,有如下三个值:
application/x-www-form-urlencoded (默认),它只处理表单里的value属性值,它会将value值处理成URL编码方式。如果此时表单域里有上传文件的域(type=”file”),则只会获取该文件在上传者电脑里的绝对路径串,该串没什么实际意义。
- multipart/form-data 此处编码方式会以二制流的方式来处理表单数据,此时会将文件内容也封装到请求参数里。
- texst/plain 当表单的action属性为mailto:URL的形式时比较方便,主要适用于直接通过表单发送邮件的方式
-
上传文件的Servlet需要加上@MultipartConfig注解
-
通过request获取的Part对象就可以操作文件域了
-
示例
@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应用设置初始化参数。
相关文章:
Servlet 3.0 新特性全解
文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…...
VUE组件学习 | 五、v-for组件
v-for 指令基础知识 v-for 是 Vue.js 中的一个指令,用于基于源数据多次渲染元素或模板块。它类似于 JavaScript 中的 for 循环。 基本语法 <template><div><!-- 基本列表渲染 --><ul><li v-for"item in items" :key"i…...
uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
手机上有很多组件,需要手机底部弹窗来做选择,picker选择器,select列选择器呀这些,在苹果手机上会被底部nav遮住 采用了好几种配置的方式,多多少少都不太行,还是采用css来做吧,但是css来写想让它生效&#x…...
CentOS9 Stream上安装Edge浏览器
CentOS9 Stream上安装Edge浏览器 1. 下载 Microsoft Edge RPM 包2. 安装 Edge 浏览器3. 启动 Microsoft Edge4. 更新 Microsoft Edge(可选) 如果运行的时候出现错误:[5809:5809:1030/234136.530802:ERROR:zygote_host_impl_linux.cc(101)] Ru…...
el-datepicker此刻按钮点击失效
文章目录 此刻按钮失效原因:使用了禁用未来日期解决办法:重写此刻按钮点击事件代码(包含禁用未来日期和时分秒的处理)框出主要代码(因为包含禁用日期功能)(取你所需) 此刻按钮失效原…...
VUE组件学习 | 六、v-if, v-else-if, v-else组件
v-if、v-else-if 和 v-else 指令基础知识 在 Vue.js 中,v-if、v-else-if 和 v-else 是一组指令,用于根据表达式的值条件性地渲染元素。 基本语法 <template><div><!-- 基础条件渲染 --><h1 v-if"type A">类型 A&l…...
机器学习算法之回归算法
一、回归算法思维导图 二、算法概念、原理、应用场景和实例代码 1、线性回归 1.1、概念 线性回归算法是一种统计分析方法,用于确定两种或两种以上变量之间的定量关系。 线性回归算法通过建立线性方程来预测因变量(y)和一个或多个自变量…...
cordova android 内嵌vue页面 启动页之后白屏问题处理
困扰很久的问题 一直都用splash 做延迟加载 但在 一些android机器上还是会有 这短暂的白屏其实就是vue页面尚未完全渲染的间隙 处理方案 在html中添加 <body><div id"splash-screen" style"position: fixed; top: 0; left: 0; width: 100%; height: 1…...
自研小程序-心情追忆
在近期从繁忙的工作中暂时抽身之后,我决定利用这段宝贵的时间来保持我的Java技能不致生疏,并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face(国内镜像站点:HF-Mirror)上发现了一个关于情感分析的练习项目&…...
【部署与升级-会议签到的web安装】
部署与升级-会议的远程安装 技术路线界面规划flaskAPI以及socketio.emit shellout浏览器和后端交互到处是偶遇 技术路线 运行的基础是Flask-Soketio, 并借鉴了后台运行系统指令的代码 和scrncpy项目,app安装的脚本 #mermaid-svg-8H9rbzbpgpnAXfA3 {font-family:"trebuche…...
【jvm】如何设置新生代和老年代的比例
目录 1. 说明2. 使用-XX:NewRatio参数3. 使用-Xmn参数4. 配置新生区中的Eden区和Survivor区比例5. 综合配置示例6. 注意事项 1. 说明 1.新生代(Young Generation)和老年代(Old Generation)的比例可以通过特定的参数进行设置。2.这…...
系统学习CFD,常见收敛问题、及如何与机器学习相结合
一、如何系统学习CFD 系统学习计算流体力学(CFD)需要按照一定的步骤和层次进行,以下是一个学习路径的建议: 1.基础知识学习: 掌握流体力学的基本原理,包括流体静力学、流体动力学、流体控制方程等。 学习…...
REST架构与实现
一、REST 架构风格 基本概念 REST(Representational State Transfer),即表述性状态转移,是一种软件架构风格。它通过使用标准的 HTTP 方法操作网络上的资源来实现信息交互。在 REST 架构风格中,网络上的一切都被抽象成资源,例如,在一个在线购物系统中,商品、订单、用户…...
AI驱动的低代码未来:加速应用开发的智能解决方案
引言 随着数字化转型的浪潮席卷全球,企业对快速构建应用程序的需求愈发强烈。然而,传统的软件开发周期冗长、成本高昂,往往无法满足快速变化的市场需求。在此背景下,低代码平台逐渐成为开发者和企业的优选方案,以其“低…...
快速上手 Rust——环境配置与项目初始化
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.1 环境配置与项目初始化 1.1.1 安装 Rust 和 Cargo 在开始学习 Rust 之前,首先需要安装 Rust 编程语言及其包管理工具 Cargo。Rust 的安装非常简单,使用官方的安装脚…...
分布式事务Seata-AT模式
1. seata安装 docker 安装 docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP192.168.0.250 \-e SEATA_PORT8091 \seataio/seata-server将安装好的配置文件数据,拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...
编程知识概览
编程,这个在现代社会中无处不在的词汇,已经从最初的计算机专业人士的专属技能,变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送,到复杂的游戏开发、数据分析,编程的应用几乎覆盖了所有领域…...
基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!
往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...
【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 8 (29.0.0) 优化
[TOC](Nextcloud Hub 8 (29.0.0) 优化) Nextcloud 优化是个长期的过程,只能遇到问题解决问题了。遇到的问题和解决办法会逐步的编写完善。 打开 PHP 内存限制 伴随着内容增多,并添加更多的功能,访问 Nextcloud 变慢。通过修改PHP 内存限制&am…...
全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响
摘要:本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战,着重分析了物流环节整合的难点,并以家电行业为例说明了节假日期间物流对企业经营的影响。同时,引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…...
Github 2024-10-24 Go开源项目日报 Top10
根据Github Trendings的统计,今日(2024-10-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:…...
中航资本:锂电行业现分化 优质产能仍然紧俏
2024年前三季度,受轻贱需求增速放缓影响,锂电工业堕入结构性供需错配,产品价格继续低迷,作业盈余全体承压。 当资料端不再稀缺,锂电作业由“卖方商场”转向“买方商场”,工业链博弈天平逐渐向轻贱倾斜。表…...
安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用
00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中,时间与效率直接决定着患者的生命。传统急救模式下,急救人员常通过视频或电话与医院医生进行沟通,以描述患者状况并依照指令行动。然而,这种信息传递方式往往因信息不完整或传递延…...
curl调用微信退款No required SSL certificate was sent
文章目录 前言一、错误一二、错误二 总结 前言 在之前的博客中提到微信证书到期了,需要更换,但是当我更换完证书自信满满的时候,却出现了两个问题,记录一下。 一、错误一 CURL Error: 58unable to load client key: -8178 (SEC_…...
进程守护SuperVisord内部的进程定时监测并重启
一个swoole的wensocket程序运行在SuperVisord下端口9503 设置一个每分钟任务监测9503的端口链接数,输出链接数,并在链接数为0的情况下重启wensocket进程。 以下截图是宝塔面板环境下 #!/bin/bash current$(date %H.%M) ws9503_procnumnetstat -nat | gre…...
[面试题]ES6 Javascript
ES6 箭头函数和普通函数有什么区别? 1)定义方式:箭头函数使用箭头(>)语法,省略了 function 关键字。 2)参数处理:如果只有一个参数,箭头函数可以省略括号。 3)函数体:如果函数体只有一条语句,箭头函数可以省略花括号和 return 关键字 4)…...
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
前言 远程桌面软件对于职场人来说并不陌生,可以说是必备的办公软件之一。在经历过新冠疫情后,大家对于远程办公的认识越来越深入,也就在这段期间,远程桌面软件大范围的应用起来,真正走进大众视野并融入我们的工作和生…...
解决电脑突然没有声音
问题描述:电脑突然没有声音了,最近没有怎么动过系统,没有安装或者卸载过什么软件,也没有安装或者卸载过驱动程序,怎么就没有声音了呢? 问题分析:仔细观察,虽然音量按钮那边看不到什…...
ZFX数字股票全球品牌战略新闻发布会在香港盛大举行
香港,2024年10月26日 —— 在香港这座东方之珠,ZFX集团今日在港岛 海逸君绰酒店隆重举办了“ZFX数字股票全球品牌战略新闻发布会暨世界佳 丽群星闪耀香港见面会”。作为全球数字金融领域的一次盛会,本次活动不 仅展示了ZFX集团在数字资产交易…...
vue中elementUI的el-select下拉框的层级太高修改设置!
项目场景: 项目中遇到一个问题,下拉框选择之后弹出一个弹出框选择数据再关闭。 问题就出在,我打开下拉框后再弹出弹出框,弹出框的 z-index 层级没有 select 的层级高,导致我弹框弹出了几个下拉框还在弹出框上面显示着…...
中国住房和城乡建设网网站/广东深圳疫情最新
注:由麦思博(MSUP)主办的2013年亚太软件研发团队管理峰会(以下简称MPD大会)分别于6月15及6月22日在北京、上海举办,葡萄城的部分程序员参加了上海的会议,本文是参会的一些感受和心得。 今年的大会延续往届模式,以产品创新、团队管…...
建设网站的目的服装类/seo确定关键词
excel如何快速把多个工作表合并到一个excel表excel如何快速把多个工作表合并到一个excel表 有这么一种情况,就是我们有很多张excel,而且excel表里面的公式基本一样,我们就想快速的把这些excel合并在一起,意思在合并在一个excel页面…...
东营市住房和城乡建设委员会网站/google图片搜索引擎入口
知识脉络 并发问题的根源:保证线程安全的三要素 可见性:CPU缓存引起 一个线程对共享变量的修改,另一个线程能立即看见。 现象:一个线程1修改一个变量,会先把变量放到cpu缓存中,但这时,另一个…...
新安网站建设/站长推荐
CompletableFuture Future接口理论知识复习 Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果,取消任务,判断任务是否被取消,判断任务是否完毕等比如主线程让一个子线程取执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程…...
自己动手获取网站访客qq号码/自媒体平台排名
目录 课前测3-字符三角形 程序设计 程序分析 课前测3-字符三角形 【问题描述】 我们学习了编程,通过对程序的控制,可以做一些有趣的输出。 比如,这个题目就是给定一个正整数N,请你输出一个由N行的*组成的三角形。 但是——为了图形的美观,我们希望输出的是一个等…...
有没有淄博张店做兼职工作的网站/营销网站建设方案
IG 夺冠啦!王老板火啦!连王老板吃热狗都吃的如此销魂,那我们当然要来在人群中找到他呢!看到一个美术生的作品,如何 3 秒内找到思聪王。我找了好久啊,这幅图画的真是魔性,看得眼睛都花了…...