Spring 3:如何在控制器之间处理基于会话的对象

时间:2013-07-16 21:08:16

标签: java spring session spring-mvc

我通常使用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>

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决此问题。希望这会有所帮助。

  1. 使用@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";
        }
    }
    
  2. 其他选项是使用spring提供的表单标签,以便在调用第二个控制器时根据请求构造“event”对象。 http://www.dzone.com/tutorials/java/spring/spring-form-tags-1.html