我在会话范围内创建了两个对象,例如我的控制器中的@SessionAttributes({"userObj","simpleValue"})
。
我在控制器中的这些变量中添加了一个用户对象和String,如下所示:
modelAndView.addObject("userObj", user);
modelAndView.addObject("simpleValue", "Hello World");
User
类是一个简单的类,有2个属性id
& name
。
假设我在名为Controller1
的控制器中创建了这个,显示Page1
。我可以在page1
中看到会话变量的数据。
现在我创建了另一个控制器说Controller2
(此控制器与page1
或Controller1
无关),显示page2
,现在在这个新页面我能够只访问simpleValue
的单个会话属性,我无法访问userObj
,我的结果是空的。
根据@SessionAttributes,它说:
注意:使用此注释指示的会话属性对应 到特定处理程序的模型属性,获得透明存储 在会话中。这些属性将被删除一次 handler表示其会话会话已完成。因此, 将此工具用于此类会话属性 应该在课程期间暂时存储在会话中 特定处理程序的对话。
所以我在这里有两个问题:
1)我无法理解为什么Spring允许我访问page2
中的简单属性而不是User对象。
2)该文件还说我们必须使用传统的session
或WebRequest
。我可以使用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);
}
}
答案 0 :(得分:1)
从我的角度来看,用户对象的问题在于,User
类没有实现Serializable
。
关于WebRequest
,它基本上是NativeWebRequest
和AsyncWebRequest
的抽象,正如您在documentation看到的那样:
Web请求的通用接口。主要用于通用Web 请求拦截器,让他们访问一般请求元数据, 不是为了实际处理请求。
使用这种方法,WebRequestInterceptor
可以用于Servlet以及Portlet请求作为状态documentation:
一般Web请求拦截的接口。允许存在 应用于Servlet请求以及Portlet请求环境 建立在WebRequest抽象上。