简述网站设计的原则,学校网站建,南京seo新浪,电子工程网名提示#xff1a;这两个东西听起来似乎很难#xff0c;实际上是非常简单的#xff0c;按照要求写就行了#xff0c;一定不要被新名词给吓到了。 JavaWeb中的Filter#xff08;过滤器#xff09; 一、Filter#xff08;过滤器#xff09;1.如何编写 Filter2.Filter 中的细… 提示这两个东西听起来似乎很难实际上是非常简单的按照要求写就行了一定不要被新名词给吓到了。 JavaWeb中的Filter过滤器 一、Filter过滤器1.如何编写 Filter2.Filter 中的细节3.Filter 总结 二、Listener监听器1.Servlet规范中提供的监听器2..如何实现 Listener3.Listener 应用场景 一、Filter过滤器
Filter 可以在 Servlet 这个目标程序执行之前添加代码。也可以在目标 Servlet 执行之后添加代码。之前之后都可以添加过滤规则。一般情况都是在过滤器中编写公共代码。 1.如何编写 Filter 第一步编写一个 Java 类实现一个接口jarkata.servlet.Filter。并且实现这个接口当中的方法。 init方法在Filter对象第一次被创建之后调用并且只调用一次。默认方法可以不实现doFilter方法只要用户发送一次请求则执行一次。发送N次请求则执行N次。在这个方法中编写过滤规则。必须实现这个方法 注意 chain.doFilter(request, response);这个代码是必须要写的这行代码的作用是执行下一个过滤器或者执行目标Servlet的。如果不写那么就无法执行目标Servlet。在chain.doFilter(request, response); 前写的代码是在目标Servlet执行前执行的在chain.doFilter(request, response); 后写的代码是在目标Servlet执行后执行的。 destroy方法在Filter对象被释放/销毁之前调用并且只调用一次。 默认方法可以不实现 public class LoginCheckFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {HttpServletRequest request (HttpServletRequest) servletRequest;HttpServletResponse response (HttpServletResponse) servletResponse;//获取请求路径String servletPath request.getServletPath();if(true){//在目标Servlet执行前执行的代码System.out.println(Servlet执行前......)filterChain.doFilter(request,response);//一定不能少的代码//在目标Servlet执行后执行的代码System.out.println(Servlet执行后......)} else {response.sendRedirect(request.getContextPath()); //返回网站的首页}}
}第二步在web.xml文件中对Filter进行配置。这个配置和Servlet很像。或者使用注解WebFilter({“*.do”}) filterfilter-namefilter2/filter-namefilter-classcom.gdb.javaweb.servlet.Filter2/filter-class
/filter
filter-mappingfilter-namefilter2/filter-nameurl-pattern*.do/url-pattern
/filter-mapping2.Filter 中的细节
Filter的生命周期 和Servlet对象生命周期一致。唯一的区别Filter默认情况下在服务器启动阶段就实例化。Servlet不会。Servlet是单例的。Filter也是单例的。单实例。 关于Filter的优先级 ① 注意Filter的优先级天生的就比Servlet优先级高。 例如/a.do 对应一个Filter也对应一个Servlet。那么一定是先执行Filter然后再执行Servlet。 ② 在web.xml文件中进行配置的时候Filter的执行顺序 依靠filter-mapping标签的配置位置越靠上优先级越高。过滤器的调用顺序遵循栈数据结构。 ③ 使用WebFilter的时候Filter的执行顺序 按照类名的字典序的顺序执行。 ④ 总结在程序编译阶段不会确定Filter调用顺序。因为Filter的调用顺序是配置到web.xml文件中的只要修改web.xml配置文件中filter-mapping的顺序就可以调整Filter的执行顺序。显然Filter的执行顺序是在程序运行阶段动态组合的。 这种设计模式被称为责任链设计模式。 关于Filter的配置路径 /a.do、/b.do、/dept/save。这些配置方式都是精确匹配。/* 匹配所有路径。*.do 后缀匹配。不要以 / 开始/dept/* 前缀匹配。 目标Servlet是否执行取决于两个条件 第一在过滤器当中是否编写了chain.doFilter(request, response); 代码。 执行下一个过滤器如果下面没有过滤器了执行最终的Servlet。 第二用户发送的请求路径是否和Servlet的请求路径一致。
3.Filter 总结
过滤器是使用责任链设计模式实现的。 责任链设计模式最大的核心思想在程序运行阶段动态的组合程序的调用顺序。 可以使用过滤器来实现验证用户是否登录防止未登录访问我们服务器中的数据。 二、Listener监听器
监听器是 Servlet 规范中的一员。就像 Filter 一样。Filter 也是 Servlet 规范中的一员。在 Servlet 中所有的监听器接口都是以 “Listener” 结尾。注意所有监听器中的方法都是不需要javaweb程序员调用的当某个特殊的事件发生特殊的事件发生其实就是某个时机到了。之后被web服务器自动调用。
1.Servlet规范中提供的监听器
jakarta.servlet包下 ServletContextListenerServletContextAttributeListenerServletRequestListenerServletRequestAttributeListener jakarta.servlet.http包下 HttpSessionListenerHttpSessionAttributeListener 该监听器需要使用WebListener注解进行标注。该监听器监听的是什么是session域中数据的变化。只要数据变化则执行相应的方法。主要监测点在session域对象上。 HttpSessionBindingListener 该监听器不需要使用WebListener进行标注。假设User类实现了该监听器那么User对象在被放入session的时候触发bind事件User对象从session中删除的时候触发unbind事件。假设Customer类没有实现该监听器那么Customer对象放入session或者从session删除的时候不会触发bind和unbind事件。 HttpSessionIdListener session的id发生改变的时候监听器中的唯一一个方法就会被调用。 HttpSessionActivationListener 监听session对象的钝化和活化的。钝化session对象从内存存储到硬盘文件。活化从硬盘文件把session恢复到内存。 ServletContextListener、ServletRequestListener、HttpSessionListener 这三个监听器都提供了两个时间点一个是域对象创建的时候另一个是域对象销毁的时候。ServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListener 这三个监听器都提供了三个时间点一个是往域中添加数据的时候一个是删除域中数据的时候另一个是修改域中的数据的时候。
2…如何实现 Listener
第一步编写一个类实现 ServletContextListener 接口以这个接口为例而已。并且实现里面的方法。void contextInitialized(ServletContextEvent event)
void contextDestroyed(ServletContextEvent event)第二步在 web.xml 文件中对 ServletContextListener 进行配置。或者用注解 WebListener。listenerlistener-classcom.bjpowernode.javaweb.listener.MyServletContextListener/listener-class
/listener3.Listener 应用场景
请编写一个功能记录该网站实时的在线用户的个数。 我们可以通过服务器端有没有分配 session 对象因为一个 session 代表了一个用户。有一个 session 就代表有一个用户。如果你采用这种逻辑去实现的话session 有多少个在线用户就有多少个。这种方式的话HttpSessionListener 够用了。session 对象只要新建则 count然后将 count 存储到 ServletContext 域当中在页面展示在线人数即可。 业务发生改变了只统计登录的用户的在线数量这个该怎么办 session.setAttribute(“user”, userObj);用户登录的标志是 session 中曾经存储过 User 类型的对象。那么这个时候可以让 User 类型的对象实现 HttpSessionBindingListener 监听器只要 User 类型对象存储到 session 域中则 count然后将 count 存储到 ServletContext 对象中。页面展示在线人数即可。 public class User implements HttpSessionBindingListener {private String username;private String password;//有参构造、无参构造、toString方法、set和get方法Overridepublic void valueBound(HttpSessionBindingEvent event) {//用户登陆//User类型的对象向session中存储//获取ServletContextServletContext application event.getSession().getServletContext();//获取在线人数Object onlineCount application.getAttribute(onlineCount);if (onlineCount null){application.setAttribute(onlineCount,1);}else {int count (Integer)onlineCount;count;application.setAttribute(onlineCount,count);}}Overridepublic void valueUnbound(HttpSessionBindingEvent event) {//退出登陆//User类型的对象从session域中删除//获取ServletContextServletContext application event.getSession().getServletContext();//获取在线人数Integer onlineCount (Integer) application.getAttribute(onlineCount);onlineCount--;application.setAttribute(onlineCount,onlineCount);}