如何让两个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创建共享实例!"); } %>
关键知识点解释
为什么用Session?
- Session是会话级作用域,同一个浏览器打开的所有请求都会共享这个作用域里的对象,适合用户专属的状态存储。
- 如果需要所有用户共享同一个TestClass实例(比如全局计数器),可以把
session换成application(ServletContext全局作用域)。
关于PrintInteger()方法的文本输出
- 上面的
getFormattedResult()方法负责生成带指定文本的结果字符串,然后在JSP中用out.println()输出,这样业务类和视图逻辑分离,代码更易维护。 - 如果需要在方法内部直接打印到控制台,就用
printInteger()方法,调用时传入你要的前缀文本即可。
- 上面的
内容的提问来源于stack exchange,提问作者Akkarawat Wongnuttanate
相关产品推荐
相关产品推荐

