文章目录
本文为原创,审核机制抽风,不写转载不让发。
6.JSP拓展 : 过滤器的简单使用
6.1 过滤器概述
6.1.1 什么是过滤器?
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。
主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。
而在实际使用时,就要特别注意过滤链的执行顺序问题;
6.1.2 主要作用
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
所以我们可以利用过滤器,在我们每次真正处理页面请求之前,设定request的编码这样我们就不用挨个servlet设置编码了;
6.2 过滤器概述
6.2.1 创建一个过滤器
在项目的util包中点击鼠标右键,选择 “new” --> “other”
在弹出的窗口中 输入 filter,选择Filter 点击 “next”
在弹出的页面中输入过滤器名称
输入名称后点击 “Finish” 即可
输入代码:
package com.hnxy.web;
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 EncodingFitler implements Filter {
public EncodingFitler() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
6.2.2 过滤器方法介绍
1.public void init(FilterConfig filterConfig) throws ServletException
由 Web 容器调用,指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。在要求过滤器做任何过滤工作之前,init 方法必须成功完成。如果 init 方法抛出 ServletException或没有在 Web 容器定义的时间段内返回,则 Web 容器无法将过滤器放入服务中。这个和Servlet的生命周期有点类似,也是只初始化一次,destroy()也是执行一次。
2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException
每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许 Filter 将请求和响应传递到链中的下一个实体。
此方法的典型实现遵循以下模式:
3.public void destroy()
由 Web 容器调用,指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次,或者在过了超时期之后调用。
在调用此方法之后,Web 容器不会再对此过滤器实例调用 doFilter 方法。
此方法为过滤器提供了一个清除持有的所有资源(比如内存、文件句柄和线程)的机会,并确保任何持久状态都与内存中该过滤器的当前状态保持同步。
6.2.3 过滤器简单使用
1) 修改拦截规则,打开web.xml找到过滤器的配置部分(和servlet很像就是名称不一样)
<filter>
<display-name>EncodingFitler</display-name>
<filter-name>EncodingFitler</filter-name>
<filter-class>com.hnxy.web.EncodingFitler</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFitler</filter-name>
<url-pattern>/EncodingFitler</url-pattern>
</filter-mapping>
url-Pattern 设置拦截过则 /* 代表任何对servlet的请求 过滤器都要先拦截处理后再交给具体servlet
<filter>
<display-name>EncodingFitler</display-name>
<filter-name>EncodingFitler</filter-name>
<filter-class>com.hnxy.web.EncodingFitler</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFitler</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2) 编写doFilter方法
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置请求流编码
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
完成效果
package com.hnxy.web;
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.annotation.WebFilter;
public class EncodingFitler implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置请求流编码
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
3) 测试
页面 :
<%@ 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>
<div>
<form action="Test1Action" method="post">
<p>
请输入名称 : <input type="text" name="userName" />
</p>
<p>
<button type="submit">提交</button>
</p>
</form>
</div>
</body>
</html>
servlet :
package com.hnxy.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test1Action 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 {
System.out.println(request.getParameter("userName"));
}
}
我们可以看到,现在servlet没有对数据做任何参数上的处理,如果没有过滤器是这样的:
设置过滤器前
6.3 过滤器实战-druid的web监控页面配置
其实我们学习过滤器主要是学过滤器的原理与配置,以后需要我们自己写过滤器的时候很少,都是别的技术写好过滤器我们引用即可,就好比我们现在使用的数据源
druid就是其中之一,druid数据源不光有出色的数据库连接的管理功能,它还有很强悍的web管理功能!现在我们就来简单配置一个druid的web管理功能
很简单一共修改两个地方即可
1) 修改数据库连接类打开SQLweb统计功能
package com.hnxy.utils;
import java.sql.SQLException;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 数据库连接工具类
* @author My
*/
public class JdbcUtil {
// 创建数据库的连接对象
private static final String CONN_DRIVER = "com.mysql.jdbc.Driver";
private static final String CONN_URL = "jdbc:mysql://127.0.0.1:3306/userdb?characterEncoding=UTF-8";
private static final String CONN_USER = "root";
private static final String CONN_PASSWORD = "root";
// 创建数据源对象
private static DruidDataSource dataSource = new DruidDataSource();
// 赋值
static{
dataSource.setDriverClassName(CONN_DRIVER);
dataSource.setUrl(CONN_URL);
dataSource.setUsername(CONN_USER);
dataSource.setPassword(CONN_PASSWORD);
// 开启SQL语句的统计功能
try {
dataSource.addFilters("stat");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 添加获取数据源的方法
* @return
*/
public static DruidDataSource getDataSource() {
return dataSource;
}
}
2) web.xml中加入druid的核心servlet和过滤器即可
<!-- Druid,监控数据库,以及WEB访问连接信息 -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern></url-pattern>
</filter-mapping>
<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>admin123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
配置好之后正常开启tomcat,正常访问项目,你会发现加不加都没有什么问题!你可以先玩一会儿项目,然后在访问下面的地址
http://127.0.0.1:8080/javaweb_class3_tp2/druid
你就会发现druid的管理界面了
我们设置的是 用户名 admin 密码 admin123 输入即可登录
登录后显示druid的监控主页面,主页面中可以查看当前数据源,SQL语句性能监控,web 请求URL和HttpSession的监控
SQL监控页面
HTTP URL监控:
到此,我们JavaEE的web基础阶段全部完事!