过滤器:
servlet划分为3中类型
1、普通的servlet:用于处理http请求,响应http数据
2、过滤器:对我们的http请求数据进行优化的,过滤的 Filter
3、监听器:监控我们servlet的一些流程和对象的
过滤器Filter:
package com.xingxue.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destory 销毁");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//过滤操作
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
//处理乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//放行
arg2.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init 初始化");
}
}
监听器: 在我们servlet有一种servlet叫Listener,Listener提供了监听我们域对象的创建,销毁,插入,覆盖数据的操作。
监听器实现方式 举例一个
package com.xingxue.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MySessionListener implements HttpSessionAttributeListener{
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session添加了数据");
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session删除了数据");
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("session修改了数据");
// TODO Auto-generated method stub
}
}
此处注意,这些方法都是自动调用的。只要出发该操作,这里的方法就会自动调用
监听器主要是针对我们域对象:存东西
application、session、request
每一个创建、销毁监听器
添加、修改、删除数据的监听器
对于我们来说,
servlet中主要掌握的知识点为:
request对象的作用及概念,常用的方法
request.getRequestDispatcher(“FileListServlet”).forward(request, response);
request.getParameter(“”);
request.setAttribute(“”, “”);
request.getAttribute(“”)
request.setCharacterEncoding(“”);;
response对象的作用及概念,常用方法:
response.setCharacterEncoding("");
response.sendRedirect("");
response.getWriter();
response.getOutputStream()
域对象的概念: application、session、request 的方法及生命周期
过滤器和监听器的概念及作用
web.xml的配置方式
http请求流程
过滤器补充:
过滤器本身也是一个高级servlet,他也可以接收http请求和响应http数据, 但是filter不负责业务逻辑,只负责做一些servlet重复做的工作。
原来请求访问都是直接到servlet,当系统当中又了filter之后,请求会先到filter,然后filter放行了之后在到servlet,所以servlet和filter执行的顺序是先filter后servlet,
创建filter的步奏
1、实现自哦我们的Filter接口,重写3个方法
package com.xingxue.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
//验证用户是否登陆
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
String flag = (String) session.getAttribute("flag");
if("OK".equals(flag)) {
//放行
chain.doFilter(arg0, arg1);
} else {
response.sendRedirect("../login.html");
}
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
核心方法是doFilter,当请求进入Filter,就调用该方法,
然后配置webxml
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.xingxue.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>