【JavaWeb学习 | 第17篇】JSP内置对象


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

文章目录

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请求 :该方法无效,需通过字符串转码处理:

    java 复制代码
    String 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工作原理

  1. 用户第一次访问服务器时,服务器创建Session对象,生成唯一标识符JSESSIONID
  2. 服务器通过Cookie将JSESSIONID发送到客户端浏览器;
  3. 后续用户所有请求都会携带JSESSIONID,服务器通过该ID找到对应的Session对象,从而识别用户身份;
  4. 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次,显示如下图:


如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
花花鱼24 分钟前
nginx 解决跨域问题
前端·javascript·nginx
高级盘丝洞25 分钟前
openPOWERLINK c读取数据并送到mqtt
c语言·开发语言
步步为营DotNet25 分钟前
深入解读CancellationToken:.NET异步操作的精准控制
java·前端·.net
曹牧25 分钟前
Java中使用List传入Oracle的IN查询
java·oracle·list
笙年26 分钟前
Promise详解:从回调地狱到优雅异步
前端·javascript
良木林27 分钟前
webpack:基本打包方法
前端·webpack·node.js
core51228 分钟前
实战:用 Spring Boot 搭建 Model Context Protocol (MCP) 服务
java·spring boot·后端·model·模型·mcp
2201_7578308730 分钟前
线程池超详细解释
java
今天吃饺子32 分钟前
数据清洗APP重大更新!我用MATLAB写了一个数据清洗APP
开发语言·matlab