什么是Filter?
Filter,过滤器,就是在页面跳转或者传值时加的一个批处理操作
,例如:,在servlet中利用request接收传值时,很重要的一个问题就是传值乱码问题,通常使用setcharacter()方法进行相应的乱码处理,但是每次都需要写,很麻烦,所以,利用过滤器Filter可以批量进行处理。
Filter作用
当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件web.xml设置的过滤规则,能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。 —— filter实际是一个servlet chaining(servlet 链)
-
在servlet被调用之前截获;
-
在servlet被调用之前检查servlet request;
-
根据需要修改request头和request数据;
-
在servlet被调用之后截获.
-
根据需要修改response头和response数据;
过滤器生命周期的四个阶段:
-
实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。
-
init 初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。
-
dofilter 过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。
-
destory销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。
具体的代码案例
一. 配置
配置dtd文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT gzmvc (ation*)>
<!ELEMENT ation (lt+)>
<!ELEMENT lt (#PCDATA)>
<!ATTLIST ation name ID #REQUIRED class CDATA #REQUIRED>
<!ATTLIST lt name CDATA #REQUIRED>
配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gzmvc SYSTEM "gz.dtd">
<gzmvc>
<ation name="user" class="servlet.LoginServlet">
<lt name="a">a.jsp</lt>
<lt name="b">b.jsp</lt>
</ation>
<ation name="pro" class="servlet.LoginServlet2">
<lt name="a">c.jsp</lt>
<lt name="b">d.jsp</lt>
</ation>
</gzmvc>
dtd xml编写方法见(https://blog.csdn.net/qyh1839568472/article/details/114291972
在web.xml中加入filter配置
<filter>//过滤器实现,以及地址
<filter-name>gzmvc</filter-name>//定义名字
<filter-class>filter.GZFilter</filter-class>//实现类
</filter>
<filter-mapping>
<filter-name>gzmvc</filter-name>
<url-pattern>*.cn</url-pattern>//映射过滤器拦截规则
</filter-mapping>
<context-param>//自己定义的xml文件
<param-name>mvc</param-name>
<param-value>gz.xml</param-value>
</context-param>
filter.GZFilter
package filter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
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 org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import inf.GZAtion;
public class GZFilter implements Filter{
public static HashMap<String, String> ationMap=new HashMap<String, String>();//存储ation中name,class值
public static HashMap<String, String> ltMap=new HashMap<String, String>();//存储lt中name,内容
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse res=(HttpServletResponse) response;
String url=new String(req.getRequestURL());
url=url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));
GZAtion ation=(GZAtion) getAtion(req, url);
if(ation!=null) {
try {
String re=ation.excute(req,res);
String path = ltMap.get(url+"_"+re);
res.sendRedirect(path);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
System.err.println("没有"+url+"项");
}
}
public GZAtion getAtion(HttpServletRequest req,String url) {
GZAtion gz=null;
try {
String xml=req.getServletContext().getInitParameter("mvc");//接收web.xml的文件名称
String file=req.getRealPath("/")+xml;// req.getRealPath("/")得到部署路径
SAXReader sax=new SAXReader();//实例化解析器
Document doc=sax.read(file);//读取文件
Element root =doc.getRootElement();//读取根节点
List<Element> es=root.elements();//读取子节点
for(Element e:es) {//遍历子节点
String aname=e.attributeValue("name");//取出子节点(ation)中 name的值
String cls=e.attributeValue("class");//取出子节点(ation)中 class的值
ationMap.put(aname, cls);//存储
List<Element> es2=e.elements();//读取子节点中的子节点
for(Element e2:es2) {//遍历子节点
String ltname=e2.attributeValue("name");//取出子节点(lt)中 name的值
String path=e2.getText();//读出lt里的*.jsp
ltMap.put(aname+"_"+ltname, path);
}
}
String cls=ationMap.get(url);//通过url子节点(ation)中 class的值
if(cls!=null) {
//反射
Class cl=Class.forName(cls);
gz= (GZAtion) cl.newInstance();//实例化
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return gz;
}
}
inf.GZAtion.java
package inf;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface GZAtion {
public String excute(HttpServletRequest request,HttpServletResponse response)
throws Exception;
}
servlet
package servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import inf.GZAtion;
public class LoginServlet implements GZAtion{
@Override
public String excute(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
return "a";
}
}
package servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import inf.GZAtion;
public class LoginServlet2 implements GZAtion{
@Override
public String excute(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
return "b";
}
}