Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何存储数据是Spring中的会话范围_Spring_Spring Mvc_Session_Scope - Fatal编程技术网

如何存储数据是Spring中的会话范围

如何存储数据是Spring中的会话范围,spring,spring-mvc,session,scope,Spring,Spring Mvc,Session,Scope,我在会话作用域中创建了两个对象,如我的控制器中的@SessionAttributes({“userObj”,“simpleValue”}) 我正在控制器中的这些变量处添加一个用户对象和字符串,如下所示: modelAndView.addObject("userObj", user); modelAndView.addObject("simpleValue", "Hello World"); User类是一个简单的类,具有两个属性id和name 假设我在一个名为Controller1的控制器中创

我在会话作用域中创建了两个对象,如我的控制器中的
@SessionAttributes({“userObj”,“simpleValue”})

我正在控制器中的这些变量处添加一个用户对象和字符串,如下所示:

modelAndView.addObject("userObj", user);
modelAndView.addObject("simpleValue", "Hello World");
User
类是一个简单的类,具有两个属性
id
name

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

现在我创建了另一个控制器,比如说
Controller2
(这个控制器与
page1
Controller1
没有关系),它显示
page2
,现在在这个新页面中,我只能访问
simpleValue
的单个会话属性,我无法访问
userObj
,我得到的结果是空的

根据报告,它说:

注意:使用此注释指示的会话属性对应 到特定处理程序的模型属性,以透明方式存储 在会话中。这些属性将在 处理程序指示其会话会话会话的完成。所以,, 将此功能用于以下会话属性: 应在会话过程中临时存储在会话中 特定处理者的对话

我这里有两个问题:

1) 我无法理解为什么Spring允许我访问simple属性,但不允许我访问
page2
中的User对象

2) 该文件还说,我们必须使用传统的
会话
WebRequest
。我可以使用
session
并访问变量,但是有人能帮助我如何使用
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;
    }
}
@Controller
public class Controller2 {

    @RequestMapping(value="/page2")
    public ModelAndView singleFieldPage(HttpSession session) {
        return new ModelAndView("page2");
    }   
}
Controller2.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;
    }
}
@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}
这是我的配置文件:

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

    }

}
基于Web的配置

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

    }

}

@SessionAttribute绑定到单个控制器,因此控制器还负责管理该会话上下文。如果您想要对话,请使用web流

最初由javadoc发布

使用此注释指示的会话属性对应于特定处理程序的模型属性,透明地存储在会话会话中。一旦处理程序指示会话会话完成,这些属性将被删除。因此,将此功能用于会话属性,这些属性应该在特定处理程序的会话过程中临时存储在会话中


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

在我看来,用户对象的问题在于类
user
没有实现
Serializable

关于
WebRequest
,它基本上是对
NativeWebRequest
AsyncWebRequest
的抽象,您可以在以下站点看到:

web请求的通用接口。主要用于通用网络 请求拦截器,允许它们访问一般请求元数据, 不适用于请求的实际处理

通过该方法,可以将用于Servlet以及Portlet请求,如下所示:

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


你能发布
User
类的实现吗。巴迪发布你控制器1的代码以获取post方法,我强烈怀疑你正在执行status.setComplete()@FranciscoSpaeth,添加了我的代码,请检查并告知我是否需要任何其他详细信息。@Mudassar,我已添加了我正在使用的代码,我的代码中没有
状态。setComplete()
,请检查。