补充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,如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器不放行,那么后面排队的过滤器以及servlet都不会收到请求。

 配置映射路径

<url-pattern>/*</url-pattern> 写法格式与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>
View Code

 

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>
    
View Code

 

 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;
        }
    }
}
View Code

 

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);
    }

}
View Code

 

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;
    }

}
View Code

 

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>
View Code

 

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);
    }

}
View Code

 

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
    }

}
View Code

 

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;
    }
}
View Code

 

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;
    }
}
View Code

 

使用方式:

//注册自己的日期转换器,Date是util包
ConvertUtils.register(new MyDateConverter(), Date.class);
//转化数据
Map map = request.getParameterMap();
UserBean bean = new UserBean();

转化map中的数据,放置到bean对象身上
BeanUtils.populate(bean, map);

 

 

 

zwy

posted @ 2019-03-01 19:25  zwyk  阅读(62)  评论(0)    收藏  举报