day12_servlet常用对象
day12_servlet常用对象
1servlet线程特性
1.tomcat服务器是多线程的
2.servlet是单实例的
servlet是否线程安全 1是否有共享数据 2写操作
成员变量是共享数据
对成员变量 做写操作 线程不安全
不要使用成员变量 做写操作
2通过域对象做数据共享
request 请求域
1一次请求间有效
2当访问到服务器时 request域对象自动创建 响应返回即销毁
3需要搭配请求转发使用 请求转发 一次请求可以访问多个servlet 通过request域共享数据
session 会话域
1访问到服务器时自动创建 需要通过代码触发
2同一个浏览器进程 多次访问间 可以使用到同一个session对象 在多次访问间共享数据
3失效条件
1浏览器进程关闭
2默认时效到期 心跳机制
3通过服务端的代码直接失效
servletContext 服务器域
1服务器启动时自动创建 服务器关闭时自动销毁
2全局共享的对象
3主要用来放服务器的公共参数 不要做写操作
域对象 (共享数据) 空map
setAttribute('key',Object)
getAttribute('key')

request域对象的使用
1每次请求都是新的request对象 默认不能共享
2需要搭配请求转发使用 一次请求中 多个service()可以共享request对象 和其中的数据
写+读
package com.javasm.scopedemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @className: RequestDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:34
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/reqDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request域 req
req.setAttribute("reqkey","reqval");
String reqkey =(String) req.getAttribute("reqkey");
System.out.println(reqkey);
req.getRequestDispatcher("reqDemo2").forward(req,resp);
}
}
读
package com.javasm.scopedemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @className: RequestDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:34
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/reqDemo2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request域 req
String reqkey =(String) req.getAttribute("reqkey");
System.out.println(reqkey);
}
}
session域对象
1绑定浏览器进程 不同的浏览器进程有独立的对象(有数据隔离)
2同一个浏览器进程 多次访问间 可以共享数据
3占用服务器内存 不能无限期有效 失效条件
1浏览器进程关闭
2超过访问间隔
3通过代码设置session失效
写+读
package com.javasm.scopedemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: SessionDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:43
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/sesDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//绑定浏览器进程
//获取session
HttpSession session = req.getSession();
session.setAttribute("seskey","sesval");
String seskey =(String) session.getAttribute("seskey");
System.out.println("Demo1打印"+seskey);
}
}
读
package com.javasm.scopedemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: SessionDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:43
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/sesDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//绑定浏览器进程
//获取session
HttpSession session = req.getSession();
String seskey =(String) session.getAttribute("seskey");
System.out.println("Demo2打印"+seskey);
}
}
servletContext域对象
1全局共享 用来放公共参数
2服务器启动自动创建 服务器关闭自动销毁
写+读
package com.javasm.scopedemo;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: SessionDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:43
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/scDemo1")
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
//ServletContext servletContext1 = this.getServletContext();
servletContext.setAttribute("sckey","scval");
String sckey =(String) servletContext.getAttribute("sckey");
System.out.println("Demo1打印"+sckey);
}
}
读
package com.javasm.scopedemo;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @className: SessionDemo1
* @description:
* @author: gfs
* @date: 2025/8/8 10:43
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/scDemo2")
public class ServletContextDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
//ServletContext servletContext1 = this.getServletContext();
String sckey =(String) servletContext.getAttribute("sckey");
System.out.println("Demo2打印"+sckey);
}
}
3常用对象
3.1 HttpServletContext
服务器对象 主要是全局的设置和获取
package com.javasm.javaEEObj;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @className: ServletContextDemo
* @description:
* @author: gfs
* @date: 2025/8/8 10:59
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/servletContextDemo")
public class ServletContextDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletContext 服务器对象
ServletContext servletContext = req.getServletContext();
//可以做域对象
//可以动态获取到配置的项目名 主要拼相对根路径使用
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
//可以动态获取运行代码的实际目录 使用本地IO操作
String realPath = servletContext.getRealPath("/");
System.out.println(realPath);
//web服务器启动时 一般都会自动读取指定的配置文件 配合服务器功能使用
String charset = servletContext.getInitParameter("charset");
System.out.println(charset);
}
}
3.2ServletConfig
servlet配置对象 获取servlet配置的信息 了解即可
3.3 HttpServletRequest
请求对象 主要三个作用
1 解析了请求报文 把报文中主要参数放入request对象
2 request域的域对象
3 做请求跳转(请求转发)
req.setCharacterEncoding("utf-8"); 设置字符编码 处理请求乱码
req.getParameter("参数key") 获取请求参数
req.getParameterValues("hobby") 获取同名参数 hobby=1&hobby=2 返回值字符串数组
req.getParameterMap() Map<String, String[]>
req.getInputStream() 获得请求体输入流 可以自定义解析请求体中的数据
//获得项目入口(项目名路径)
System.out.println(req.getContextPath());
//URL 统一资源定位符 可以实际访问的地址
System.out.println(req.getRequestURL());
//URI 统一资源标识符 /day12/reqDemo
System.out.println(req.getRequestURI());
//获取servlet配置的路径
System.out.println(req.getServletPath());
// req.setAttribute() 域对象设置键值对
// req.getAttribute() 域对象读取键值对
req.getRequestDispatcher("地址").forward(req,resp);
一次请求中 在不同的servlet之间跳转
package com.javasm.javaEEObj;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
/**
* @className: HttpRequestDemo
* @description:
* @author: gfs
* @date: 2025/8/8 11:30
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/reqDemo")
public class HttpRequestDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//HttpServletRequest 请求对象
//1 解析了请求报文 把报文中主要参数放入request对象
// req.setCharacterEncoding("utf-8"); 设置字符编码 处理请求乱码
// req.getParameter("参数key") 获取请求参数
// req.getParameterValues("hobby") 获取同名参数 hobby=1&hobby=2 返回值字符串数组
// req.getParameterMap() Map<String, String[]>
// req.getInputStream() 获得请求体输入流 可以自定义解析请求体中的数据
//2 request域的域对象
// req.setAttribute();
// req.getAttribute()
//3 做请求跳转(请求转发)
// req.getRequestDispatcher("地址").forward(req,resp);
req.setCharacterEncoding("utf-8");
// String parameter = req.getParameter("name");
// System.out.println(parameter);
// //空值 没有key null
// // 有key没有值 ""
// String[] hobby = req.getParameterValues("hobby");
// System.out.println(hobby[2]);
// 会把参数解析成map集合
// Map<String, String[]> parameterMap = req.getParameterMap();
// System.out.println(parameterMap.get("name")[0]);
// System.out.println(parameterMap.get("hobby")[2]);
// 可以手动读取和解析请求体的数据
//只有请求体的输入流
//自己读取参数流 与tomcat默认封装护持 流默认只能读一次
// ServletInputStream inputStream = req.getInputStream();
// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
// System.out.println(bufferedReader.readLine());
// //框架中会利用这个功能 把数据直接转对象
// System.out.println(req.getParameter("name"));
System.out.println(req.getProtocol());
System.out.println(req.getServerName());
System.out.println(req.getServerPort());
System.out.println(req.getContextPath());
//URL 统一资源定位符 可以实际访问的地址
System.out.println(req.getRequestURL());
//URI 统一资源标识符 /day12/reqDemo
System.out.println(req.getRequestURI());
//获取servlet配置的路径
System.out.println(req.getServletPath());
}
}
3.4HttpServletResponse
1.向浏览器输出页面标签/json数据
2.向浏览器推送响应码
3.通知浏览器做重定向
//返回html页面
//resp.setContentType("text/html;charset=utf-8");
//返回json数据
resp.setContentType("application/json;charset=utf-8");
//resp.getWriter() 获得输出流 通过输出流可以输出响应报文信息
//响应体
PrintWriter writer = resp.getWriter();
//页面标签
//writer.print("<h1>你好</h1>");
//json字符串
writer.print("{\"name\":\"jack\",\"age\":15}");
writer.close();
//让tomcat传响应码给浏览器
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
//HttpServletResponse对象中 有响应码的常量数据
//响应重定向 通知浏览器 再访问指定的地址
resp.sendRedirect("/day12/reqDemePage.html");
package com.javasm.javaEEObj;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @className: HttpResponseDemo
* @description:
* @author: gfs
* @date: 2025/8/8 14:43
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/respDemo")
public class HttpResponseDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//返回html页面
//resp.setContentType("text/html;charset=utf-8");
resp.setContentType("application/json;charset=utf-8");
//resp.getWriter() 获得输出流 通过输出流可以输出响应报文信息
//响应体
PrintWriter writer = resp.getWriter();
writer.print("{\"name\":\"jack\",\"age\":15}");
//writer.print("<h1>你好</h1>");
writer.close();
//resp.sendError(HttpServletResponse.SC_NOT_FOUND);
// resp.sendRedirect("/day12/reqDemePage.html");
}
}
3.5 HttpSession
session 会话对象 做域对象
1访问到服务器时自动创建 需要通过代码触发
2同一个浏览器进程 多次访问间 可以使用到同一个session对象 在多次访问间共享数据
3失效条件
1浏览器进程关闭
2默认时效到期 心跳机制
3通过服务端的代码直接失效
session.getId(); 检查是否同一个session对象
session.setMaxInactiveInterval(5); 设置失效的访问间隔
session.invalidate(); session立即失效
session.setAttribute("key",value) 设置键值对
session.getAttribute("key") 读取键值对
session.removeAttribute("key") 删除键值对
package com.javasm.javaEEObj;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: HttpSessionDemo
* @description:
* @author: gfs
* @date: 2025/8/8 14:56
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/sessionDemo")
public class HttpSessionDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
HttpSession session = req.getSession();
//可以设置值获取值
//两次访问的间隔时间 单位秒 tomcat默认半小时
// session.setMaxInactiveInterval(5);
//session编号 主要用来检查是否是同一个session对象
String id = session.getId();
System.out.println(id);
//立刻让session失效
//session.invalidate();
session.setAttribute("session","sesionval");
System.out.println(session.getAttribute("session"));
session.removeAttribute("session");
System.out.println(session.getAttribute("session"));
}
}
session对象的常用功能
1 共享数据
2 访问控制

/login
package com.javasm.sessionDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: LoginServlet
* @description:
* @author: gfs
* @date: 2025/8/8 15:30
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("登录 验证用户名密码.....");
/*相当于买票的过程*/
HttpSession session = req.getSession();
session.setAttribute("loginUser","xxxxx");
}
}
/user
package com.javasm.sessionDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: UserServlet
* @description:
* @author: gfs
* @date: 2025/8/8 15:28
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser!=null){
System.out.println("正常的服务代码...查用户信息");
}else{
System.out.println("没有登录...");
}
}
}
/logout
package com.javasm.sessionDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @className: LogoutServlet
* @description:
* @author: gfs
* @date: 2025/8/8 15:35
* @version: 0.1
* @since: jdk17
*/
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//session.invalidate();
session.removeAttribute("loginUser");
}
}
后端代码三层结构

三层结构调用关系 controller 调用service service调用dao


浙公网安备 33010602011771号