You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个JSP调用同一TestClass对象实现数值累加?

解决JSP间共享TestClass实例实现累加的问题

这问题我之前也碰到过,核心原因是每个JSP请求都是独立的HTTP请求,每次直接new TestClass()都会创建全新的实例,自然没法保留之前的累加状态。要实现9+5=14的效果,你需要把TestClass实例存到跨请求共享的作用域里,同时调整方法来支持指定文本输出。


第一步:调整TestClass的实现

先给TestClass加上累加逻辑和支持自定义文本的输出方法,建议把数据处理和视图输出分离,让类只负责业务逻辑:

public class TestClass {
    private int total = 0;

    // 累加方法:传入要加的数值
    public void add(int num) {
        this.total += num;
    }

    // 生成带指定前缀文本的结果字符串
    public String getFormattedResult(String prefix) {
        return prefix + this.total;
    }

    // 也可以保留直接输出到控制台的方法
    public void printInteger(String prefix) {
        System.out.println(prefix + this.total);
    }
}

第二步:第一个JSP(first.jsp):创建并存储共享实例

不要每次新建对象,而是从Session会话作用域中获取实例——Session会在同一个浏览器会话内的所有请求中共享数据,正好符合你的跳转需求:

<%@ page import="com.yourpackage.TestClass" %>
<%
    // 从Session中尝试获取已有的TestClass实例
    TestClass sharedObj = (TestClass) session.getAttribute("testInstance");
    
    // 如果是第一次访问,创建实例并存入Session
    if (sharedObj == null) {
        sharedObj = new TestClass();
        session.setAttribute("testInstance", sharedObj);
    }

    // 累加9
    sharedObj.add(9);
    
    // 输出到页面(用自定义前缀文本)
    out.println(sharedObj.getFormattedResult("First jsp Integer is : "));
%>

<!-- 跳转到第二个JSP的链接 -->
<a href="second.jsp">跳转到第二个JSP</a>

第三步:第二个JSP(second.jsp):复用已有的共享实例

这里绝对不能再new TestClass(),直接从Session中取出之前存储的实例即可:

<%@ page import="com.yourpackage.TestClass" %>
<%
    // 直接从Session获取已存在的实例
    TestClass sharedObj = (TestClass) session.getAttribute("testInstance");

    if (sharedObj != null) {
        // 累加5
        sharedObj.add(5);
        
        // 输出到页面,此时total已经是9+5=14
        out.println(sharedObj.getFormattedResult("Second Jsp Integer is : "));
    } else {
        out.println("请先访问第一个JSP创建共享实例!");
    }
%>

关键知识点解释

  1. 为什么用Session?

    • Session是会话级作用域,同一个浏览器打开的所有请求都会共享这个作用域里的对象,适合用户专属的状态存储。
    • 如果需要所有用户共享同一个TestClass实例(比如全局计数器),可以把session换成application(ServletContext全局作用域)。
  2. 关于PrintInteger()方法的文本输出

    • 上面的getFormattedResult()方法负责生成带指定文本的结果字符串,然后在JSP中用out.println()输出,这样业务类和视图逻辑分离,代码更易维护。
    • 如果需要在方法内部直接打印到控制台,就用printInteger()方法,调用时传入你要的前缀文本即可。

内容的提问来源于stack exchange,提问作者Akkarawat Wongnuttanate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:00:31