监听三大作用域创建和监听器
ServletContextListener
例子
package com.peng.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("context Destory");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("context Init");
}
}
com.peng.listener.MyServletContextListener
HttpSessionListener
主要功能:整个会话的生命周期共享数据
package com.peng.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session create!!!");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session destory!!!");
}
}
com.peng.listener.MySessionListener
ServletRequestListener
主要功能:一次请求和一次响应的过程中共享数据
package com.peng.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("destory ServletRequestListener");
}
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("init ServletRequestListener");
}
}
com.peng.listener.MyRequestListener
ServletContextAttributeListener
package com.peng.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextListener implements
ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0) {
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// getValue为旧值
// 获取新值 arg0.getServletContext().getAttribute(arg0.getName());
}
}
HttpSessionAttributeListener
package com.peng.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent arg0) {
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
}
ServletRequestAttributeListener
package com.peng.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class MyRequestSAttributeListener implements
ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent arg0) {
}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
}
}
使javabean自己感知在session域中的变化HttpSessionBindingListener(加入,移除)
注:javabean实现这个接口,重写方法;web.xml中无须配置
package compeng.javabean;
import java.io.Serializable;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class PersonBinding implements Serializable, HttpSessionBindingListener {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void valueBound(HttpSessionBindingEvent arg0) {
// 加入
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
// 移出
}
}
使javabean自己感知在session域中的变化HttpSessionActivationListener(钝化,活化)
活化回来时,对象不是同一个,只是携带的信息一样而已
package compeng.javabean;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
class PersonBinding implements Serializable, HttpSessionActivationListener {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sessionDidActivate(HttpSessionEvent arg0) {
// 序列化
}
public void sessionWillPassivate(HttpSessionEvent arg0) {
// 反序列化
}
}
例子
package com.easymall.listener;
import javax.servlet.ServletContextEvent;
public class ServletContextListener implements
javax.servlet.ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// 将项目路径移除
arg0.getServletContext().removeAttribute("app");
}
public void contextInitialized(ServletContextEvent arg0) {
// 将项目的路径存到app这个变量中
arg0.getServletContext().setAttribute("app",
arg0.getServletContext().getContextPath());
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
${requestScope.message}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
文件上传
name:
请选择文件:
FileUpServlet
package com.peng.ser;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUpServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
/* 上传文件逻辑 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
File file = new File(savePath);
// 判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + "目录不存在,需要创建");
// 创建目录
file.mkdir();
}
// 消息提示
String message = "";
try {
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
// 设置文件的大小
upload.setFileSizeMax(2 * 1024 * 102);// 设置单个文件的最大值
upload.setSizeMax(50 * 1024 * 1024);// 设置总的文件的总的大小
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List集合,每一个FileItem对应一个Form表单的输入项
List list = upload.parseRequest(request);
for (FileItem item : list) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
// 解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
// value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
} else {// 如果fileitem中封装的是上传文件
// 得到上传的文件名称,
String filename = item.getName();
System.out.println(filename);
if (filename == null || filename.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename
.substring(filename.lastIndexOf("\\") + 1);
// 获取文件名的UUID
String uuid_fileName = UUID.randomUUID().toString() + "_"
+ filename;
// 哈希目录--利用文件的名称生成8层文件夹
String hashCod_8 = Integer.toHexString(uuid_fileName
.hashCode());
while (hashCod_8.length() < 8) {
hashCod_8 = "0" + hashCod_8;
}
for (int i = 0; i < hashCod_8.length(); i++) {
savePath += "\\" + hashCod_8.charAt(i);
}
File dir = new File(savePath);
dir.mkdirs();
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + "\\"
+ uuid_fileName);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) != -1) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// + filename)当中
out.write(buffer, 0, len);
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
message = "文件上传成功!";
}
}
} catch (Exception e) {
message = "文件上传失败!";
e.printStackTrace();
}
request.setAttribute("message", message);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}