0

我通常使用 Struts2,但出于各种原因,我正在探索 Spring 的使用,最值得注意的是 rest 样式 url 功能的灵活性。我想我也会尝试利用作用域 bean 在控制器之间存放一些数据。这是一个相对较大的项目,我有几个不同的控制器来处理站点的不​​同方面。

我遇到的是我在我的控制器中声明了一个 @Component 和 @Autowiring 它,但是数据没有在会话 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 内的事件实体始终为空。

我只玩了 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>
4

1 回答 1

0

您有 2 个选项可以解决此问题。希望这可以帮助。

  1. 使用@SessionAttributes("event")。这将确保模型存储在会话中,并且可以跨容器使用。您的课程将如下所示。请注意,在跨控制器使用会话属性时应谨慎使用,但是我自己没有遇到任何问题,并且使用它们没有问题。

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

于 2013-07-17T05:59:35.137 回答