day12_servlet常用对象
1.servlet的线程特性
单实例 多线程
1.成员变量是共享数据 如果对成员变量有写操作 线程不安全
2.加锁 效率下降比较明显

在servlet中不要随意使用成员变量 (是共享数据)
注意如果使用ThreadLocal 数据使用完毕需要清空
2.域对象
域对象
1服务器自动创建的对象
2每个对象有不同的生命周期
3设计目的是在服务器访问过程中共享数据
.setAttrivute("key",Object);
.getAttribute("key")
1request域
1请求进入是生效 请求返回失效(每次请求都是新的对象)
2在一次请求间共享数据
3配合请求转发使用 才有实际共享数据的意义
package com.javasm.controller;
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
* @author: gfs
* @date: 2025/10/16 10:21
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/reqDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request域 HttpServletRequest 合并到这个对象中
req.setAttribute("reqKey","reqVal");
String reqKey =(String) req.getAttribute("reqKey");
System.out.println("demo1:"+reqKey);
//请求转发
req.getRequestDispatcher("reqDemo2").forward(req,resp);
}
}
package com.javasm.controller;
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
* @author: gfs
* @date: 2025/10/16 10:21
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/reqDemo2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request域 HttpServletRequest 合并到这个对象中
String reqKey =(String) req.getAttribute("reqKey");
System.out.println("demo2:"+reqKey);
}
}
2session域
1与浏览器进程绑定 同一个浏览器进程用同一个session对象
2同一个浏览器进程 多次访问间共享数据
3失效条件
1浏览器关闭
2超过有效时间 (心跳机制 tomcat默认设置半个小时)
3通过代码直接设置失效
package com.javasm.controller;
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
* @author: gfs
* @date: 2025/10/16 10:27
* @version: 0.1
* @since: jdk17
* @description:
*/
@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.controller;
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
* @author: gfs
* @date: 2025/10/16 10:27
* @version: 0.1
* @since: jdk17
* @description:
*/
@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);
}
}
3servletContext域
1服务器启动创建 服务器关闭 销毁 全局共享
2一般用来放公共参数 做读取使用
package com.javasm.controller;
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
* @author: gfs
* @date: 2025/10/16 10:27
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/scDemo1")
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session 会话
ServletContext servletContext = req.getServletContext();
servletContext.setAttribute("scKey","scVal");
String sesKey =(String) servletContext.getAttribute("scKey");
System.out.println("demo1:"+sesKey);
}
}
package com.javasm.controller;
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
* @author: gfs
* @date: 2025/10/16 10:27
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/scDemo2")
public class ServletContextDemo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session 会话
ServletContext servletContext = req.getServletContext();
String sesKey =(String) servletContext.getAttribute("scKey");
System.out.println("demo2:"+sesKey);
}
}
3Servlet中常用对象
3.1ServletContext
//ServletContext 服务器对象 application
/*
* 方法大多与全局参数 设置相关
* servletContext.getContextPath() 获得项目根路径/day12
* servletContext.getRealPath("/") 获得部署的实际路径
* servletContext.getInitParameter("charset") 获得全局初始化参数
* */
package com.javasm.controller2;
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
* @author: gfs
* @date: 2025/10/16 10:37
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/servletContextDemo")
public class ServletContextDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletContext 服务器对象 application
/*
* 方法大多与全局参数 设置相关
* servletContext.getContextPath() 获得项目根路径/day12
* servletContext.getRealPath("/") 获得部署的实际路径
* servletContext.getInitParameter("charset") 获得全局初始化参数
* */
ServletContext servletContext = req.getServletContext();
//获取项目入口 项目根 /day12 方便拼接路径
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
//获取项目运行的实际路径 本地IO操作 配合服务器访问
String realPath = servletContext.getRealPath("/");
System.out.println(realPath);
//可以把参数配置到配置文件中
String charset = servletContext.getInitParameter("charset");
System.out.println(charset);
}
}
3.2servletConfig(了解)
servlet配置信息对象
用来获取servlet中的配置参数
3.3HttpServletRequest 请求对象
//HttpServletRequest 加入了对http报文结构的解析 /* * 1 解析了http请求报文 * 2 做域对象 * 3 控制请求转发 * * */
1获取请求报文参数
* 获取参数
* req.getParameter("name") 获取单个参数
* req.getParameterValues("hobby") 获取一组参数
* req.getParameterMap() 获取tomcat解析后的完整参数map
* req.getInputStream() 获取请求体的输入流 配合自定义解析数据使用
* 让tomcat读 或者自己读 两种方式有互斥
package com.javasm.controller2;
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: RequestDemo
* @author: gfs
* @date: 2025/10/16 10:53
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/requestDemo")
public class RequestDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//HttpServletRequest 加入了对http报文结构的解析
/*
* 1 解析了http请求报文
* 2 做域对象
* 3 控制请求转发
*
* */
//设置请求字符编码 搭配post方式使用 需要在第一次解析前调用
req.setCharacterEncoding("utf-8");
/*
* 获取参数
* req.getParameter("name") 获取单个参数
* req.getParameterValues("hobby") 获取一组参数
* req.getParameterMap() 获取tomcat解析后的完整参数map
* req.getInputStream() 获取请求体的输入流 配合自定义解析数据使用
* 让tomcat读 或者自己读 两种方式有互斥
*
*
* */
//获取请求参数 get/post都用这个方法
// String name = req.getParameter("name");
// System.out.println(name);
//
// String hobby = req.getParameter("hobby");
// System.out.println(hobby);
// String[] hobbies = req.getParameterValues("hobby");
// Map<String, String[]> parameterMap = req.getParameterMap();
//
// System.out.println(parameterMap.get("name")[0]);
// System.out.println(parameterMap.get("hobby")[0]);
// System.out.println(parameterMap.get("hobby")[1]);
//读请求体 报文原始数据
ServletInputStream inputStream = req.getInputStream();
//自定义数据解析格式 需要搭配post 启用请求体
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(br.readLine());
//流只能读一次
String username = req.getParameter("username");
System.out.println(username);
}
}
2获取请求路径相关信息
// 获得项目根路径/day12
String contextPath = req.getContextPath();
System.out.println(contextPath);
//协议
System.out.println(req.getScheme());
//主机
System.out.println(req.getServerName());
//端口
System.out.println(req.getServerPort());
//统一资源定位符
System.out.println(req.getRequestURL());
//统一资源标识符
System.out.println(req.getRequestURI());
//获取servlet配置的路径
System.out.println(req.getServletPath());
3做域对象
.setAttrivute("key",Object);
.getAttribute("key")
4.做请求转发
//请求转发
req.getRequestDispatcher("reqDemo2").forward(req,resp);
3.4HttpServletResponse 响应对象
1 设置响应报文相关参数 2 获得输出流 输出返回信息 页面/json字符串 3 推200之外的响应码 4 做页面重定向 通知浏览器 向指定地址再发一次请求
package com.javasm.controller2;
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: ResponseDemo
* @author: gfs
* @date: 2025/10/16 11:34
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/responseDemo")
public class ResponseDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//HttpServletResponse 响应对象
//标记响应数据类型
// resp.setContentType("text/html;charset=utf-8");
// //resp.setContentType("application/json;charset=utf-8");
// //获得输出流
PrintWriter writer = resp.getWriter();
//输出页面html标签
//标准json格式字符串
//最终转成字符发送
//writer.print();
//推响应码
//resp.sendError(500);
//写cookie
//resp.addCookie();
//换一个页面
//resp.sendRedirect("/day12/myPage.html");
}
}
3.5HttpSession对象
做域对象
//设置
session.setAttribute("key","value");
// 读取
String key =(String) session.getAttribute("key");
//删除
session.removeAttribute("key");
控制session
//检查是否是同一个session对象 String id = session.getId(); System.out.println(id); //设置有效时间 默认tomcat半小时 可以通过代码设置 //session.setMaxInactiveInterval(5); //立即失效 session.invalidate();
package com.javasm.controller2;
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: SessionDemo
* @author: gfs
* @date: 2025/10/16 14:31
* @version: 0.1
* @since: jdk17
* @description:
*/
@WebServlet("/sessionDemo")
public class SessionDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session对象(HttpSession ) 会话域
//session获取
HttpSession session = req.getSession();
//设置
session.setAttribute("key","value");
// 读取
String key =(String) session.getAttribute("key");
//删除
session.removeAttribute("key");
//检查是否是同一个session对象
String id = session.getId();
System.out.println(id);
//设置有效时间 默认tomcat半小时 可以通过代码设置
//session.setMaxInactiveInterval(5);
//立即失效
session.invalidate();
/*
* 1. 做数据共享 在用户访问过程中读取和使用
* 2. 做访问控制
*
* */
}
}
访问控制场景

4后端代码分层
控制层 controller
业务逻辑层 service
数据持久层 dao

jdbc
本质是TCP连接
package com.javasm.dao.impl;
import com.javasm.dao.LoginDao;
import com.javasm.entity.User;
import java.sql.*;
/**
* @className: LoginDaoImpl
* @author: gfs
* @date: 2025/10/16 15:21
* @version: 0.1
* @since: jdk17
* @description:
*/
public class LoginDaoImpl implements LoginDao {
@Override
public User login(String name, String password) {
//jdbc 流程比较复杂
User user = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1 创建连接
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//创建连接
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "root");
//2准备请求数据请求
String sql = "select * from `user` where `name` = ? and `password` = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setString(2,password);
//3发送请求 接收反馈
resultSet = preparedStatement.executeQuery();
//4读取响应报文中的数据内容 做成java中的对象数据
if(resultSet.next()){
int id = resultSet.getInt("id");
String nameDB = resultSet.getString("name");
String passwordDB = resultSet.getString("password");
String addr = resultSet.getString("addr");
int age = resultSet.getInt("age");
user = new User(id, nameDB, passwordDB, age, addr);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
try{
if(resultSet!=null)resultSet.close();
if(preparedStatement!=null)preparedStatement.close();
if(connection!=null)connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return user;
}
}
servlet 动态网页技术 数据是动态生成的 通过逻辑控制数据的动态显示
html 静态网页技术
822

被折叠的 条评论
为什么被折叠?



