
🌈 个人主页: Hygge_Code
🔥 热门专栏:从0开始学习Java | Linux学习| 计算机网络
💫 个人格言: "既然选择了远方,便不顾风雨兼程"

文章目录
- JSP数据传递
-
- 一、JSP内置对象🐦🔥
- 二、request对象:获取客户端请求数据
-
- [1. 核心常用方法](#1. 核心常用方法)
- [2. 实战案例:接收注册表单数据](#2. 实战案例:接收注册表单数据)
- [3. 关键注意:get与post请求乱码解决方案](#3. 关键注意:get与post请求乱码解决方案)
- 三、response对象:处理服务器响应
-
- [1. 核心常用方法](#1. 核心常用方法)
- [2. 栗子:登录重定向](#2. 栗子:登录重定向)
- 四、转发与重定向:页面跳转的两种核心方式
-
- [1. 转发:共享请求数据](#1. 转发:共享请求数据)
- [2. 重定向:跨请求传递数据(需Session)](#2. 重定向:跨请求传递数据(需Session))
- [3. 综合应用 && 易错栗子⚠️🐦🔥⚠️](#3. 综合应用 && 易错栗子⚠️🐦🔥⚠️)
- 五、Session:维持用户会话状态
-
- [1. Session工作原理](#1. Session工作原理)
- [2. 核心常用方法](#2. 核心常用方法)
- [3. 例子:登录状态维持](#3. 例子:登录状态维持)
- [4. Session过期时间设置方式](#4. Session过期时间设置方式)
- 六、Cookie:客户端状态存储
-
- [1. Cookie核心特性](#1. Cookie核心特性)
- [2. 核心常用方法](#2. 核心常用方法)
- [3. 实战案例:记住密码功能🐦🔥🐦🔥🐦🔥](#3. 实战案例:记住密码功能🐦🔥🐦🔥🐦🔥)
- 七、include指令
-
- [1. 语法格式](#1. 语法格式)
- [2. 栗子:登录超时验证](#2. 栗子:登录超时验证)
- 八、application对象:全局数据共享
JSP数据传递
在Java Web开发中,JSP的数据传递是衔接前端与后端的核心环节。无论是获取用户表单输入、实现页面跳转,还是维持用户登录状态,都离不开JSP内置对象、转发重定向、Session与Cookie等关键技术。
一、JSP内置对象🐦🔥
JSP内置对象是Web容器预先创建的一组对象,无需手动实例化即可直接使用,是数据传递的核心工具。常用内置对象及核心作用如下:
| 内置对象 | 数据类型 | 核心作用 |
|---|---|---|
| request | javax.servlet.http.HttpServletRequest | 获取客户端请求参数、处理表单数据 |
| response | javax.servlet.http.HttpServletResponse | 向客户端响应数据、设置Cookie、重定向 |
| session | javax.servlet.http.HttpSession | 维持用户会话状态、存储用户信息 |
| application | javax.servlet.ServletContext | 实现全局数据共享(服务器级) |
| out | javax.servlet.jsp.JspWriter | 向浏览器输出文本信息 |
这些对象覆盖了"请求接收-数据处理-响应返回-状态维持"的全流程,是JSP数据传递的基础。
二、request对象:获取客户端请求数据
request对象专门用于接收客户端提交的请求数据,支持表单参数、Cookie、请求头信息等获取,是前端向后端传递数据的主要渠道。
1. 核心常用方法
String getParameter(String name):根据表单组件名称获取单个参数值(适用于文本框、密码框等);String[] getParameterValues(String name):获取多值参数(适用于复选框、下拉多选框);void setCharacterEncoding(String charset):设置请求编码(解决中文乱码);Cookie[] getCookies():获取客户端携带的Cookie数组;RequestDispatcher getRequestDispatcher(String path):获取请求转发对象。
2. 实战案例:接收注册表单数据
(1)注册页面(register.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户注册</title></head>
<body>
<form action="info.jsp" method="post">
<div>用户名:<input type="text" name="username"></div>
<div>密码:<input type="password" name="password"></div>
<div>
信息来源:
<input type="checkbox" name="channel" value="报刊">报刊
<input type="checkbox" name="channel" value="网络">网络
<input type="checkbox" name="channel" value="朋友推荐">朋友推荐
<input type="checkbox" name="channel" value="电视">电视
</div>
<div><input type="submit" value="注册"> <input type="reset" value="重置"></div>
</form>
</body>
</html>
(2)数据接收页面(info.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Arrays" %>
<%
// 解决POST请求中文乱码(必须在获取参数前设置)
request.setCharacterEncoding("UTF-8");
// 获取单个参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 获取多值参数(复选框)
String[] channels = request.getParameterValues("channel");
String channelInfo = channels != null ? Arrays.toString(channels).replaceAll("[\\[\\]]", "") : "未选择";
%>
<html>
<head><title>注册信息确认</title></head>
<body>
<div>用户名:<%= username %></div>
<div>密码:<%= password %></div>
<div>信息来源:<%= channelInfo %></div>
</body>
</html>
3. 关键注意:get与post请求乱码解决方案
-
POST请求 :直接使用
request.setCharacterEncoding("UTF-8")即可解决; -
GET请求 :该方法无效,需通过字符串转码处理:
javaString username = new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
三、response对象:处理服务器响应
response对象用于向客户端返回处理结果,支持设置响应编码、添加Cookie、页面重定向等功能。
1. 核心常用方法
void addCookie(Cookie c):向客户端添加Cookie;void sendRedirect(String url):实现页面重定向(客户端跳转);void setCharacterEncoding(String charset):设置响应编码;PrintWriter getWriter():获取字符输出流(向页面输出文本);void setStatus(int status):设置响应状态码(如404、500)。
2. 栗子:登录重定向
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
// 登录验证(模拟正确账号密码)
if ("admin".equals(username) && "123456".equals(password)) {
// 重定向到主页面(客户端跳转,地址栏会变化)
response.sendRedirect("main.jsp");
} else {
// 登录失败,重定向回登录页
response.sendRedirect("login.jsp?error=1");
}
%>
四、转发与重定向:页面跳转的两种核心方式
页面跳转是数据传递的延伸,JSP提供"转发"和"重定向"两种方式,适用场景不同,核心区别如下:
| 对比维度 | 转发(RequestDispatcher.forward()) | 重定向(response.sendRedirect()) |
|---|---|---|
| 跳转发生地 | 服务器端 | 客户端 |
| 地址栏变化 | 不变 | 变化 |
| 请求对象共享 | 共享(同一请求) | 不共享(新请求) |
| 跳转范围 | 仅当前Web应用内 | 可跨应用、跨域名 |
| 数据传递 | 可通过request.setAttribute()传递 | 需通过Session或URL参数传递 |
1. 转发:共享请求数据
jsp
// process.jsp(处理页面)
<%
String username = request.getParameter("username");
if ("admin".equals(username)) {
// 存储数据到request(仅转发可共享)
request.setAttribute("greeting", "欢迎管理员!");
// 转发到主页面
request.getRequestDispatcher("main.jsp").forward(request, response);
}
%>
// main.jsp(接收页面)
<%
// 获取转发传递的数据
String greeting = (String) request.getAttribute("greeting");
%>
<div><%= greeting %></div>
2. 重定向:跨请求传递数据(需Session)
jsp
// process.jsp(处理页面)
<%
String username = request.getParameter("username");
if ("admin".equals(username)) {
// 存储数据到Session(跨请求共享)
session.setAttribute("username", username);
// 重定向到主页面
response.sendRedirect("main.jsp");
}
%>
// main.jsp(接收页面)
<%
// 从Session获取数据
String username = (String) session.getAttribute("username");
%>
<div>欢迎您,<%= username %></div>
3. 综合应用 && 易错栗子⚠️🐦🔥⚠️
需求:实现登录页面跳转功能,并在跳转的页面中显示登录信息
login.jsp
jsp
<form action="process.jsp" method="post">
<div><span>用户名</span><input type="text" name="username"></div>
<div><span>密码</span><input type="password" name="password"></div>
<div>
<input type="submit" value="登录">
</div>
</form>
process.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%
String username = request.getParameter("username");//获取参数username的值
String password = request.getParameter("password");//获取参数password的值
if("admin".equals(username) && "123456".equals(password)){
//页面重定向至主页面
response.sendRedirect("main.jsp");
}
%>
main.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%
String username = request.getParameter("username");//获取参数username的值
String password = request.getParameter("password");//获取参数password的值
%>
<div>用户名: <%= username %></div>
<div>密码: <%= password %></div>
访问 login.jsp ,然后点击 登录 按钮,查看地址栏信息与页面信息。地址栏信息发生了变化【由process.jsp --》 main.jsp】,说明重定向发生在客户端,相当于客户端再发了一次请求,重新定位了新的资源。由于这次请求是新的请求,与之前的登录请求完全独立,因此页面信息中展示全是null

思考:如何才能将登录信息在跳转的页面中显示呢?
可以通过请求转发来实现,修改 process.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%
String username = request.getParameter("username");//获取参数username的值
String password = request.getParameter("password");//获取参数password的值
if("admin".equals(username) && "123456".equals(password)){
//页面转发
request.getRequestDispatcher("main.jsp").forward(request, response);
}
%>
访问 login.jsp ,然后点击 登录 按钮,查看地址栏信息与页面信息。地址栏信息未发生变化,而页面进行了跳转,说明转发发生在服务器,由服务器完成。转发后,页面能够展示登录信息,说明转发可以共享请求的参数

五、Session:维持用户会话状态
HTTP协议是无状态的,服务器无法主动识别用户身份,Session机制通过"会话ID"实现用户追踪,是维持登录状态、存储用户信息的核心技术。
1. Session工作原理
- 用户第一次访问服务器时,服务器创建Session对象,生成唯一标识符
JSESSIONID; - 服务器通过Cookie将
JSESSIONID发送到客户端浏览器; - 后续用户所有请求都会携带
JSESSIONID,服务器通过该ID找到对应的Session对象,从而识别用户身份; - Session有过期时间,用户长时间无操作会自动失效(默认30分钟)。
2. 核心常用方法
void setAttribute(String key, Object value):存储数据到Session;Object getAttribute(String key):从Session获取数据;void invalidate():强制使Session失效(如退出登录);void setMaxInactiveInterval(int interval):设置Session过期时间(单位:秒);String getId():获取Session的JSESSIONID。
3. 例子:登录状态维持
(1)登录处理页面(process.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// 登录验证
if ("admin".equals(username) && "123456".equals(password)) {
// 存储用户信息到Session
session.setAttribute("loginUser", username);
// 设置Session过期时间为15分钟(900秒)
session.setMaxInactiveInterval(15 * 60);
// 重定向到主页面
response.sendRedirect("main.jsp");
} else {
// 存储错误信息
session.setAttribute("errorMsg", "用户名或密码错误");
response.sendRedirect("login.jsp");
}
%>
(2)主页面(main.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 验证Session是否存在用户信息(未登录或超时则跳转)
String loginUser = (String) session.getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("login.jsp");
return; // 终止后续代码执行
}
%>
<html>
<head><title>主页面</title></head>
<body>
<div>欢迎您,<%= loginUser %>!</div>
<a href="logout.jsp">退出登录</a>
</body>
</html>
(3)退出登录页面(logout.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 强制使Session失效
session.invalidate();
// 跳转回登录页
response.sendRedirect("login.jsp");
%>
4. Session过期时间设置方式
-
Tomcat全局配置 :修改
Tomcat/conf/web.xml,单位为分钟:xml<session-config> <session-timeout>30</session-timeout> </session-config> -
项目局部配置 :修改项目
WEB-INF/web.xml(优先级高于全局); -
代码动态配置 :
session.setMaxInactiveInterval(900)(单位为秒)。
六、Cookie:客户端状态存储
Cookie是服务器保存在客户端的文本信息,适用于"记住密码""自动登录"等场景,与Session形成"客户端-服务器"的状态存储互补。
1. Cookie核心特性
- 存储在客户端,数据量有限
- 可设置有效期,过期后自动删除
- 支持跨页面访问,需注意路径和域名限制
2. 核心常用方法
Cookie(String name, String value):构造方法(名称不能含特殊字符);void setMaxAge(int expiry):设置有效期(秒,正数=持久化,0=立即删除,-1=会话级);String getName():获取Cookie名称;String getValue():获取Cookie值;void setPath(String path):设置Cookie生效路径(如/表示整个项目)。
3. 实战案例:记住密码功能🐦🔥🐦🔥🐦🔥
(1)登录页面(login.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>response内置对象</title>
</head>
<%
String username = "",password= "";
boolean rememberMe = false;
// 从请求中获取Cookie信息
Cookie [] cookies = request.getCookies();
if(cookies != null){
for(Cookie c : cookies){
String name = c.getName();
if("username".equals(name)){
username = c.getValue();
}else if("password".equals(name)){
password = c.getValue();
}else if("rememberMe".equals(name)){
rememberMe = "on".equals(c.getValue());
}
}
}
%>
<body>
<form action="process.jsp" method="post">
<div>
<span>用户名</span>
<input type="text" name="username" value="<%=username%>">
</div>
<div>
<span>密码</span>
<input type="password" name="password" value="<%=password%>">
</div>
<div>
<input type="checkbox" name="rememberMe" checked="<%= rememberMe ? "checked" : ""%>">记住密码
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
(2)登录处理页面(process.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
String rememberMe = request.getParameter("rememberMe");
if("admin".equals(username) && "123456".equals(password)){
session.setAttribute("username",username);
session.setAttribute("password",password);
// 只有登录成功并且勾选了记住密码的情况下才会记住密码
if("on".equals(rememberMe) == false){ // 勾选了记住密码
username = "";
password = "";
rememberMe = "";
}
Cookie usernameCookie = new Cookie("username",username);
Cookie passwordCookie = new Cookie("password",password);
Cookie rememberMeCookie = new Cookie("rememberMe",rememberMe);
// 记住密码是属于服务器端对用户端操作的一种响应,这个响应就是使用功能cookie来存储账号和密码
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
response.addCookie(rememberMeCookie);
//页面重定向至主页面
response.sendRedirect("main.jsp");
}
%>
(2)登录成功后的显示页面(main.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file ="timeout.jsp"%>
<%
// String username = request.getParameter("username");
String username =(String) session.getAttribute("username");
// String password = request.getParameter("password");
String password =(String) session.getAttribute("password");
String sessionId = session.getId();
%>
<div>用户名:<%=username%></div>
<div>密码:<%=password%></div>
<div>sessionId:<%=sessionId%></div>
用户名和密码均输入正确后:

七、include指令
include指令用于将其他页面内容嵌入当前页面,适用于抽取公共组件(如导航栏、登录验证),实现页面模块化。
1. 语法格式
jsp
<%@ include file="目标页面路径" %>
2. 栗子:登录超时验证
(1)超时验证页面(timeout.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 验证用户是否登录超时
if (session.getAttribute("loginUser") == null) { // 登录超时(session超时,session会被回收,里面存的数据就没有了)
response.sendRedirect("login.jsp");
return;
}
%>
(2)主页面引用(main.jsp)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="timeout.jsp" %> <!-- 嵌入登录验证 -->
<html>
<head><title>主页面</title></head>
<body>
<div>欢迎访问系统主页面!</div>
</body>
</html>
八、application对象:全局数据共享
application对象对应ServletContext,生命周期与服务器一致,用于存储全局共享数据(如网站访问量、系统配置)。
栗子:统计网站访问次数
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 从application获取访问量(服务器启动后持续存在)
Integer count = (Integer) application.getAttribute("visitCount");
// 首次访问初始化,否则自增
if (count == null) {
count = 1;
} else {
count++;
}
// 保存更新后的访问量
application.setAttribute("visitCount", count);
%>
<html>
<head><title>网站访问统计</title></head>
<body>
<div style="text-align: center; margin-top: 50px;">
<h1>网站的访问次数:<%= count %></h1>
</div>
</body>
</html>
刚进入时页面时显示:网站的访问呢次数:1
后疯狂刷新27次,显示如下图:
如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!
