2015-08-15 80 views
1

我在控制器中创建了两个会话范围对象,如@SessionAttributes({"userObj","simpleValue"})如何在Spring中存储数据是会话范围

我加入这些变量中的用户对象和字符串在我的控制器是这样的:

modelAndView.addObject("userObj", user); 
modelAndView.addObject("simpleValue", "Hello World"); 

User类是一个简单的类与2个属性id & name。假设我在一个名为Controller1的控制器中创建了这个控制台,它显示了Page1。我可以在page1中看到我的会话变量的数据。

现在我创造了另一个控制器说Controller2(该控制器具有page1Controller1没有关系),这显示page2,现在在这个新的一页,我只能够访问单个会话属性为simpleValue,我不能够访问userObj,我得到空的结果。

按照该@SessionAttributes,它说:

注:由于使用这个注解来表示对应 到指定的处理器的模型属性,越来越透明地储存 在对话会话的会话属性。一旦 处理程序指示完成其会话会话,那些属性将被删除。因此, 使用此功能的这种对话属性 应该在 特定处理程序的对话过程中临时存储在会话中。

所以我有2个问题在这里:

1)我无法理解为什么春天让我访问page2简单的属性,但不是用户对象。

2)该文件还说,我们必须使用传统的sessionWebRequest。我能够使用sessison并访问变量,但有人可以帮助我如何使用WebRequest在会话中存储对象?

这是我使用的代码:

Controller1.java

@Controller 
@SessionAttributes({"mySessionAttr","userObj"}) 
public class Controller1 { 

    @RequestMapping(value="/page1") 
    public ModelAndView singleFieldPage() { 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.addObject("mySessionAttr", "Hello World"); 
     modelAndView.addObject("userObj", new User(1,"Scott")); 
     modelAndView.setViewName("page1"); 
     return modelAndView; 
    } 
} 

Controller2.java

@Controller 
public class Controller2 { 

    @RequestMapping(value="/page2") 
    public ModelAndView singleFieldPage(HttpSession session) { 
     return new ModelAndView("page2"); 
    } 
} 

的Page1.jsp & page2.jsp ,都有相同的代码。

<p>Session variable : ${simpleValue}</p> 
<p>Product's name is ${userObj.name}. The id is ${userObj.id} 

这是我的用户。java的

公共类用户{

private int id; 
private String name; 

public User() { 
} 

public User(int id, String name) { 
    this.id = id; 
    this.name = name; 
} 

    // Setters & Getters 
} 

这是我的配置文件:

春基于配置

@Configuration 
@ComponentScan("com.examples") 
@EnableWebMvc 
public class WebAppConfig { 

    @Bean 
    public UrlBasedViewResolver setupViewResolver() { 
     UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
     resolver.setPrefix("/WEB-INF/pages/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setViewClass(JstlView.class); 
     return resolver; 
    } 

} 

基于Web的配置

public class Initializer implements WebApplicationInitializer { 

    public void onStartup(ServletContext servletContext) throws ServletException { 

     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 

     ctx.setServletContext(servletContext); 

     Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 

    } 

} 
+0

你可以发布User类的实现吗? –

+0

好友发布您的控制器1的代码为post方法,我有强烈的怀疑,你正在做status.setComplete(); – Mudassar

+0

@FranciscoSpaeth,添加了我的代码,请检查并告诉我是否需要其他细节。 – Chaitanya

回答

0

@SessionAttribute绑定到单个控制器,因此控制器也负责管理该会话上下文。如果你想谈话使用网络流量。

最初由javadoc的

因为使用这种注释指示的会话属性对应一个特定的处理程序的模型属性,越来越透明地储存在对话会议上公布。一旦处理程序指示会话会话完成,那些属性将被删除。因此,在特定处理程序的对话过程中,应该使用此工具来处理会话临时存储的会话属性。

虽然这里使用术语对话,但它基本上是与单个处理程序(本例中为控制器)的对话,而不是多个处理程序的对话。对于这种情况和更好的控制使用Spring Web Flow。

1

从我的角度来看,用户对象的问题在于类User未实现Serializable的事实。

而且关于WebRequest,它基本上是为NativeWebRequestAsyncWebRequest的抽象,因为你可以在documentation看到:

通用接口的Web请求。主要用于通用网络 请求拦截器,使它们可以访问一般请求元数据 而不是实际处理请求。

这种做法,WebRequestInterceptor可以用于Servlet的以及门户组件请求作为规定的documentation

一般web请求拦截接口。允许将 应用于Servlet请求以及Portlet请求环境,由 构建于WebRequest抽象上。