【JavaWeb】Servlet狂神说笔记

Tomcat

安装Tomcat

scoop install tomcat

配置Tomcat

Idea 解决乱码问题

设置%CATALINA_HOME%\conf\logging.properties

java.util.logging.ConsoleHandler.encoding = UTF-8

端口号

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

域名

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

HTTP

什么是HTTP

​ 超文本传输协议

  1. 文本:HTML…….
  2. 超文本: 图片………

HTTPS

​ s: security

Maven

Servrlet

第一个Servlet程序

Servlet类

package com.rjx.firstservlet;

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


public class HelloServlet extends  HttpServlet{
    @Override
    public void init() throws ServletException {
        System.out.println("init");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("do get");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>hello world</h1>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("do post");
        super.doPost(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
    
}

配置文件

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.rjx.firstservlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

Contex

概念及功能

​ web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContex对象,他代表了当前的web应用

  1. 共享数据:不同Servlet间数据共享

获取上下文

this.getServletContext();
Set类
package com.rjx.firstservlet;

import javax.servlet.ServletContext;
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 SetServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        String userName = "passnight";
        context.setAttribute("userName", userName); //将一个数据保存在ServletContext中,形式为(key, value)


    }
}

Get类
package com.rjx.firstservlet;

import javax.servlet.ServletContext;
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 GetServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        String userName = (String) context.getAttribute("userName");
        resp.getWriter().write(userName);
    }
}

配置文件
  <servlet>
    <servlet-name>GetContext</servlet-name>
    <servlet-class>com.rjx.firstservlet.GetServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetContext</servlet-name>
    <url-pattern>/GetServletContext</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>SetContext</servlet-name>
    <servlet-class>com.rjx.firstservlet.SetServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SetContext</servlet-name>
    <url-pattern>/SetServletContext</url-pattern>
  </servlet-mapping>

获取内置的参数

package com.rjx.firstservlet;

import javax.servlet.ServletContext;
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 GetInitParameterByContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = req.getServletContext();

        String initParameter = context.getInitParameter("initParameter");
        resp.getWriter().write(initParameter);
    }
}

配置
  <context-param>
    <param-name>initParameter</param-name>
    <param-value>value of teh initial parameter</param-value>
  </context-param>


  
  <servlet>
    <servlet-name>GetInitParameter</servlet-name>
    <servlet-class>com.rjx.firstservlet.GetInitParameterByContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetInitParameter</servlet-name>
    <url-pattern>/GetInitParameter</url-pattern>
  </servlet-mapping>

请求转发

package com.rjx.firstservlet;

import javax.servlet.ServletContext;
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 DispatcherByContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = req.getServletContext();
        context.getRequestDispatcher("/hello").forward(req,resp);   //转发到/hello
        //跳转到4.1
    }
}

配置文件
  <servlet>
    <servlet-name>DispatcherByContext</servlet-name>
    <servlet-class>com.rjx.firstservlet.DispatcherByContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherByContext</servlet-name>
    <url-pattern>/DispatcherByContext</url-pattern>
  </servlet-mapping>

读取资源文件

package com.rjx.firstservlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class LoadPropertyByContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/db");
        Properties properties = new Properties();
        properties.load(in);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.getWriter().print(username+": "+password);
    }
}

配置文件
  <servlet>
    <servlet-name>LoadPropertyByContext</servlet-name>
    <servlet-class>com.rjx.firstservlet.LoadPropertyByContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoadPropertyByContext</servlet-name>
    <url-pattern>/LoadPropertyByContext</url-pattern>
  </servlet-mapping>

Response

web服务器在接收到客户端的http请求后,针对这个请求会分别创建一个代表请求的对象(Request)和代表相应的(Response)

下载文件

步骤
  1. 获取下载文件路径
  2. 获取下载文件名
  3. 让浏览器支持下载
  4. 获取io流
  5. 下载文件
源代码
package com.rjx.firstservlet.response;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        String path = getServletContext().getRealPath("/sg.jpg");   //can't find, because it's relative to tomcat path
        String path = "D:\\Project\\Test\\Serverlet\\FirstServlet\\src\\main\\resources\\sg.jpg";
        System.out.println("path = " + path);
        String fileName = path.substring(path.lastIndexOf("\\") + 1, path.length());
        resp.setHeader("Content-disposition","attachment;filename="+fileName);

        FileInputStream fileInputStream = new FileInputStream(path);
        int len = 0;
        byte[] buffer = new byte[1024];

        ServletOutputStream out = resp.getOutputStream();
        while((len = fileInputStream.read(buffer)) != -1){
            out.write(buffer,0,len);
        }
        out.close();
        fileInputStream.close();
    }
}

配置文件
  <servlet>
    <servlet-name>FileServlet</servlet-name>
    <servlet-class>com.rjx.firstservlet.response.FileServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>/FileServlet</url-pattern>
  </servlet-mapping>

验证码功能(后端实现)

package com.rjx.firstservlet.response;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器3秒钟刷新一次
        resp.setHeader("refresh", "3");


        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0,0,80,20);

        //将随机数写入图片
        graphics.setColor(Color.BLUE);
        graphics.setFont(new Font(null,Font.BOLD,20));
        graphics.drawString(randomNumber(),0,20);

        //使用这个方式打开
        resp.setContentType("image/png");
        //禁止浏览器缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");

        //将图片写入浏览器
        ImageIO.write(image,"png", resp.getOutputStream());

    }
    //生成随机数
    private String randomNumber(){
        Random random = new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }
}

配置文件
  <servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.rjx.firstservlet.response.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/ImageServlet</url-pattern>
  </servlet-mapping>

重定向

源代码
package com.rjx.firstservlet.response;

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 RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/FirstServlet/hello");
    }

}

配置文件
  <servlet>
    <servlet-name>RedirectServlet</servlet-name>
    <servlet-class>com.rjx.firstservlet.response.RedirectServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>RedirectServlet</servlet-name>
    <url-pattern>/RedirectServlet</url-pattern>
  </servlet-mapping>
重定向与转发的区别
相同点
  1. 实现页面跳转
不同点
    • 转发URL不发生变化
    • 冲定向URL发生变化

利用重定向实现登录功能

源文件
package com.rjx.firstservlet.response;

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 LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("login:get");
        //处理请求
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        System.out.println(userName + " : " + password);
        resp.sendRedirect("/FirstServlet/hello");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("login:post");
    }
}

配置文件
<servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.rjx.firstservlet.response.LoginServlet</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
登录页面
<html>

<body>
<%--${pageContext.request.contextPath}是一段java代码,代表当前项目路径--%>
<form action="${pageContext.request.contextPath}/LoginServlet" method="get">
    user name:<input type="text", name="userName"><br>
    password:<input type="password", name="password"><br>
    <input type="submit">
</form>
</body>
</html>

Request

​ 用户请求的所有信息都会封装到Request中

​ 详情见登录功能

Cookie and Session

两者的异同点

相同点

  1. 保存会话

不同点

    • Cookie是保存在客户端的
    • Session保存在服务端

Cookie

源代码

package com.rjx.firstservlet.Cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        Cookie[] cookies = req.getCookies();

        if (cookies != null){
            writer.write("cookies");
            for (Cookie cookie : cookies){
                writer.write(cookie.getName() + " : " + cookie.getValue());
            }
        }else {
            writer.write("first request and no cookie");
        }

        Cookie cookie = new Cookie("name", "passnight");
        //设置生命周期
        //否则浏览器关闭后浏览器则删除
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

配置文件

  <servlet>
    <servlet-name>FirstCookie</servlet-name>
    <servlet-class>com.rjx.firstservlet.Cookie.FirstCookie</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FirstCookie</servlet-name>
    <url-pattern>/FirstCookie</url-pattern>
  </servlet-mapping>

相关细节

Cookie相关的一些上限
  1. 一个Cookie只能保存一条有效信息
  2. 一个web站点可以给浏览器发送多个Cookie,最多存放20个Cookie
  3. Cookie大小限制在4Kb以内
  4. 浏览器最多保存300个Cookie

Session

源代码

package com.rjx.firstservlet.session;

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;

public class FirstSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");

        HttpSession session = req.getSession();
        session.setAttribute("name", "passinght");
        String id = session.getId();

        if (session.isNew()){
            resp.getWriter().write("session created successfully and the id is " + session.getId());
        }else {
            resp.getWriter().write("the name stored in session is " + session.getAttribute("name"));
            resp.getWriter().write("session already existed and the id is " + session.getId());
        }

    }
}

配置文件

  <servlet>
    <servlet-name>FirstSession</servlet-name>
    <servlet-class>com.rjx.firstservlet.session.FirstSession</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FirstSession</servlet-name>
    <url-pattern>/FirstSession</url-pattern>
  </servlet-mapping>

JSP(Java Server Pages)

基础语法

表达式

<%=

%>

可以使用EL表达式

${}

但是可能会无法显示,需加上

<%@ page isELIgnored="false" %>

jsp脚本片段

<% 
insert you script here
%>
<%
    for (int i = 0; i < 10; i++) {
        out.println(i + "<br>");
    }
%>

jsp声明

<%!

%>
<%!
    static {
        System.out.println("this a static block");
    }
    String var = "hello world";
    public void sayHello() {
    out.println("hello to you");
}
%>

注释

  1. html注释会在客户端显示
  2. jsp注释不在客户端显示

jsp指令

基本语法

<%@ instruction args ......>

include指令

<html>
<body>
<h2>Hello World!</h2>

<hr>
<%--本质上是文件包含,不能包含重名变量--%>
<%@include file="common/foot.jsp"%>
<%--use jsp标签--%>
<%--本质上是函数包含,可以包含重名变量--%>
<jsp:include page="/common/header.jsp"></jsp:include>
</body>
</html>

内置对象

内容
  1. PageContext
  2. Resquest
  3. Response
  4. Session
  5. Application ServletContex
  6. Config ServletConfig
  7. out
  8. page
  9. exception

JSP标签, JSTL标签,EL表达式

依赖

        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式功能

  1. 获取数据
  2. 执行运算
  3. 获取web开发常用对象

JSP标签

页面1
<%--
  Created by IntelliJ IDEA.
  User: 23203
  Date: 2021-8-14
  Time: 17:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
<jsp:forward page="jsptag2.jsp">
    <jsp:param name="key1" value="value1"/>
    <jsp:param name="key2" value="value2"/>
</jsp:forward>
</body>
</html>

页面2
<%--
  Created by IntelliJ IDEA.
  User: 23203
  Date: 2021-8-14
  Time: 17:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 key1 = <%=request.getParameter("key1")%> <br>
 key2 = <%=request.getParameter("key2")%> <br>
</body>
</html>

参数会保留在http路径上

JSTL

使用前要在jsp文件中引入

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="admin"></c:out>

Java Bean

特征

  1. 实体类
  2. 必须要有一个无参构造
  3. 属性必须私有化
  4. 必须有get/set方法

一般用于数据库字段映射

表映射为类,字段映射为属性,行映射为对象

MVC(Model, View, Controller)

定义

控制器(Servlet)

  1. 接受用户请求
  2. 响应可客户端内容
  3. 重定向或转发

视图层(JSP)

  1. 展示数据
  2. 提供操作请求

模型层

  1. 业务操作
  2. 数据库操作

概念图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eup1c4o4-1645076612653)(figures/javaWeb/image-20210814183508783.png)]

过滤器

功能

过滤网站数据

  1. 处理中文乱码
  2. 登录验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88omcbyl-1645076612654)(figures/javaWeb/image-20210814184058659.png)]

处理乱码

Servlet类

package com.rjx.firstservlet.filter;

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 BadEncodingServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好世界");
    }
}

过滤器类

package com.rjx.firstservlet.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    //初始化
    //服务器创建时初始化,可以打印一些日志
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter initialized");
    }
    //过滤编码错误
    @Override
    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("before filter");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("after filter");
    }
    //销毁
    //服务器销毁时销毁,可以打印一些日志
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter destroyed");
    }
}

配置文件

	<servlet>
        <servlet-name>BadEncodingServlet</servlet-name>
        <servlet-class>com.rjx.firstservlet.filter.BadEncodingServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BadEncodingServlet</servlet-name>
        <url-pattern>/BadEncodingServlet</url-pattern>
    </servlet-mapping>

	<filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.rjx.firstservlet.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

登录验证

登录界面

<%@ page import="util.Constant" %><%--
  Created by IntelliJ IDEA.
  User: 23203
  Date: 2021-8-14
  Time: 19:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<%
    if (request.getSession().getAttribute(Constant.USER_SESSION) != null)
        response.sendRedirect("/FirstServlet/login/LoginSuccess.jsp");
%>
<body>
    <form action="${pageContext.request.contextPath}/LoginServlet" method="post">
            user name:<input type="text", name="userName"><br>
            password:<input type="password", name="password"><br>
            <input type="submit">
    </form>
</body>
</html>

在界面内实现跳转

<%
    if (request.getSession().getAttribute(Constant.USER_SESSION) != null)
        response.sendRedirect("/FirstServlet/login/LoginSuccess.jsp");
%>

<%
    if (request.getSession().getAttribute(Constant.USER_SESSION) == null)
        response.sendRedirect("/FirstServlet/login/Login.jsp");
%>

使用过滤器实现跳转

package com.rjx.firstservlet.filter;


import util.Constant;

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

public class LoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    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.USER_SESSION) == null)
            response.sendRedirect("/FirstServlet/login/Login.jsp");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

配置文件

    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.rjx.firstservlet.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/FirstServlet/login/*</url-pattern>
    </filter-mapping>


    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.rjx.firstservlet.response.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>

跳转页面

<%--
  Created by IntelliJ IDEA.
  User: 23203
  Date: 2021-8-14
  Time: 19:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Login Failed</h1>
</body>
</html>

<%@ page import="util.Constant" %><%--
  Created by IntelliJ IDEA.
  User: 23203
  Date: 2021-8-14
  Time: 19:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    if (request.getSession().getAttribute(Constant.USER_SESSION) == null)
        response.sendRedirect("/FirstServlet/login/Login.jsp");
%>
<h1>login success</h1>
</body>
</html>

监听器

功能

  1. 监听在线人数(监听Session创建销毁)

实现监听在线人数

监听器类

package com.rjx.firstservlet.listener;


import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

//在线人数监听:统计session
public class OnlineCountListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session " + httpSessionEvent.getSession().getId() + " request index.jsp");
        ServletContext context = httpSessionEvent.getSession().getServletContext();
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");
        if (onlineCount == null){
            onlineCount = 1;
        }else {
            onlineCount++;
        }
        context.setAttribute("onlineCount", onlineCount);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        ServletContext context = httpSessionEvent.getSession().getServletContext();
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");
        if (onlineCount == null){
            onlineCount = 0;
        }else {onlineCount--;
        }
        context.setAttribute("onlineCount", onlineCount);
    }
}

配置文件

    <listener>
        <listener-class>com.rjx.firstservlet.listener.OnlineCountListener</listener-class>
    </listener>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pass night

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值