0

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

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

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

3 回答 3

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();
于 2012-11-16T17:45:31.700 回答
1

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

1. 正如 DigitalJoel 的回答中所建议的,我创建了一个ApplicationListenerbean。每次刷新上下文时都会触发此侦听器。

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每次收到请求时执行的。在这个 bean 中,我自动装配了 LookupLoader 并在请求中设置了我的列表。

LookupHandlerInterceptor.java

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);
    }
}

4.在Spring MVC web应用配置中注册HandlerInterceptor

servlet-context.xml

<!-- 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>

5. 通过 JSP & JSTL 访问列表

<c:forEach var="category" items="${skillCategories}">
    ${category.name}
</c:forEach>
于 2012-11-16T19:13:39.707 回答
1

你应该定义一个spring bean。您可以在此问题的答案中了解如何在启动时在 bean 中运行代码。像 ApplicationListener 这样的东西应该可以工作。在该启动代码中,您可以将表加载到内存中(听起来这就是您要查找的内容。)

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

于 2012-11-16T17:40:37.090 回答