Filter&Listener
第一章 Filter 过滤器
1-1 过滤器概述_画图说明过滤器执行原理
过滤字符编码
1-2编写过滤器的步骤_使用过滤器过滤字符编码
见代码注释
package com.buvu.filter;
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;
/*
*
- 过滤器的创建步骤:
- 1.创建一个普通的java类,实现javax.servlet.Filter接口
- 2.重写doFilter方法
-
该方法就是过滤中的用来处理过滤器业务的方法
-
相当于servlet中的doGet/doPost方法
- 3.修改方法中的变量名
-
req resp chain
- 4.完成过滤业务
- 5.在web.xml中对过滤器进行配置工作
-
配置在所有servlt的上方
- 6.在执行完过滤业务之后,需要对请求进行放行操作
*/
public class Filter1 implements Filter{
/*@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter1对象创建了");
}*/
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//完成字符编码的过滤
System.out.println("进入到了Filter1");
/*req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");*/
//将请求放行
chain.doFilter(req, resp);
//servlet响应回来 又经过了过滤器
System.out.println("响应回来又经过了filter1");
}
/*@Override
public void destroy() {
System.out.println("filter1对象销毁了");
}*/
}
package com.bh.filter;
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;
public class Filter2 implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("进入到了Filter2");
//将请求放行
chain.doFilter(req, resp);
System.out.println("响应回来又经过了Filter2");
}
}
1-3 过滤器的生命周期(了解)
创建:启动服务器
销毁:关闭服务器
1-4过滤器中配置多个servlet的方式
1-5过滤器的url-pattern
与servlet一样,也有4种表现形式.
与servlet不同的是,如果我们发出的请求与多个filter的url-pattern都匹配,那么这些匹配的filter都执行(servlet只选择一个优先级高的执行),执行的顺为按照web.xml的上下的配置顺序来执行.
1-6过滤器链的作用
过滤器链:chain
执行过滤器链:chain.doFilter(req,resp)
过滤器链的作用是,当我们执行了过滤器链(执行放行代码),将请求放行的地点在于下面还有没有匹配的过滤器,如果有,则将请求放行到下一个匹配的过滤器,如果没有匹配的过滤器了,则将请求放行到目标servlet.
1-7 实战:使用过滤器拦截请求
拦截请求
package com.wuwu.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
private DBUtil(){}
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static final String url = "jdbc:mysql://localhost:3306/test";
private static final String user = "root";
private static final String password = "root";
//创建连接 返回连接
public static Connection getConn() throws SQLException{
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
//关闭相关资源
public static void myClose(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException{
//关闭资源的顺序为 按照创建的顺序 逆序关闭
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
}
package com.uu.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("在此过滤器中验证有没有登录过");
/*
* 取得session对象
* 从session对象中取username
* 根据username是否为null,判断有没有登陆过
* 不为null:登录过
* 为null:没登录过
*/
/*
* 我们现在要用的是HttpServletRequest
* 我们现在有的是ServletRequest
*
* 以上二者为子父接口的关系
* ServletRequest是父亲
* HttpServletRequest是儿子
*
* 我们现在要用的是儿子
* 我们现在有的是父亲
*
* 父亲转儿子的过程
*
*/
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
/*
* 判断请求路径
* 如果请求路径为/login.do,则自动放行请求
* 如果请求路径为其他xxx.do,则验证有没有登陆过
*/
//如何取得请求路径 url-pattern
String path = request.getServletPath();
System.out.println(path);
if("/login.do".equals(path)){
chain.doFilter(req, resp);
}else{
HttpSession session = request.getSession();
String username = (String)session.getAttribute("username");
//登录过
if(username!=null){
//将请求放行到目标servlet
chain.doFilter(req, resp);
//没登录过
}else{
//重定向到登录页
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
}
}
package com.wkcto.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wkcto.util.DBUtil;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行登录操作");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
/*
* 账号密码成功的接收到了
* 接下来,连jdbc,去表中查看账号密码是否正确
*/
/*
* 将需要的变量事先都声明好
* 搭建jdbc相关的try catch finally 结构
* 在以上结构中填充代码
*
*/
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//查询一个东西有没有 使用查询条数count(*)是最快的
String sql = "select count(*) from tbl_user where username=? and password=?";
boolean flag = true;
try{
conn = DBUtil.getConn();
ps = conn.prepareStatement(sql);
/*
* ps对象创建完毕后,养成好习惯,观察你的sql语句,如果有?,需要使用ps对象为?赋值
*/
ps.setString(1,username);
ps.setString(2,password);
//执行sql语句 返回结果集
rs = ps.executeQuery();
if(rs.next()){
//表示取得的是select关键字后面查询的第一项信息
int count = rs.getInt(1);
/*
* count:0 表示没有查询出来对应的账号和密码 登录失败
* count:1 表示查询出来了一条对应的账号和密码 登录成功
* count>1 表示查询到了,但是表中有多余的垃圾数据 登录失败
*
*/
if(count!=1){
flag = false;
}
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try {
DBUtil.myClose(conn, ps, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* 以上就是完成了登录的业务逻辑,根据账号密码的正确与否来决定标记位flag是true还是false
* 以下我们就根据flag,来决定登录成功还是失败
*/
//登录成功
if(flag){
request.getSession().setAttribute("username",username);
response.sendRedirect(request.getContextPath() + "/student/list.do");
//登录失败
}else{
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.wkcto.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.wkcto.util.DBUtil;
public class StudentAddServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/html/student/add.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.wkcto.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.wkcto.util.DBUtil;
public class StudentEditServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/html/student/edit.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.wkcto.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class StudentListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/html/student/index.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第二章 Listener 监听器(了解)
2-1什么是监听器
监听器就是一个java类,用来起到监听作用,当java中的其他组件或功能在发生变化时,所作出的提醒或操作。
2-2监听器都能监听什么
监听域对象的创建与销毁
监听域对象属性值创建更换与销毁
2-3 监听器的创建步骤
监听三个域对象的创建和销毁
ServletContextListener
ServletRequestListener
HttpSessionListener
package com.wkcto.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*
*
- 创建监听器的步骤:
- 1.创建一个普通的java类,实现监听接口
-
监听什么就需要实现响应的接口
-
比如我们现在要监听上下文对象的创建与销毁,那么我们就需要实现ServletContextListener这个接口
- 2.重写监听方法
- 3.将方法中的参数修改为event
-
event的作用是可以取得监听到的域对象
- 4.完成方法体
- 5.将监听器在web.xml中进行配置
-
配置的位置通常是在servlet的上面,filter的下面
*/
public class Listener1 implements ServletContextListener{
/*
* 该方法用来监听上下文对象的创建
* 如果上下文对象创建了,则马上执行该方法
*/
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("上下文对象创建了");
}
/*
* 该方法用来监听上下文对象的销毁
* 如果上下文对象销毁了,则马上执行该方法
*/
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("上下文对象销毁了");
}
}
package com.wkcto.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class Listener2 implements ServletRequestListener{
@Override
public void requestInitialized(ServletRequestEvent event) {
System.out.println("request对象创建了");
}
@Override
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("request对象销毁了");
}
}
package com.wkcto.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class Listener3 implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("session对象创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session对象销毁了");
}
}
第二章 Listener 监听器(了解)
2-1什么是监听器
监听器就是一个java类,用来起到监听作用,当java中的其他组件或功能在发生变化时,所作出的提醒或操作。
2-2监听器都能监听什么
监听域对象的创建与销毁
监听域对象属性值创建更换与销毁
2-3 监听器的创建步骤
监听三个域对象的创建和销毁
ServletContextListener
ServletRequestListener
HttpSessionListener