在Servlet体系结构中,除了实现Servlet接口,还可以通过继承GenericServlet或HttpServlet类,完成编写。

提供生命周期方法init和destroy的简单实现,要编写一般的Servlet只需重写抽象service方法
package com.wyy.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
public class GenServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hi~~~");
}
}

package com.wyy.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class httpsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get");;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
}
}



import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = {"/bs","/bss"})
public class basicServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
}
}
ServletConfig类时Servlet程序的配置信息类

注解形式


ServletConfig的三个作用
// 1、可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2、获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
// 3、获取ServletContext对象
System.out.println(servletConfig.getServletContext());
完整方法代码为:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2init初始化方法");
// 1、 可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2、 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
// 3、 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
最后结果显示:

ServletContext是什么
ServletContext对象为所有的Servlet所共享ServletContext可以为所有的Servlet提供初始配置参数
ServletContext怎么用
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<context-param>
<param-name>paramAparam-name>
<param-value>valueAparam-value>
context-param>
<context-param>
<param-name>paramBparam-name>
<param-value>valueBparam-value>
context-param>
web-app>
package com.atguigu.servlet;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 从ServletContext中获取为所有的Servlet准备的参数
ServletContext servletContext = this.getServletContext();
String valueA = servletContext.getInitParameter("paramA");
System.out.println("paramA:"+valueA);
// 获取所有参数名
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
// 迭代并获取参数名
while (initParameterNames.hasMoreElements()) {
String paramaterName = initParameterNames.nextElement();
System.out.println(paramaterName+":"+servletContext.getInitParameter(paramaterName));
}
}
}
获取资源的真实路径
String realPath = servletContext.getRealPath("资源在web目录中的路径");
例如我们的目标是需要获取项目中某个静态资源的路径,不是工程目录中的路径,而是部署目录中的路径;我们如果直接拷贝其在我们电脑中的完整路径的话其实是有问题的,因为如果该项目以后部署到公司服务器上的话,路径肯定是会发生改变的,所以我们需要使用代码动态获取资源的真实路径. 只要使用了servletContext动态获取资源的真实路径,那么无论项目的部署路径发生什么变化,都会动态获取项目运行时候的实际路径,所以就不会发生由于写死真实路径而导致项目部署位置改变引发的路径错误问题
获取项目的上下文路径 项目的访问路径
String contextPath = servletContext.getContextPath();
项目的部署名称,也叫项目的上下文路径,在部署进入tomcat时所使用的路径,该路径是可能发生变化的,通过该API动态获取项目真实的上下文路径,可以帮助我们解决一些后端页面渲染技术或者请求转发和响应重定向中的路径问题
域对象的相关API

在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象

get和post的区别

获取请求行信息相关(方式,请求的url,协议及版本)

获得请求头信息相关

获得请求参数相关

其他API


HTML
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面title>
head>
<body>
<form action="/web1_war_exploded/login" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
<input type="submit" value="登录"/>
form>
body>
html>
Servlet
package com.wyy.servlet2;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(value = "/rs")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户请求的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("提交的数据: " + username + " " + password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//对request对象设置统一编码格式
req.setCharacterEncoding("utf-8");
//获取用户请求的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
//System.out.println("提交的数据: " + username + " " + password);
//相应数据给客户端
resp.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = resp.getWriter();
printWriter.println("注册成功");
}
}
response对象用于响应客户请求并向客户端输出信息

设置响应行相关

设置响应头相关

设置响应体相关

其他API


resp.getWriter();//获取字符输出流
PrintWriter printWriter = resp.getWriter();
if (admin != null){
//相应结果成功
printWriter.println("");
printWriter.println("");
printWriter.println("");
printWriter.println("结果页面 ");
printWriter.println("");
printWriter.println("");
printWriter.println("登陆成功!!!!
");
printWriter.println("");
printWriter.println("");
}else {
//相应结果失败
printWriter.println("");
printWriter.println("");
printWriter.println("");
printWriter.println("结果页面 ");
printWriter.println("");
printWriter.println("");
printWriter.println("登陆失败
");
printWriter.println("");
printWriter.println("");
}

转发的作用在服务端,将请求发送给服务器上的其他资源,以共同完成一次请求处理

页面跳转

数据传递

ShowAllAdminController
存数据
req.setAttribute("admins",adminList);
package com.wyy.servletProject.servlet;
import com.wyy.servletProject.entity.Admin;
import com.wyy.servletProject.service.AdminService;
import com.wyy.servletProject.service.imlp.AdminServiceimpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(value = "/showallcontroller")
public class ShowAllAdminController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//只负责调用业务逻辑
AdminService adminService = new AdminServiceimpl();
List<Admin> adminList = adminService.showAllAdmin();
//request作用域存储数据
req.setAttribute("admins",adminList);
//通过转发跳转到显示结果的servlet
req.getRequestDispatcher("/showalljsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
ShowallAdminJSP
取数据
List<Admin> adminList = (List<Admin>) req.getAttribute("admins");
package com.wyy.servletProject.servlet;
import com.wyy.servletProject.entity.Admin;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(value = "/showalljsp")
public class ShowallAdminJSP extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Admin> adminList = (List<Admin>) req.getAttribute("admins");
PrintWriter printWriter = resp.getWriter();
if (adminList != null){
printWriter.println("");
printWriter.println("");
printWriter.println("");
printWriter.println("结果页面 ");
printWriter.println("");
printWriter.println("");
printWriter.println("");
printWriter.println(" username ");
printWriter.println(" password ");
printWriter.println(" phone ");
printWriter.println(" address ");
printWriter.println("
");
for (Admin admin :adminList){
printWriter.println("");
printWriter.println(" "+admin.getUsername()+" ");
printWriter.println(" "+admin.getPassword()+" ");
printWriter.println(" "+admin.getPhone()+" ");
printWriter.println(" "+admin.getAddress()+" ");
printWriter.println("
");
}
printWriter.println("");
printWriter.println("");
}else {
printWriter.println("");
printWriter.println("");
printWriter.println("");
printWriter.println("结果页面 ");
printWriter.println("");
printWriter.println("");
printWriter.println("登陆失败
");
printWriter.println("");
printWriter.println("");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送请求。

页面跳转

数据传输

AServlet
重定向传数据
resp.sendRedirect("/web1_war_exploded/b?username=Tom"); //只能传String
package com.wyy.servletProject.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/a")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request作用域做数据的存储
// req.setAttribute("username","gavin");
// req.getRequestDispatcher("/b").forward(req,resp);
resp.sendRedirect("/web1_war_exploded/b?username=Tom");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
BServlet
重定向传数据
String username = req.getParameter("username");
package com.wyy.servletProject.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/b")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String s = (String) req.getAttribute("username");
String username = req.getParameter("username");
System.out.println("B executed ..." + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
当两个Servlet需要传数据时,选择forward转发,不建议使用sendRedirect进行传递
四个阶段





package com.wyy.servlet3;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(value = "/ls")
public class lifeServlet implements Servlet {
public lifeServlet(){
System.out.println("1、实例化");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2、初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3、接收请求,相应结果");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4、销毁");
}
}




package com.wyy.servlet3;
import jakarta.servlet.ServletException;
import jakarta.servlet.SingleThreadModel;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SafeServlet extends HttpServlet implements SingleThreadModel {
private String massage = "";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
synchronized (this){
//假设接收参数
//调用业务逻辑,得到登录结果
massage = "登陆成功";
PrintWriter printWriter = resp.getWriter();
printWriter.println(massage);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.wyy.servlet3;
import jakarta.servlet.ServletException;
import jakarta.servlet.SingleThreadModel;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SafeServlet extends HttpServlet {
// private String massage = "";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String massage = "";
//假设接收参数
//调用业务逻辑,得到登录结果
massage = "登陆成功";
PrintWriter printWriter = resp.getWriter();
printWriter.println(massage);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
分类:
客户端。代表性的是Cookie技术。服务器端。代表性的是session技术(服务器传递sessionID时需要使用Cookie的方式)由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据


访问不同的资源时,可以携带不同的cookie,可以通过cookie的setPath(String path)对cookie的路径进行设置
package com.wyy.cookies;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/cs")
public class cookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务端创建cookie
Cookie cookie = new Cookie("username","gavin");
Cookie cookie2 = new Cookie("passward","123456");
//设置cookie的提交路径
cookie.setPath("/web1_war_exploded/get");
cookie2.setPath("/web1_war_exploded");
//设置cookie生命周期
cookie.setMaxAge(60*60);
cookie2.setMaxAge(60*60);
//将cookie响应给客户端
resp.addCookie(cookie);
resp.addCookie(cookie2);
}
}


package com.wyy.cookies;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/get")
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request对象获取所有的cookie
Cookie[] cookies = req.getCookies();
//通过循环遍历数组
if (cookies != null){
for (Cookie cookie : cookies){
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

package com.wyy.cookies;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/cs2")
public class CookieServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("username","aaron");
cookie.setPath("/web1_war_exploded/get");
cookie.setMaxAge(60*60*24*7);
resp.addCookie(cookie);
}
}
如果改变cookie的name有效路径会新建cookie,而改变cookie的值,有效期会覆盖原有的cookie


编码
URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8")
package com.wyy.cookies;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(value = "/cs3")
public class CookisServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));
cookie.setPath("/web1_war_exploded/get");
cookie.setMaxAge(600);
resp.addCookie(cookie);
}
}
解码
URLDecoder.decode(cookie.getName(),"UTF-8")+":"+URLDecoder.decode(cookie.getValue(),"UTF-8")
package com.wyy.cookies;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@WebServlet(value = "/get")
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request对象获取所有的cookie
Cookie[] cookies = req.getCookies();
//通过循环遍历数组
if (cookies != null){
for (Cookie cookie : cookies){
System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8")+":"+URLDecoder.decode(cookie.getValue(),"UTF-8"));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

概述
- Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。
- 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。
原理
服务器会为每一次会话分配一个Session对象同一个浏览器发起的多次请求,同属于一次会话(Session)- 首次使用到Session时, 服务器会自动创建Session,并创建Cookie存储Sessionld发送回客户端
使用
- Session作用域: 拥有存储数据的空间,作用范围是
一次会话有效
- 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
- 可以将数据存入Session中,在一次会话的任意位置进行获取
- 可传递任何数据(基本数据类型、对象、集合、数组)

package com.wyy.Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(value = "/ss")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request获取Session对象
HttpSession session = req.getSession();
System.out.println(session.getId());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
保存
session.setAttribute("username","gavin");
获取
session.getAttribute("username");
package com.wyy.Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(value = "/getvalue")
public class GetValueServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession session = req.getSession();
String s = (String) session.getAttribute("username");
System.out.println("从session中获得了"+s);
}
}
session.removeAttribute("username");
package com.wyy.Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(value = "/remove")
public class RemoveServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("username");
}
}
request session区别
- request是一 次请求有效,请求改变,则request改变
- session是一 次会话有效,浏览器改变,则session改变





package com.wyy.servletProject.servlet.controller;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(value = "/ctxController")
public class ServletContextController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方式一 this getServletContext);
ServletContext servletContext = this.getServletContext();
//方式二 request对象获取
ServletContext servletContext1 = req.getServletContext();
//方式三 Session对象获取
HttpSession session = req.getSession();
ServletContext servletContext2 = session.getServletContext();
System.out.println(servletContext);
System.out.println(servletContext1);
System.out.println(servletContext2);
}
}
获取项目的真实路径
servletContext.getRealPath("/")
获取项目上下文路径
servletContext.getContextPath()
全局容器(ServletContext拥有作用域,可以存储数据到全局容器中)
package com.wyy.servletProject.servlet.controller;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(value = "/ctxController")
public class ServletContextController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方式一 this getServletContext);
ServletContext servletContext = this.getServletContext();
//获取项目的真实路径
System.out.println(servletContext.getRealPath("/"));
//获取项目的上下文路径
System.out.println(servletContext.getContextPath());
//全局容器
servletContext.setAttribute("context","info");
}
}
package com.wyy.servletProject.servlet.controller;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/showContext")
public class ShowContextController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先获取ServletContext对象
ServletContext servletContext = this.getServletContext();
String s = (String) servletContext.getAttribute("context");
System.out.println(s);
}
}
处于客户端和服务器目标资源之间的一道过滤技术。


作用:

package com.wyy.Filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(value = "/t")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("===myfilter====");
//让请求继续
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("====end====");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
注解配置

@WebFilter(value = "/t")
xml配置

package com.wyy.Filter;
import jakarta.servlet.*;
import java.io.IOException;
public class xmlFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Web.xml配置过滤器");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
package com.wyy.Filter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("TestServlet");
}
}
<filter>
<filter-name>xmlfilter-name>
<filter-class>com.wyy.Filter.xmlFilterfilter-class>
filter>
<filter-mapping>
<filter-name>xmlfilter-name>
<url-pattern>/testurl-pattern>
filter-mapping>
拦截路径

后缀拦截
package com.wyy.Filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
@WebFilter(value = "*.html")
public class HtmlFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截html请求");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
通配符拦截
package com.wyy.Filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(value = "/*")
public class AllFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截所有请求");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
过滤器链
客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。
每个过滤器实现某个特定的功能,当第一个Filter的doFiter方 法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中, 开发人员如果调用了FilterChain对象的doFiter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。



在一个Web应用中,可以开发编写多个Filter,这些Filter组合 起来称之为一个Filter链。 优先级:
解决编码
package com.wyy.Filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebFilter(value = "/*")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//统一处理请求和响应的乱码
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
权限验证
package com.wyy.servletProject.filter;
import com.wyy.servletProject.entity.Manager;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter(value = "/showallcontroller")
public class checkfilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//权限验证 验证管理员是否登录
//向下转型 拆箱
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
Manager mgr = (Manager) session.getAttribute("mgr");
if (mgr != null){
filterChain.doFilter(request,response);
}else {
response.sendRedirect(request.getContextPath()+"/loginMgr.html");
}
}
@Override
public void destroy() {
Filter.super.destroy();
}
}