补充Listener&Filter_hm&BeanUtils
监听器Listener
内部机制其实是接口回调机制

Session的在一定时间内钝化配置
1. 在tomcat里面 conf/context.xml 里面配置
对所有的运行在这个服务器的项目生效
2. 在conf/Catalina/localhost/context.xml 配置
对 localhost生效。 localhost:8080
3. 在自己的web工程项目中的 META-INF/context.xml
只对当前的工程生效。
<!--maxIdleSwap : 1分钟不用就钝化--> <!--directory : 钝化后的那个文件存放的目录位置。--> <!--D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\自定义--> <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="自定义"/> </Manager> </Context>
Filter
Filter执行顺序
如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器不放行,那么后面排队的过滤器以及servlet都不会收到请求。
1、全路径匹配 以 / 开始:/LoginServlet
2、以目录匹配 以 / 开始 以 * 结束:/demo01/*
-
3、以后缀名匹配 以 * 开始 以后缀名结束:
-
*.jsp *.html *.do
dispatcher 设置
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。
ERROR : 页面出错发生跳转
INCLUDE : 包含页面的时候就拦截。
示例:自动登录
step1:创建登录页面login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form method="post" action="${pageContext.request.contextPath }/loginServlet"> 账号:<input type="text" name="username"> <br/> 密码:<input type="password" name="password"> <br/> <input type="checkbox" name="auto_login">自动登录<br/> <input type="submit" value="登录"> </form> </body> </html>
step2:引入jar包和配置文件
数据库驱动jar包、c3p0数据库连接池jar包、DBUtils的jar包、JSTL的jar包

c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- default-config 默认的配置, --> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost/stu</property> <property name="user">root</property> <property name="password">tiger</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> <!-- This app is massive! --> <named-config name="oracle"> <property name="acquireIncrement">50</property> <property name="initialPoolSize">100</property> <property name="minPoolSize">50</property> <property name="maxPoolSize">1000</property> <!-- intergalactoApp adopts a different approach to configuring statement caching --> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him --> <user-overrides user="master-of-the-universe"> <property name="acquireIncrement">1</property> <property name="initialPoolSize">1</property> <property name="minPoolSize">1</property> <property name="maxPoolSize">5</property> <property name="maxStatementsPerConnection">50</property> </user-overrides> </named-config> </c3p0-config>
JDBCUtils.java
package com.cast.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtils { static ComboPooledDataSource dataSource = null ; static { dataSource = new ComboPooledDataSource() ; } public static DataSource getDataSource() { return dataSource ; } /** * 获取连接对象 * @return * @throws SQLException */ public static Connection getConn() throws SQLException{ return dataSource.getConnection(); } /** * 释放资源 * @param conn * @param st * @param rs */ public static void release(Connection conn , Statement st , ResultSet rs){ closeRs(rs); closeSt(st); closeConn(conn); } public static void release(Connection conn , Statement st){ closeSt(st); closeConn(conn); } private static void closeRs(ResultSet rs){ try { if(rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } private static void closeSt(Statement st){ try { if(st != null){ st.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ st = null; } } private static void closeConn(Connection conn){ try { if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } }
step3:Servlet
LoginServlet.java
package com.cast.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.cast.dao.UserDao; import com.cast.dao.impl.UserDaoImpl; import com.cast.domain.User; /** * Servlet implementation class LoginServlet */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //接收请求参数 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username") ; String password = request.getParameter("password") ; String auto_login = request.getParameter("auto_login");//如果checkbox中勾选,则获取到on System.out.println("auto_login:" + auto_login); System.out.println(username + "---" + password); User user = new User(username, password) ; UserDao userDao = new UserDaoImpl() ; User existUser = userDao.login(user) ; if(existUser == null) { //登录失败 request.getRequestDispatcher("/login.jsp").forward(request, response); }else { //登录成功 request.getSession().setAttribute("user", existUser); response.sendRedirect(request.getContextPath()+"/index.jsp"); } } catch (SQLException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
step4:DAO
UserDaoImpl.java
package com.cast.dao.impl; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import com.cast.dao.UserDao; import com.cast.domain.User; import com.cast.utils.JDBCUtils; public class UserDaoImpl implements UserDao { @Override public User login(User user) throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()) ; String sql = "select * from user where username=? and password=?" ; User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword()) ; return existUser; } }
step5:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h3>首页</h3> <c:if test="${not empty user }"> 欢迎您,${user.username } </c:if> <c:if test="${ empty user }"> 你好,请登录 </c:if> </body> </html>
step6:LoginServlet .java
如果用户选择自动登录,则发送将登录信息放入Cookie中
package com.cast.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.cast.dao.UserDao; import com.cast.dao.impl.UserDaoImpl; import com.cast.domain.User; /** * Servlet implementation class LoginServlet */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //接收请求参数 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username") ; String password = request.getParameter("password") ; String auto_login = request.getParameter("auto_login");//如果checkbox中勾选,则获取到on System.out.println("auto_login:" + auto_login); System.out.println(username + "---" + password); User user = new User(username, password) ; UserDao userDao = new UserDaoImpl() ; User existUser = userDao.login(user) ; if(existUser == null) { //登录失败 request.getRequestDispatcher("/login.jsp").forward(request, response); }else { //登录成功 //页面提交上来的时候,是否选择了自动登录 if("on".equals(auto_login)){ //发送cookie给客户端 Cookie cookie = new Cookie("auto_login", username+"#auto#"+password); cookie.setMaxAge(60*60*24*7);//7天有效期 cookie.setPath(request.getContextPath()); response.addCookie(cookie); } request.getSession().setAttribute("user", existUser); response.sendRedirect(request.getContextPath()+"/index.jsp"); } } catch (SQLException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
step7:Filter
AutoLoginFilter .java
package com.cast.utils; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import com.cast.dao.UserDao; import com.cast.dao.impl.UserDaoImpl; import com.cast.domain.User; /** * Servlet Filter implementation class AutoLoginFilter */ public class AutoLoginFilter implements Filter { public AutoLoginFilter() { // TODO Auto-generated constructor stub } public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest request = (HttpServletRequest) req; // 先判断,现在session中还有没有那个userBean. User userBean = (User) request.getSession().getAttribute("userBean"); // 还有,有效。 if (userBean != null) { chain.doFilter(request, response); } else { // 代表session失效了。 // 2. 看cookie。 // 1. 来请求的时候,先从请求里面取出cookie , 但是cookie有很多的key-value Cookie[] cookies = request.getCookies(); // 2. 从一堆的cookie里面找出我们以前给浏览器发的那个cookie Cookie cookie = CookieUtil.findCookie(cookies, "auto_login"); // 第一次来 if (cookie == null) { chain.doFilter(request, response); } else { // 不是第一次。 String value = cookie.getValue(); String username = value.split("#auto#")[0]; String password = value.split("#auto#")[1]; // 完成登录 User user = new User(); user.setUsername(username); user.setPassword(password); UserDao dao = new UserDaoImpl(); userBean = dao.login(user); // 使用session存这个值到域中,方便下一次未过期前还可以用。 request.getSession().setAttribute("user", userBean); chain.doFilter(request, response); } } } catch (Exception e) { e.printStackTrace(); chain.doFilter(req, response); } } public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } }
CookiieUtils.java
package com.cast.utils; import javax.servlet.http.Cookie; public class CookieUtil { /** * 从一个cookie数组中找到具体我们想要的cookie对象 * @param cookies * @param name * @return */ public static Cookie findCookie(Cookie[] cookies , String name){ if(cookies != null){ for (Cookie cookie : cookies) { if(name.equals(cookie.getName())){ return cookie; } } } return null; } }
BeanUtils工具
需要引入两个基本的jar包
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
基本使用(在Servlet中使用)
Map map = request.getParameterMap(); UserBean bean = new UserBean(); BeanUtils.populate(bean, map);
注意:表单域名与Javabean中的属性名要保持一致(这个工具类支持5种数据类型)
类型转换(日期类型转换)
通过表单提交的日期其实是字符串,要转换成Date类型的数据
将String转换为Date的工具类,MyDateConverter .java
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; /** * 自定义 java.util.Date日期转换器 * * */ public class MyDateConverter implements Converter { @Override // 将value 转换 c 对应类型 // 存在Class参数目的编写通用转换器,如果转换目标类型是确定的,可以不使用c 参数 public Object convert(Class c, Object value) { String strVal = (String) value; // 将String转换为Date --- 需要使用日期格式化 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = dateFormat.parse(strVal); return date; } catch (ParseException e) { e.printStackTrace(); } return null; } }
使用方式:
//注册自己的日期转换器,Date是util包 ConvertUtils.register(new MyDateConverter(), Date.class); //转化数据 Map map = request.getParameterMap(); UserBean bean = new UserBean(); 转化map中的数据,放置到bean对象身上 BeanUtils.populate(bean, map);
zwy

浙公网安备 33010602011771号