Filter/Listener

574 篇文章 4 订阅
272 篇文章 1 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值