我正在尝试在Spring MVC应用程序的会话中存储一个对象列表,以便我可以在JSP中迭代它们以在下拉列表中创建选项。
经过大约两个小时阅读帖子和博客后,我感到非常困惑。事实上,我甚至不知道从哪里开始。任何人都可以指向符合以下标准的基于Spring的解决方案[文档,教程,示例]的方向吗?
答案 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}}