JavaWeb-6、过滤器、监听器
1、过滤器
在我们编写servlet时会不会有一种这样的苦恼?每一次都要在servlet最开始设置页面的编码,如果项目中servlet少那还可以,但是如果项目中有好几十甚至上百个servlet,那就有点难受了,这时我们可以使用过滤器来设置相应的编码。
编写一个过滤器也是相当的简单,只需要让一个类实现filter接口,并实现其中的方法即可拿到一个过滤器类。
这里我们首先编写一个servlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("你好,脏丽丽!");
}
}
这里我们对他不做编码处理,在过滤器中做。
下面我们编写相关过滤器,我们在过滤器中设置相关的编码
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器正在初始化");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
//相当于把相关请求传给过滤链,如果不写这句话,过滤器将不会继续执行
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
System.out.println("过滤器已经被销毁");
}
}
成为filter类只需要实现Filter接口中三个方法,
这里我们在写完之后需要去web.xml注册servlet和相关过滤器,过滤器的注册方法与servlet类一样
<servlet>
<servlet-name>myserv</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myserv</servlet-name>
<url-pattern>/m/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myserv</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>
<filter>
<filter-name>myfilter</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/m/*</url-pattern>
</filter-mapping>
在filtermapping中的url-pattern属性中添加过滤器执行的页面即可。
这里我们为servlet中添加两个不同映射,一个是走过滤器的,一个是不走过滤器的,我们来看一下结果。
以上是走过滤器的映射,我们发现编码很正常。
没走过滤器的就有乱码嘞…
2、监听器
监听器,众所周知,就是检测我们当前程序动作的一个东西。在jsp中我们一般会监听session的创建以统计当前网址在线的人数,这里也是通过一个小demo让大家了解了解,监听器这里不是重点,大家了解了解即可。
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//继承相关接口
public class Listenner implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
ServletContext sc = httpSessionEvent.getSession().getServletContext();
Integer nowOnlineCount = (Integer) sc.getAttribute("nowOnlineCount");
if(nowOnlineCount==null){
//如果为空,则新建一个
int i = 0;
nowOnlineCount = new Integer(1);
}
else{
int count = nowOnlineCount.intValue();
count++;
nowOnlineCount = new Integer(count);
}
sc.setAttribute("nowOnlineCount",nowOnlineCount);
}
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext sc = httpSessionEvent.getSession().getServletContext();
Integer nowOnlineCount = (Integer) sc.getAttribute("nowOnlineCount");
if(nowOnlineCount==null){
int i = 0;
nowOnlineCount = new Integer(0);
}
else{
int count = nowOnlineCount.intValue();
count++;
nowOnlineCount = new Integer(count);
}
sc.setAttribute("nowOnlineCount",nowOnlineCount);
}
}
这里我们写了一个监听在线人数的监听器,主要是通过session的数目进行人数的监听,写完监听器后要去web.xml中注册
<listener>
<listener-class>Listenner</listener-class>
</listener>
这里只用把对应class写上就好。
在前端再取下对应值
<h1>当前有<span>${pageContext.findAttribute("nowOnlineCount")}</span>人在线</h1>
发现是可以监听成功的!
总之来说!监听器和过滤器在之后的项目开发中是肯定会用到的,这里大家可以先做了解!