9.2.4 HTTP会话监听
-
-
HttpSessionListener
接口
-
contextDestroyed(ServletContextEvent arg0)
通知正在收听的对象,session已经被加载及初始化 -
contextInitialized(ServletContextEvent arg0)
通知正在收听的对象,session已经被载出及初始化
-
9.2.5 Servlet请求监听
- 1.
ServletRequestListener
接口-
requestDestroyed(ServletRequestEvent arg0)
通知正在收听的对象,ServletRequest已经被载出
*requestInitialized(ServletRequestEvent arg0)
通知正在收听的对象, ServletRequest已经被加载及初始化
-
9.2.6 Servlet监听器统计在线人数
9.3 Servlet 3.0新特性
使用注释就无须在web.xml文件中对 Servlet或者过滤器中配置,@ WebServlet
、@WebFilter
、@WebListene
r和@WebInitParam
等
9.3.1 新增注释
- 1.
@WebServlet
属性名 | 类型 | 描述 |
---|---|---|
name | String | 等价于<servlet-name>
|
value | String[] | 等价urlPatterns
|
urlPatterns | String[] | 等价<url-pattern>
|
loadOnStartup | int | 指定 Servlet加载顺序,等价<load-on-startup>
|
initParams | WebInitParam[] | 等价<init-param> |
asyncSupporte | Boolean | 声明 Servlet是否支持异步操作,等价于<async-supported>
|
description | String | 该 Servlet的描述信息,等价于<description>
|
displayName | String | 该 Servlet的显示名,等价<display-name>
|
示例代码
@WebServlet(name="BookServlet",urlPatterns="/BookServlet")
public class BookServlet extends HttpServlet {
...
}
- 2.
@WebFilter
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 等价于<filter-name>
|
value | String[] | 等价urlPatterns
|
urlPatterns | String[] | 等价<url-pattern>
|
servletNames | String[] | 等价于<servlet-name>
|
initParams | WebInitParam[] | 等价<init-param>
|
asyncSupporte | Boolean | 声明 过滤器是否支持异步操作,等价于<async-supported>
|
description | String | 该 过滤器的描述信息,等价于<description>
|
displayName | String | 该 过滤器的显示名,等价<display-name>
|
dispatcherTypes | String | 指定过滤器的转发模式,具体取值包括ASYNC 、ERROR 、FORWARD 、INCLUDE 和REQUEST
|
示例代码
@WebFilter(filterName="AddFilter",urlPatterns="/*")
public class AddFilter implements Filter {
...
}
- 3.
@WebListener
- 4.
@WebInitParam
属性名 | 类型 | 描述 |
---|---|---|
name | String | 等价于<param-name>
|
value | String[] | 等价<param-value>
|
description | String[] | 等价<description>
|
示例代码
@WebFilter(filterName="AddFilter",urlPatterns="/*",initParams=@WebInitParam(name="encoding",value="UTF-8")})
public class AddFilter implements Filter {
...
}
9.3.2 对文件上传的支持
- 需要添加 @MultipartConfig注解
- 从request对象中获取Part文件对象
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
fileSizeThreshold | Int | 是 | 当数据量大于该值时,内容被写入文件 |
location | String | 是 | 存放生成的文件地址 |
maxFileSize | Long | 是 | 允许上传的文件最大值,默认值为-1,表示没有限制 |
maxRequestSize | Long | 是 | 针对multipart/forn-data请求的最大值,默认为-1,表示没有限制 |
- Part getPart(String name)
- Colletion<Part> getParts()
示例代码 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>文件上传演示</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
选择文件<input type="file" name="file1" id="file1"/><br>
<input type="submit"value="上传" name="upload"/>
</form>
</body>
</html>
UploadServlet.java
package com.hwp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取文件上传组件
Part part = request.getPart("file1");
// 获取文件的路径
String header = part.getHeader("content-disposition");
System.out.println(header);
String path = header.substring(header.indexOf("filename=") + 10,
header.length() - 1);
// 获取文件名
String name = getRealName(path);
// 获取文件的存放目录
String dir = getDir(name);
String realPath = this.getServletContext().getRealPath("/upload" + dir);
File file = new File(realPath);
if (!file.exists()) {
file.mkdirs();
}
// 对拷流
InputStream inputStream = part.getInputStream();
FileOutputStream outputStream = new FileOutputStream(new File(file,
name));
int len = -1;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
// 关闭资源
outputStream.close();
inputStream.close();
// 删除临时文件
part.delete();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("文件" + name + "上传成功!");
}
/**
*
*/
/**
* 根据文件的路径获取文件真实名称
*
* @param path
* 文件的路径
* @return 文件名称
*/
public static String getRealName(String path) {
int index = path.lastIndexOf("\\");
if (index == -1) {
index = path.lastIndexOf("/");
}
return path.substring(index + 1);
}
/**
* 根据文件名返回一个目录
*
* @param name
* 文件名称
* @return 目录
*/
public static String getDir(String name) {
int i = name.hashCode();
String hex = Integer.toHexString(i);
int j = hex.length();
for (int k = 0; k < 8 - j; k++) {
hex = "0" + hex;
}
return "/" + hex.charAt(0) + "/" + hex.charAt(1);
}
}
9.3.3 异步处理
配置asyncSupported=true
@WebFilter(urlPatterns="MyFilter",asyncSupported=true)
public class MyFilter implements Filter{
...
}
网友评论