zoukankan      html  css  js  c++  java
  • 过滤器与监听器 ----【javaweb-10】

    Filter && Listener

    1、过滤器

      过滤器:阻碍一些不符合要求的数据。

      常用在处理中文乱码、登录验证等

      1.1、初步使用Filter

      案例:我们将会通过Filter处理中文乱码

      代码展示:

        在这里,要注意继承的Filter接口是servlet的!以及三个固定的方法要写,还有filterChain也要写(作为中间商)

    package com.charles.fillter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFillter implements Filter {
    
        // 初始化
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncoding初始化");
        }
    
        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");
    
            System.out.println("执行前");
            // 让我们的请求继续走,不写则停下(中间商)
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("执行后");
        }
    
        // 销毁
        public void destroy() {
            System.out.println("CharacterEncoding销毁");
        }
    }

      在web.xml中注册filter

      这里注意<url-pattern>的意思是 servlet下的所有请求都要经过这个过滤器

        <filter>
            <filter-name>CharacterEncodingFillter</filter-name>
            <filter-class>com.charles.fillter.CharacterEncodingFillter</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>CharacterEncodingFillter</filter-name>
            <url-pattern>/servelet/*</url-pattern>
        </filter-mapping>

      1.2、简单的登录案例

      首先,我们先编写一个静态初始化参数,用来进行登录时对用户的验证

    package com.charles.util;
    
    public class Constant {
        public final static String Servelet_Name = "Servelet_Name";
    }

      然后,我们编写过滤器:用来建议用户名是否为空

    package com.charles.fillter;
    
    import com.charles.util.Constant;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class SysFillter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            if (request.getSession().getAttribute(Constant.Servelet_Name) == null){
                response.sendRedirect("/error.jsp");
            }
    
            filterChain.doFilter(request,response);
        }
    
        public void destroy() {
    
        }
    }

      之后,我们开始依次编写Servlet(登录检验、注销后的跳转)

    package com.charles.servelet;
    
    import com.charles.util.Constant;
    
    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 LoginServelet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
    
            if (username.equals("admin")){ // 登陆成功
                req.getSession().setAttribute(Constant.Servelet_Name, req.getSession().getId());
                resp.sendRedirect("/sys/success.jsp");
            } else { // 登陆失败
                resp.sendRedirect("/error.jsp");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    package com.charles.servelet;
    
    import com.charles.util.Constant;
    
    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 LoginOut extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Object attribute = req.getSession().getAttribute(Constant.Servelet_Name);
    
            if (attribute != null){
                req.getSession().removeAttribute(Constant.Servelet_Name);
                resp.sendRedirect("/Login.jsp");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }

      注册Servlet和Filter

        <servlet>
            <servlet-name>LoginServelet</servlet-name>
            <servlet-class>com.charles.servelet.LoginServelet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>LoginServelet</servlet-name>
            <url-pattern>/servlet/login</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>LoginOutServlet</servlet-name>
            <servlet-class>com.charles.servelet.LoginOut</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>LoginOutServlet</servlet-name>
            <url-pattern>/servlet/loginout</url-pattern>
        </servlet-mapping>
    
        <filter>
            <filter-name>SysFilter</filter-name>
            <filter-class>com.charles.fillter.SysFillter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>SysFilter</filter-name>
            <url-pattern>/sys/*</url-pattern>
        </filter-mapping>

      最后,依次编写网页(登录网页、登录后的网页、错误网页)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="/servlet/login" method="post">
        用户名:<input type="text" name="username">
        <input type="submit" value="登陆">
    </form>
    </body>
    </html>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>登陆成功!!</h1>
    
    <p> <a href="/servlet/loginout">注销</a> </p>
    
    </body>
    </html>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <h1>登陆失败!</h1>
    <h3>失败原因:1.无权限 2.用户名错误</h3>
    
    <a href="Login.jsp">返回登录页面</a>
    
    </body>
    </html>

      运行Tomcat后,结果展示:

      1、登录成功的效果

      2、登录失败的效果

    2、监听器

      监听器用的比较少,这里用一个简单的案例来展示一下即可。

    案例:监听访问该网页的次数,并打印内容次数至网页上

    代码展示:

    package com.charles.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    // 统计网站在线人数: 方法:统计session
    public class OnlineCountListener implements HttpSessionListener {
    
        // 创建session监听
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
            Integer onlineCount =(Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount == null){
                onlineCount = new Integer(1);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count++);
            }
            ctx.setAttribute("onlineCount", onlineCount);
        }
    
        // 销毁session监听
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
            Integer onlineCount =(Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount == null){
                onlineCount = new Integer(0);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count--);
            }
            ctx.setAttribute("onlineCount", onlineCount);
        }
    }

      注册listener(这里注意,注册只需要写代码的路径即可)

        <listener>
            <listener-class>com.charles.listener.OnlineCountListener</listener-class>
        </listener>

      网页设计

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h1>当前有 <span style="color: red"><%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></span>人在线</h1>
      </body>
    </html>

    结果展示:

  • 相关阅读:
    VS2005入门.Net2.0系列视频教程181级打包下载
    Asp.Net2.0视频教程 之 WebPart概述 [视频]
    MemberShip,角色,WebPart在web.config文件中的参数简述
    vs2005入门 .Net2.0视频教程 之 SQL查询语法基础 [视频]
    关于进期教程发布事宜通告
    从我博客的访客地域分布分析看我国学.net的人
    《Vs2005网站编程》目录雏形
    Asp.Net2.0视频教程 之 WebPart 一 [视频]
    vs2005入门 .Net2.0视频教程 之 浅尝存储过程[视频]
    vs2005视频教程 之 TreeView高级使用 [视频]
  • 原文地址:https://www.cnblogs.com/Charles-H/p/Learning_Web_10.html
Copyright © 2011-2022 走看看