Servlet3.0要点小结
1. 注解配置Servlet
@WebServlet
name属性: servlet名称
value属性或urlPatterns属性: servlet映射路径, 可配置多个
initParams属性: 初始化参数, 配合@WebInitParam一起使用
loadOnStartup属性: 为1表示web容器启动时就初始化servlet
测试代码:
/**
* Created by IntelliJ IDEA.
*
* @Auther: ShaoHsiung
* @Date: 2018/9/5 16:36
* @Title: 01 演示@WebServlet的使用
* @Description: name, urlpatterns, initparams(配合@WebInitParam使用), loadOnStartup
*/
@WebServlet(name = "MyWebServlet", urlPatterns = {"/servlet/MyWebServlet", "/servlet/WebServlet"},
initParams = { @WebInitParam(name = "Site :", value = "http://roseindia.net"),
@WebInitParam(name = "Rose", value = "India", description = "detail-info")}, loadOnStartup = 1)
public class MyWebServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = config.getInitParameter(name);
System.out.println("该Servlet的初始化参数为: " + name + "=" + value);
}
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 通知浏览器读取格式
resp.setContentType("text/html;charset=utf-8"); Writer out = resp.getWriter(); out.write("测试Servlet3.0!!!");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2. 注解配置监听器
1. Servlet监听器本质?
实现监听器接口的Java程序, 如实现ServletContextListener接口的Java程序
2. 如何使用注解配置监听器
@WebListener
在Servlet监听器上添加@WebListener
测试代码:
/**
* Created by IntelliJ IDEA.
*
* @Auther: ShaoHsiung
* @Date: 2018/9/5 20:24
* @Title:
* @Description:
*/
@WebListener
public class MyWebListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("监听器初始化");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("监听器销毁");
}
}
3. 注解配置过滤器
@WebFilter
filterName属性: 监听器名称
value属性或urlpatterns属性: 过滤器拦截的url映射, 可配置多个
测试代码:
/**
* Created by IntelliJ IDEA.
*
* @Auther: ShaoHsiung
* @Date: 2018/9/5 17:01
* @Title: 02 演示@WebFilter的使用
* @Description: filterName属性: 过滤器的名称; value或urlpatterns属性: 过滤器拦截的url映射
*/
@WebFilter(filterName = "MyWebFilter", value = "/servlet/MyWebServlet")
public class MyWebFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器执行");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
} @Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
4. 原生文件上传
1. 原生文件上传原理: servlet3.0将multipart/form-data的post请求封装成part对象, 开发者通过part对象来对上传的文件进行操作.
2. @MultipartConfig的作用:
标识servlet支持原生文件上传
测试代码:
/**
* Created by IntelliJ IDEA.
*
* @Auther: ShaoHsiung
* @Date: 2018/9/5 17:07
* @Title: 03 演示servlet3.0原生文件上传
* @Description: 原生文件上传原理: servlet3.0将multipart/form-data的post请求封装成part对象,
* 开发者通过part对象来对上传的文件进行操作.
*/
@WebServlet(urlPatterns = {"/servlet/fileupload"})
@MultipartConfig // 标识servlet支持原生文件上传
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 字符编码设置
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8"); // 获取out对象
PrintWriter out = resp.getWriter(); // 获取上传文件存储路径
String realPath = req.getServletContext().getRealPath("/WEB-INF/upload");
File file = new File(realPath);
if (!file.exists()) {
file.mkdirs();
System.out.println("目录创建成功!");
}
// 通过request对象获取part
Collection<Part> parts = req.getParts();
if (parts.size() == 1) { // 单文件上传
// 通过input标签的name属性获取上传文件
Part part = req.getPart("file1");
// 从请求头中解析文件名称
String header = part.getHeader("content-disposition");
String fileName = getFileName(header);
// 保存文件
part.write(realPath + File.separator + fileName);
} else { // 多文件上传
// 迭代parts
for (Part part : parts) {
// 获取到part对象之后, 操作步骤与单文件上传相同
String header = part.getHeader("content-disposition");
String fileName = getFileName(header);
part.write(realPath + File.separator + fileName);
}
} out.println("上传成功!");
out.close();
} /**
* 从请求头中解析上传文件名
* @param header part的请求头
* @return 上传文件名
*/
public String getFileName(String header) {
String[] tempArr1 = header.split(";");
String[] tempArr2 = tempArr1[2].split("="); String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
return fileName;
}
}
要点:
1) part对象代表一个上传文件
2) 通过request对象获取part对象
3) 由于servlet3.0没有提供直接获取文件名称的方法, 所以文件名称可以通过part对象获取请求头后, 自己解析.
Servlet3.0要点小结的更多相关文章
- 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强
l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { ...
- [Fundamental of Power Electronics]-PART I-2.稳态变换器原理分析-2.5/2.6 多极点滤波器电压纹波估计及要点小结
2.5 含两极点低通滤波器变换器的输出电压纹波估计 在分析包含两极点低通滤波器的变换器如Cuk变换器及Buck变换器(图2.25)输出时,小纹波近似将会失效.对于这些变换器而言,无论输出滤波电容的值是 ...
- Servlet3.0的动态
动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. 动态的添加有两种,一种是基于ContextListener的,另 ...
- Servlet3.0的异步
servlet之前的操作同时同步的,就是按照这样的一个流程来走的: 1.请求根据一个路径路由到一个servlet中, 2.servlet获取一系列的参数 3.执行一系列的逻辑(花费时间所占的比重也更大 ...
- java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet
一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...
- 利用servlet3.0上传,纯原生上传,不依赖任何第三方包
tomcat7里面自带的servlet3.0.jar,支持很多新特性,例如,annotation配置servlet,上传,异步等等.... 如果你的tomcat版本低于7的话,单独在项目中引入serv ...
- cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题
最近在解决XSS注入的问题,由于使用的servlet版本是2.5,不支持httpOnly的属性,故做了个工具类来实现cookie的httpOnly的功能.全类如下: /** * cookie工具类,解 ...
- Servlet3.0中Servlet的使用
目录 1.注解配置 2.异步调用 3.文件上传 相对于之前的版本,Servlet3.0中的Servlet有以下改进: l 支持注解配置. l 支持异步调用. l 直接有对文件上传的支持. 在这篇 ...
- Servlet3.0新特性
1 Servlet3.0新特性概述 使用要求:MyEclipse10.0或以上版本,发布到Tomcat7.0或以上版本,创建JavaEE6.0应用! Servlete3.0的主要新特性如下三部分: 使 ...
随机推荐
- ionic-CSS:ionic 列表
ylbtech-ionic-CSS:ionic 列表 1.返回顶部 1. ionic 列表 列表是一个应用广泛的界面元素,在所有移动app中几乎都会使用到. 列表可以是基本文字.按钮,开关,图标和缩略 ...
- LeetCode 620. Not Boring Movies (有趣的电影)
题目标签: 题目给了我们一个 cinema 表格, 让我们找出 不无聊的电影,并且id 是奇数的,降序排列. 比较直接简单的,具体看code. Java Solution: Runtime: 149 ...
- 关于Mysql分区和分表
[分区概念]分区就是把一张表的数据按照一定的规则分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上.分区后表还是一张表.分区根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.pa ...
- [AH2017/HNOI2017]单旋
题目 \(\rm splay\)水平太差,于是得手玩一下才能发现规律 首先插入一个数,其肯定会成为其前驱的右儿子或者是后继的左儿子,进一步手玩发现前驱的右儿子或者是后继的左儿子一定只有一个是空的,我们 ...
- Cookie自动管理
如果想要对 cookies 干点什么就需要 HTTP Cookie 管理器了. 啥是 cookies 呢.储存在用户本地终端上的数据通常情况下,当用户结束浏览器会话 时,系统将终止所有的 Cookie ...
- 【ASP.Net Core】不编译视图文件
原文:[ASP.Net Core]不编译视图文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aqtata/article/details/818 ...
- sparkStreaming结合SparkSql实例
SparkSQL结合SparkStreaming的使用 Flume+Kafka+SparkStreaming已经发展为一个比较成熟的实时日志收集与计算架构,利用Kafka,即可以支持将用于离线分析的数 ...
- GNU 交叉工具链的介绍与使用
常用工具介绍 名称 归属 作用 armlinuxas binutils 编译 ARM 汇编程序 armlinuxar binutils 把多个.o 合并成一个.o 或静态库(.a) arml ...
- 各种图片特效,你想要吗?你不是真的想要吧?【纯CSS实现】
html部分: <!DOCTYPE html> <html lang="en" class="no-js"> <head> ...
- eclipse导出说明文档
选中项目--右键--Export--Java--Javadoc—Finish 1.为程序添加文档注释 2.选中项目--右键Export--Java--Javadoc--next, 3.next--在V ...