如何存储数据是Spring

时间:2015-08-15 16:39:08

标签: spring spring-mvc session scope

我在会话范围内创建了两个对象,例如我的控制器中的@SessionAttributes({"userObj","simpleValue"})

我在控制器中的这些变量中添加了一个用户对象和String,如下所示:

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

User类是一个简单的类,有2个属性id& name

假设我在名为Controller1的控制器中创建了这个,显示Page1。我可以在page1中看到会话变量的数据。

现在我创建了另一个控制器说Controller2(此控制器与page1Controller1无关),显示page2,现在在这个新页面我能够只访问simpleValue的单个会话属性,我无法访问userObj,我的结果是空的。

根据@SessionAttributes,它说:

  

注意:使用此注释指示的会话属性对应   到特定处理程序的模型属性,获得透明存储   在会话中。这些属性将被删除一次   handler表示其会话会话已完成。因此,   将此工具用于此类会话属性   应该在课程期间暂时存储在会话中   特定处理程序的对话。

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

1)我无法理解为什么Spring允许我访问page2中的简单属性而不是User对象。

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}

这是我的 User.java

公共类用户{

private int id;
private String name;

public User() {
}

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

   // Setters & Getters
}

这是我的配置文件:

基于Spring的配置

@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;
    }

}

基于网络的配置

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);

    }

}

1 个答案:

答案 0 :(得分:1)

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

关于WebRequest,它基本上是NativeWebRequestAsyncWebRequest的抽象,正如您在documentation看到的那样:

  

Web请求的通用接口。主要用于通用Web   请求拦截器,让他们访问一般请求元数据,   不是为了实际处理请求。

使用这种方法,WebRequestInterceptor可以用于Servlet以及Portlet请求作为状态documentation

  

一般Web请求拦截的接口。允许存在   应用于Servlet请求以及Portlet请求环境   建立在WebRequest抽象上。