我通常使用Struts2,但我正在探索Spring的使用有多种原因,最值得注意的是其余风格的url功能的灵活性。我想我也会尝试利用scoped bean在控制器之间存放一些数据。这是一个相对较大的项目,我有一些不同的控制器来处理网站的不同方面。
我遇到的是我在控制器中声明@Component和@Autowiring它,但是会话bean中的控制器之间没有持久保存数据。
Bean示例:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class EventBean implements Serializable {
private Event event;
...
}
控制器示例:
@Controller
public class EventController {
@Autowired
private EventBean event;
@ModelAttribute("event")
public EventBean getEvent() {
return event;
}
@RequestMapping(value = "/{url}", method = RequestMethod.GET)
public String getEvent(@PathVariable String url, ModelMap model) {
model.addAttribute("url", url);
try {
// EventEntity in the bean is set by the url from DB
event.setEvent(url);
} catch (SQLException ex) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, null, ex);
}
return "public/index";
}
}
现在我的目标是,如果我在此控制器中设置事件,如果在第二个控制器中我访问事件bean并且实体不为空,则无需再次访问数据库。
public void setEvent(String url) throws SQLException {
if (this.event == null) {
this.event = EventDAO.retrieveByURL(url);
}
}
但这不会发生。当我导航到第二个控制器时,bean内的事件实体始终为null。
我只和Spring玩弄了几天,所以我确定我错过了什么,只是不确定我错过了什么。任何想法都将不胜感激。
编辑:
调用JSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home</title>
</head>
<body>
<h1>Event Name: ${event.name}</h1>
<h2>Event URL: ${url}</h2>
</body>
</html>
答案 0 :(得分:0)
有两种方法可以解决此问题。希望这会有所帮助。
使用@SessionAttributes(“event”)。这将确保模型存储在会话中并且可以跨容器使用。您的课程将如下所示。请注意,跨控制器使用sessionattributes时应谨慎使用,但我自己没有遇到任何问题并且没有问题地使用它们。
@Controller
@SessionAttributes("event")
public class EventController {
@Autowired
private EventBean event;
@ModelAttribute("event")
public EventBean getEvent() {
return event;
}
@RequestMapping(value = "/{url}", method = RequestMethod.GET)
public String getEvent(@PathVariable String url, ModelMap model) {
model.addAttribute("url", url);
try {
// EventEntity in the bean is set by the url from DB
event.setEvent(url);
} catch (SQLException ex) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, null, ex);
}
return "public/index";
}
}
其他选项是使用spring提供的表单标签,以便在调用第二个控制器时根据请求构造“event”对象。 http://www.dzone.com/tutorials/java/spring/spring-form-tags-1.html