首页 > 编程语言 >java项目实践-jsp-finter-监听器-day19

java项目实践-jsp-finter-监听器-day19

时间:2023-10-21 12:22:16浏览次数:36  
标签:java void http finter javax 监听器 import servlet public

目录

1. jsp

servle逻辑处理方便 html页面表现麻烦
jsp 页面表现方便 但是逻辑处理麻烦

JSP
是一种页面技术 JSP本质上是servlet类 通过JSP引擎翻译成servlet
jsp 约等于 java+html
注意:jsp不是访问静态的html文件

index.jsp修改成如下代码:

<%--
  Created by IntelliJ IDEA.
  User: chenw
  Date: 2023/10/19
  Time: 22:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,java.lang.*" pageEncoding="utf-8" %>

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <%
    int i = new Random().nextInt(10);
    if(i>5){
  %>
  <b>今天天气很好 !</b>
  <%}else{
  %>
  <b>今天天气不好~~</b>
  <%}%>
  </body>
</html>

2. 过滤器


作用:
分析请求 对请求的数据进行预处理
阻止请求的进行
web资源的协作
修改请求他的内容

servlet1

response.getWriter().write("学习 filter1");

servlet2

response.getWriter().write("学习 filter2");

启服务 访问
http://localhost:8080/learningfilter/serv1
http://localhost:8080/learningfilter/serv2
都会有乱码
如何用filter解决

new filter

web.xml增加如下配置

    <filter>
        <filter-name>SetEncodingFilter</filter-name>
        <filter-class>com.msb.filter.SetEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SetEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

所有的请求都需要经过 SetEncodingFilter处理

public class SetEncodingFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

没有中文乱码了

用过滤启 来做一个登录拦截 条件是session里面含有user
LoginFilter

package com.msb.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Auther: jack.chen
 * @Date: 2023/10/21 - 10 - 21 - 10:36
 * @Description: ${PACKAGE_NAME}
 * @version: 1.0
 */
public class LoginFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpSession session = ((HttpServletRequest)req).getSession();

        if(session.getAttribute("user") == null){
            ((HttpServletResponse)resp).sendRedirect("login.jsp");

        }else{
            chain.doFilter(req, resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>SetEncodingFilter</filter-name>
        <filter-class>com.msb.filter.SetEncodingFilter</filter-class>
    </filter>
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.msb.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>SetEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>LearningServlet1</servlet-name>
        <servlet-class>com.msb.servlet.LearningServlet1</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LearningServlet2</servlet-name>
        <servlet-class>com.msb.servlet.LearningServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LearningServlet1</servlet-name>
        <url-pattern>/serv1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>LearningServlet2</servlet-name>
        <url-pattern>/serv2.do</url-pattern>
    </servlet-mapping>
</web-app>

登录 http://localhost:8080/learningfilter/serv2.do 则调到 login.jsp

再次登录
http://localhost:8080/learningfilter/serv2.do
响应正常

3. listener 监听器

监听器的作用:
监听一些共享对象属性值的变化 或者事件的发生前后 做出响应的响应 类似 触发器
这些共享对象有:
ServletContext 对象 全局唯一的tomcat启动时创建 停止时销毁
HttpSession对象
ServletRequest 对象

servlet

package com.msb.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Auther: jack.chen
 * @Date: 2023/10/21 - 10 - 21 - 11:40
 * @Description: ${PACKAGE_NAME}
 * @version: 1.0
 */
public class ListenerServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        // request对象设置属性
        request.setAttribute("learning", "listener");

        //servletContext对象添加属性
        ServletContext context = this.getServletContext();
        context.setAttribute("servlet_key", "servlet_value");

        // 设置session
        HttpSession session = request.getSession();
        session.setAttribute("sess_key", "sess_value");

        response.getWriter().write("Learning Listener !");

    }
}

listener

package com.msb.listener; /**
 * @Auther: jack.chen
 * @Date: 2023/10/21 - 10 - 21 - 11:45
 * @Description: ${PACKAGE_NAME}
 * @version: 1.0
 */

import javax.servlet.*;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class MyListener1 implements ServletRequestListener, ServletRequestAttributeListener,
        ServletContextListener, ServletContextAttributeListener,
        HttpSessionListener, HttpSessionAttributeListener

{


    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        // request对象 属性增加

        // 将设置的属性打印
        System.out.println(servletRequestAttributeEvent.getName());
        System.out.println(servletRequestAttributeEvent.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        // request对象 属性移除
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        // request对象 属性重新设置
        // 将设置的属性打印
        System.out.println(servletRequestAttributeEvent.getName());
        System.out.println(servletRequestAttributeEvent.getValue());
    }

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        // request对象 创建

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        // request对象 销毁
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        // servletContext 对象添加属性
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        // servletContext 对象移除属性
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        // servletContext 对象 替换属性
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //  servletContext 对象创建  tomcat启动时创建一次 全局共享
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        //  servletContext 停止时销毁
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        // session 对象 添加属性
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        // session 对象 移除属性
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        // session 对象 修改属性

    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        // session 对象被创建
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        // session 对象销毁
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>com.msb.listener.MyListener1</listener-class>
    </listener>
    <servlet>
        <servlet-name>ListenerServlet</servlet-name>
        <servlet-class>com.msb.servlet.ListenerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ListenerServlet</servlet-name>
        <url-pattern>/serv1</url-pattern>
    </servlet-mapping>
</web-app>

用listener实现在线人数的统计
不同的浏览器分别访问

page.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
当前在线人数:${applicationScope.count}
</body>
</html>

listener

package com.msb.listener; /**
 * @Auther: jack.chen
 * @Date: 2023/10/21 - 10 - 21 - 12:07
 * @Description: ${PACKAGE_NAME}
 * @version: 1.0
 */

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class CountListener implements ServletContextListener,
        HttpSessionListener, HttpSessionAttributeListener {

    // Public constructor is required by servlet spec
    public CountListener() {
    }

    // -------------------------------------------------------
    // ServletContextListener implementation
    // -------------------------------------------------------
    public void contextInitialized(ServletContextEvent sce) {
      /* This method is called when the servlet context is
         initialized(when the Web application is deployed). 
         You can initialize servlet context related data here.
      */
        ServletContext servletContext = sce.getServletContext();
        // 设置初始值
        servletContext.setAttribute("count", 0);
    }

    public void contextDestroyed(ServletContextEvent sce) {
      /* This method is invoked when the Servlet Context 
         (the Web application) is undeployed or 
         Application Server shuts down.
      */
    }

    // -------------------------------------------------------
    // HttpSessionListener implementation
    // -------------------------------------------------------
    public void sessionCreated(HttpSessionEvent se) {
        /* Session is created. */
        ServletContext servletContext = se.getSession().getServletContext();
        // 获取servletContext对象count属性
        int count = (int)servletContext.getAttribute("count");
        // +1之后设置回去
        servletContext.setAttribute("count", ++count);
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        /* Session is destroyed. */
        ServletContext servletContext = se.getSession().getServletContext();
        // 获取servletContext对象count属性
        int count = (int)servletContext.getAttribute("count");
        // -1之后设置回去
        servletContext.setAttribute("count", --count);
    }

    // -------------------------------------------------------
    // HttpSessionAttributeListener implementation
    // -------------------------------------------------------

    public void attributeAdded(HttpSessionBindingEvent sbe) {
      /* This method is called when an attribute 
         is added to a session.
      */
    }

    public void attributeRemoved(HttpSessionBindingEvent sbe) {
      /* This method is called when an attribute
         is removed from a session.
      */
    }

    public void attributeReplaced(HttpSessionBindingEvent sbe) {
      /* This method is invoked when an attibute
         is replaced in a session.
      */
    }
}

标签:java,void,http,finter,javax,监听器,import,servlet,public
From: https://www.cnblogs.com/cavalier-chen/p/17778774.html

相关文章

  • javaparser java 源码扫描解析
    参考文档:https://www.bilibili.com/read/cv22893728/ 使用到的以来:<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.25.5</version></dependency>......
  • 基于Java的健身运动网站设计与实现
    (文章目录)具体实现截图主要功能:基于java(ssm)健身运动网站系统系统分为用户和管理员两个角色用户的主要功能有:1.用户注册和登陆系统2.查看健身知识3.查看健身器材介绍信息4.查看健身教练,在线预约教练5.查看健身课程,在线购买课程信息6.查看健身商品信息,在线购买健身商品,......
  • Java零基础入门-常量
    前言在学习Java语言的过程中,常量是一个非常重要的概念。它不仅在代码中被广泛应用,而且在Java面试中也是被常问到的知识点。因此,本篇文章将着重介绍Java中常量的相关知识,希望能够帮助Java初学者更好地掌握这个概念。摘要本文主要介绍Java中的常量。首先,我们将讲解常量的概念和作......
  • Java零基础入门-包装类
    前言Java是一种广泛使用的面向对象编程语言,它通过JVM(Java虚拟机)来实现跨平台。如果您刚刚开始学习Java编程语言,那么您可能会发现Java中的包装类是一个挑战。本文将对Java中的包装类进行详细介绍,以帮助您更好地理解Java编程语言。摘要在Java编程语言中,包装类用于将基本数据类型转......
  • Java零基础入门-自动拆箱
    前言Java作为目前最流行的编程语言之一,受到广泛的关注和应用。但是对于零基础的Java初学者来说,由于其语言复杂度较高,入门难度较大。特别是在处理数据类型时,自动拆箱这个概念更是容易让人产生困惑。因此,本文旨在对Java中的自动拆箱进行详细讲解,帮助初学者更好地理解和运用Java语言......
  • 10.18 Java异常处理2
     以上便是Java中异常的基本代码结构,其中,Java中所有异常都派生于excption以下是jdk中与异常相关的类。 ......
  • Java 实现结巴分词
    pom.xml引入结巴分词maven依赖<dependency> <groupId>com.huaban</groupId> <artifactId>jieba-analysis</artifactId> <version>1.0.2</version></dependency>测试@Testpublicvoidtest(){StringgoodsNa......
  • 10.17 Java异常处理1
     eg:importjavax.swing.*;classAboutException{publicstaticvoidmain(String[]a){inti=1,j=0,k;k=i/j;try{k=i/j;//Causesdivision-by-zeroexception//thrownewException("Hello.Exception!&quo......
  • 从零开始的Java编程:教你如何实现“超级马里奥”游戏!
    引言超级马里奥,这个名字对于游戏迷来说一定不陌生。它是一款经典的游戏系列,以一个勇敢的水管工人——马里奥为主角,讲述了他在蘑菇王国中的冒险故事。在这个充满挑战和刺激的游戏中,玩家需要控制马里奥跳跃、躲避障碍物,并与邪恶的蘑菇和食人花敌人战斗,最终抵达城堡的胜利之地。游......
  • Java 自定义脱敏注解实现
    自定义注解packagecom.yunmeng.iot.common.desensitization.annotation;importcom.fasterxml.jackson.annotation.JacksonAnnotationsInside;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;importcom.yunmeng.iot.common.desensitization.enums.Secr......