存储会话范围中的对象列表Spring MVC的ApplicationListener

时间:2012-11-16 17:21:36

标签: java spring spring-mvc

我正在尝试在Spring MVC应用程序的会话中存储一个对象列表,以便我可以在JSP中迭代它们以在下拉列表中创建选项。

经过大约两个小时阅读帖子和博客后,我感到非常困惑。事实上,我甚至不知道从哪里开始。任何人都可以指向符合以下标准的基于Spring的解决方案[文档,教程,示例]的方向吗?

  1. 列表的值从数据库表中提取。
  2. 在应用程序启动期间加载列表。
  3. 它不直接访问控制器内的会话。

3 个答案:

答案 0 :(得分:1)

你应该定义一个spring bean。您可以在this question的答案中看到如何在启动时在bean中运行代码。像ApplicationListener这样的东西应该可行。在该启动代码中,您可以将表加载到内存中(听起来就像您正在寻找的那样。)

在你的控制器中你注入了一个spring bean,它有一个方法来获取你需要的值。然后,将这些值添加到请求处理程序中的Model(而不是会话)中,并且视图(您的JSP页面)使用Model,它可以迭代值并显示它们。

答案 1 :(得分:1)

通过实现org.springframework.beans.factory.InitializingBean接口创建一个读取值并放入列表的类,例如:

      public class ListLoader implements InitializingBean{
       ....
       ....
       public List<String> getMyList(){
         ...
         ...
       }
     }

在配置文件中添加bean:

   <bean id="myListLoader" class="com.....ListLoader">
    ...
   </bean>

要访问它:

   ListLoader myListLoader= (ListLoader)context.getBean("myListLoader");
   List<String> myValues= = myListLoader.getMyList();

答案 2 :(得分:1)

为了进一步澄清我如何解决这个问题,我选择回答我自己的问题。

<强> 1。正如DigitalJoel的回答所建议的,我创建了一个ApplicationListener bean。每次刷新上下文时都会触发此监听器。

LookupLoader.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.tothought.entities.SkillCategory;
import org.tothought.repositories.SkillCategoryRepository;

public class LookupLoader implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    SkillCategoryRepository repository;

    private List<SkillCategory> categories;


    public List<SkillCategory> getCategories() {
        return categories;
    }

    public void setCategories(List<SkillCategory> categories) {
            this.categories = categories;           
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if(this.categories == null){
            this.setCategories(repository.findAll());               
        }
    }
}

<强> 2。接下来,我在我的应用程序配置中注册了这个bean。

application-context.xml(Spring-Config)

<bean id="lookupLoader"
    class="org.tothought.controllers.initializers.LookupLoader" />

第3。然后,为了将这个bean放在每个请求中,我创建了一个HandlerInterceptorAdapter,每次收到请求时都会执行该import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.tothought.controllers.initializers.LookupLoader; public class LookupHandlerInterceptor extends HandlerInterceptorAdapter { @Autowired LookupLoader loader; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute("skillCategories", loader.getCategories()); return super.preHandle(request, response, handler); } } 。在这个bean中,我自动连接LookupLoader并在请求中设置我的列表。

LookupHandlerInterceptor.java

<!-- Intercept request to blog to add paging params -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="org.tothought.controllers.interceptors.LookupHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

<强> 4。在Spring MVC Web应用程序配置中注册HandlerInterceptor

servlet的context.xml中

<c:forEach var="category" items="${skillCategories}">
    ${category.name}
</c:forEach>

<强> 5。通过JSP&amp; amp;访问列表JSTL

{{1}}