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
超文本传输协议
- 文本:HTML…….
- 超文本: 图片………
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应用
- 共享数据:不同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)
下载文件
步骤
- 获取下载文件路径
- 获取下载文件名
- 让浏览器支持下载
- 获取io流
- 下载文件
源代码
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>
重定向与转发的区别
相同点
- 实现页面跳转
不同点
-
- 转发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
两者的异同点
相同点
- 保存会话
不同点
-
- 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相关的一些上限
- 一个Cookie只能保存一条有效信息
- 一个web站点可以给浏览器发送多个Cookie,最多存放20个Cookie
- Cookie大小限制在4Kb以内
- 浏览器最多保存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");
}
%>
注释
- html注释会在客户端显示
- 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>
内置对象
内容
- PageContext
- Resquest
- Response
- Session
- Application ServletContex
- Config ServletConfig
- out
- page
- 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表达式功能
- 获取数据
- 执行运算
- 获取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
特征
- 实体类
- 必须要有一个无参构造
- 属性必须私有化
- 必须有get/set方法
一般用于数据库字段映射
表映射为类,字段映射为属性,行映射为对象
MVC(Model, View, Controller)
定义
控制器(Servlet)
- 接受用户请求
- 响应可客户端内容
- 重定向或转发
视图层(JSP)
- 展示数据
- 提供操作请求
模型层
- 业务操作
- 数据库操作
概念图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eup1c4o4-1645076612653)(figures/javaWeb/image-20210814183508783.png)]
过滤器
功能
过滤网站数据
- 处理中文乱码
- 登录验证
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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>
监听器
功能
- 监听在线人数(监听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>