如何存储数据是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()
,请检查。