当前位置: 首页 > 知识库问答 >
问题:

在SpringMVC中,如何在控制器之间共享SessionAttribute?

洪高阳
2023-03-14

我想使用@SessionAttributes注释在SpringMVC中的两个控制器之间共享会话属性。

下面是我用来测试属性共享的一个简单代码:AController。JAVA

@Controller
@SessionAttributes("myParam")
public class AController {

@RequestMapping(value="/a")
public String handle(Model model){

    if(!model.containsAttribute("myParam"))
        model.addAttribute("myParam", randomInt());

    return "a";
}

private int randomInt(){
    return new Random().nextInt(100);
}

}

a.jsp

<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page A</h1>
<p>Param = ${myParam}</p>
</html>

BController.java

@Controller
@SessionAttributes("myParam")
public class BController {

@RequestMapping(value="/b")
public String handle(Model model){

    if(!model.containsAttribute("myParam"))
        model.addAttribute("myParam", randomInt());

    return "b";
}

private int randomInt(){
    return new Random().nextInt(100);
}

}

b.jsp

<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<h1>Page B</h1>
<p>Param = ${myParam}</p>

我期望的行为是转到 /aURL,myParam将被设置为0到99之间的随机值,然后该值将在两个控制器之间共享。

但是,会发生以下情况:我转到/a URL,myParam被设置为一个值(假设为10)。然后我转到/b URL,myParam被设置为另一个值(比如20)。当我返回到/a URL时,myParam值是由BController设置的值(myParam=20)。

一旦两个控制器方法被执行,该值被共享,但是在此之前,每个控制器重新定义一个新值。

似乎如果一个控制器从未为SessionAttribute设置过值,那么如果该属性是由另一个控制器设置的,则它不会检测到该属性。

我真的希望能够在不使用HttpSession对象和SpringMVC3对象的情况下在控制器之间共享会话属性。

我想知道我是否遗漏了什么,或者是否有其他方法在控制器之间的会话中共享数据

注意:webapp部署在Tomcat7服务器上。

共有1个答案

养枫涟
2023-03-14

在SpringMVC中,@SessionAttributes并不意味着在多个控制器之间共享。

我所做的是创建一个具有会话范围的对象(通过POJO),它保存了我需要为会话存储的所有值。

然后,我使用JDK动态代理将对象自动连接到控制器。

 类似资料:
  • 问题内容: 我有一项从服务器中获取一些客户端数据的服务: 然后在一个控制器中执行: 一切都很好。但是,我正在尝试从该服务上的另一个控制器进行监视,以在数据更改时更新其范围,而不是必须重新启动http请求: 我现在只是提醒,但从未触发过。页面最初加载时,它会发出“未定义”警报。我在控制台中没有任何错误,并且所有$ injects都很好,但是似乎从未意识到服务中的数据已更改。我在手表上做错了吗? 非常

  • 问题内容: 我正在尝试在控制器之间共享数据。用例是一个多步骤的表单,在一个输入中输入的数据以后会在原始控制器之外的多个显示位置中使用。下面和jsfiddle中的代码。 的HTML JS 任何帮助是极大的赞赏。 问题答案: 一个简单的解决方案是让您的工厂返回一个对象,并让您的控制器使用对同一对象的引用: JS: HTML: 演示: http : //jsfiddle.net/HEdJF/ 当应用程序

  • 问题内容: 我是angular的新手,我想知道如何在angular的控制器之间共享变量。我正在使用以下脚本- 在Main.js中: 在Index.html中 我正在发送数据并接收响应的ajax一切正常,我的问题如下: 在SearchCtrl函数中,我有一个名为$ scope.result的变量,稍后在Index.html中进行引用。如果我将包含该变量的html代码插入SearchCtrl控制器,则

  • 问题内容: 我正在尝试在控制器之间共享数据。用例是一个多步骤的表单,在一个输入中输入的数据以后会在原始控制器之外的多个显示位置中使用。下面和jsfiddle中的代码。 HTML JS 问题答案: 一个简单的解决方案是让您的工厂返回一个对象,并让您的控制器使用对同一对象的引用: JS: HTML: 当应用程序变得更大,更复杂且难以测试时,您可能不希望以这种方式从工厂公开整个对象,而是例如通过gett

  • 问题内容: 我想知道什么是在控制器之间共享指令的好方法。我有两个指令要在具有不同配置的不同控制器中使用,首先想到的是我想到的使用方法: 这样,我可以使用子控制器中的所有功能,但是由于碰撞问题,我不太喜欢。由于您不能使用服务(不能在服务中使用$ scope),其他选择可以是其他指令或将代码放入运行块,但使用父控制器则完全相同,因此您怎么看? ? 更新 您如何看待这种方法? RIUPDATE这似乎是最

  • 我在Spring控制器的2个webservice中使用了相同的ArrayList,所以我想使用请求或会话范围从DB中获取一次,我尝试制作一个bean } 在控制器中 application context CTX = new AnnotationConfigApplicationContext(example bean。类);AttendeesBean attendee bean = CTX .