我试图在我的 Spring MVC 应用程序的会话中存储一个对象列表,以便我可以在我的 JSP 中遍历它们以在下拉列表中创建选项。
在阅读了大约两个小时的帖子和博客后,我感到非常困惑。事实上,我什至不知道从哪里开始。谁能指出我符合以下标准的基于 Spring 的解决方案 [文档、教程、示例] 的方向吗?
- 列表的值是从数据库表中提取的。
- 该列表在应用程序启动期间加载。
- 它不直接访问控制器内的会话。
我试图在我的 Spring MVC 应用程序的会话中存储一个对象列表,以便我可以在我的 JSP 中遍历它们以在下拉列表中创建选项。
在阅读了大约两个小时的帖子和博客后,我感到非常困惑。事实上,我什至不知道从哪里开始。谁能指出我符合以下标准的基于 Spring 的解决方案 [文档、教程、示例] 的方向吗?
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();
为了进一步说明我是如何解决这个问题的,我选择回答我自己的问题。
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
每次收到请求时执行的。在这个 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>
你应该定义一个spring bean。您可以在此问题的答案中了解如何在启动时在 bean 中运行代码。像 ApplicationListener 这样的东西应该可以工作。在该启动代码中,您可以将表加载到内存中(听起来这就是您要查找的内容。)
在您的控制器中,您注入 spring bean,它具有获取所需值的方法。然后,您将这些值添加到请求处理程序中的模型(而不是会话)中,并且模型由视图(您的 JSP 页面)使用,该视图可以迭代这些值并显示它们。