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的主要新特性如下三部分: 使 ...
随机推荐
- CSS3:CSS3 背景
ylbtech-CSS3:CSS3 背景 1.返回顶部 1. CSS3 背景 CSS3 背景 CSS3中包含几个新的背景属性,提供更大背景元素控制. 在本章您将了解以下背景属性: background ...
- Area--->AreaRegistrationContext.MapRoute
文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 Area--->AreaRegi ...
- (转)coures包下载和安装 可解决报错ImportError: No module named '_curses'
原创文章,转载请注明出处. coures curses 库 ( ncurses )提供了控制字符屏幕的独立于终端的方法.curses 是大多数类似于 UNIX 的系统(包括Linux)的标准部分,而且 ...
- 如何把本地文件上传github
1.$ git config --global user.name "xxx" 2.$ git config --global user.email xxx@qq.com 3.进入 ...
- HDU 5052 /// 树链剖分+线段树区间合并
题目大意: 给定n (表示树有n个结点) 接下来n行给定n个点的点权(在这个点上买鸡或者卖鸡的价钱就是点权) 接下来n-1行每行给定 x y 表示x结点和y结点之间有一条边 给定q (表示有q个询问) ...
- Pathfinding 模板题 /// BFS oj21413
题目大意: Description Bessie is stranded on a deserted arctic island and wants to determine all the path ...
- 9.ActiveMQ理论
一.首先说下什么是消息队列? 1.消息队列是在消息的传输过程中保存消息的容器. 二.为什么要用到消息队列? 主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的inse ...
- Vue——组件上使用v-model
一.最近在工作过程中要实现一个搜索模糊匹配功能,考虑到组件的复用,就单独把搜索框抽出来作为一个子组件.在以往的开发中,我一般会在input框中的值变化时向父组件emit一个事件,并带上一些父组件中需要 ...
- Erlang学习记录:语法和特性
特性 大下排序:number < atom < reference < fun < port < pid < tuple < list < bit st ...
- leetcode-90-子集②
题目描述: 方法一:回溯 class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: nums.s ...