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的主要新特性如下三部分: 使 ...
随机推荐
- HDU-6070 Dirt Ratio(二分+线段树+分数规划)
目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 原题目描述在最下面. 求\(sum/len\)最小值.\(sum\)是一段区间内不同数字的 ...
- 机械手相机9点坐标标定-基于C#+EmguCV
很多初学者,都对标定概念模糊不清,分不清坐标系之间的关系,搞不清相机标定和机械手相机标定有什么关系,想当初自己也是一个人摸索了很久,本文将尽量给大家解释. 我们通常所说的相机标定分为两种,一种是相机参 ...
- 李宏毅机器学习课程---2、Regression - Case Study
李宏毅机器学习课程---2.Regression - Case Study 一.总结 一句话总结: 分类讨论可能是比较好的找最佳函数的方法:如果 有这样的因素存在的话 模型不够好,可能是因素没有找全 ...
- (干货)java中如何根据一个时间获取属于本年那一周,本周的开始时间以及最后一天时间。并且设置起始时间为周6.结束时间为周5
本人亲测,有用,适用性比较强,直接上代码说话. package com.helloBike.data; import java.text.ParseException; import java.tex ...
- iOS开发UIResponder简介API
#import <Foundation/Foundation.h> #import <UIKit/UIKitDefines.h> #import <UIKit/UIEve ...
- StringUtils里的isEmpty方法和isBlank方法的区别
原文地址:https://blog.csdn.net/a1102325298/article/details/80410740 isEmpty public static boolean isEmpt ...
- 使用Beyond Compare作为Perforce默认的文件比较工具
使用perforce自带的文件比较工具有时候会遇到乱码的情况,如下: 暂时不知道如何解决上述问题,因此想换个文件比对工具,比如Beyond Compare. 设定位置:Edit->prefere ...
- 了解Metasploit中的Payloads(有效载荷)
什么是payload? payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等.也有人把payloads称 为shellcode. Shellco ...
- python list基本操作一
a = [1,2,3,1,2,3] 一.删除元素 1.按索引删除: a.pop(1) # 删除第二个值 # in:[1,2,3,2] # out:[1,3,2] 返回值:被删除的元素,这个时候list ...
- Rabbit MQ 客户端 API 进阶
之前说了一些基础的概念及使用方法,比如创建交换器.队列和绑定关系等.现在我们再来补充一下细节性的东西. 备份交换器 通过声明交换器的时候添加 alternate-exchange 参数来实现. Con ...