我想在我的Spring MVC应用程序的会话中存储对象列表,以便我可以在JSP内迭代它们以在下拉列表中创建选项。在会话范围中存储对象列表Spring MVC的ApplicationListener
大约两个小时的阅读帖子和博客后,我很困惑。事实上,我甚至不知道从哪里开始。任何人都可以指向一个满足以下标准的基于Spring的解决方案[文档,教程,示例]的方向吗?
- 列表的值从数据库表中提取。
- 该列表在应用程序启动过程中加载。
- 它不直接访问控制器内的会话。
我想在我的Spring MVC应用程序的会话中存储对象列表,以便我可以在JSP内迭代它们以在下拉列表中创建选项。在会话范围中存储对象列表Spring MVC的ApplicationListener
大约两个小时的阅读帖子和博客后,我很困惑。事实上,我甚至不知道从哪里开始。任何人都可以指向一个满足以下标准的基于Spring的解决方案[文档,教程,示例]的方向吗?
你应该定义一个spring bean。您可以在this question的答案中看到如何在启动时在bean中运行代码。像ApplicationListener这样的东西应该可以工作。在启动代码,你可以将表加载到内存(听起来好像是你在找什么。)
在你的控制你注入的Spring bean其中有一个方法来获得你所需要的值。然后,您在您的请求处理这些值添加到模型(不是会话),并用该模型通过它可以遍历值,并将其显示在视图(JSP页面)。
创建一个类读取值,并通过实施org.springframework.beans.factory.InitializingBean
放入列表界面如:
public class ListLoader implements InitializingBean{
....
....
public List<String> getMyList(){
...
...
}
}
在配置文件中添加豆:
<bean id="myListLoader" class="com.....ListLoader">
...
</bean>
要访问:
ListLoader myListLoader= (ListLoader)context.getBean("myListLoader");
List<String> myValues= = myListLoader.getMyList();
InitializingBean是否有注释? –
@ kmb385:我不这么认为。如果你想注解,那么你可能想尝试使用'@ PostContruct',即来自J2EE的'javax.annotation.PostConstruct'。 –
感谢您的帮助 –
只是提供一些进一步明晰到我如何解决这个问题,我选择回答我自己的问题。
1.如DigitalJoel的回答表明,我创建了一个ApplicationListener
豆。每次刷新上下文时都会触发此侦听器。
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。
应用的context.xml(弹簧配置)
<bean id="lookupLoader"
class="org.tothought.controllers.initializers.LookupLoader" />
3.然后,向此豆置于每个请求我创建的在每接收到一个请求时执行的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>
所以你不使用弹簧reqeust处理程序,你可以将它添加到模型,也许作为modelattribute? – digitaljoel
感谢您的帮助,您对此方法有何看法:http://2mohitarora.blogspot.com/2012/06/load-reference-data-from-database-in.html看起来有些粗略对我来说。 –
感谢Joel,我能够根据你的指示获得一切设置,但是我使用HandlerInterceptor将我的列表放入请求中。 –