2012-11-16 78 views
0

我想在我的Spring MVC应用程序的会话中存储对象列表,以便我可以在JSP内迭代它们以在下拉列表中创建选项。在会话范围中存储对象列表Spring MVC的ApplicationListener

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

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

回答

1

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

在你的控制你注入的Spring bean其中有一个方法来获得你所需要的值。然后,您在您的请求处理这些值添加到模型(不是会话),并用该模型通过它可以遍历值,并将其显示在视图(JSP页面)。

+0

感谢您的帮助,您对此方法有何看法:http://2mohitarora.blogspot.com/2012/06/load-reference-data-from-database-in.html看起来有些粗略对我来说。 –

+0

感谢Joel,我能够根据你的指示获得一切设置,但是我使用HandlerInterceptor将我的列表放入请求中。 –

1

创建一个类读取值,并通过实施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(); 
+0

InitializingBean是否有注释? –

+0

@ kmb385:我不这么认为。如果你想注解,那么你可能想尝试使用'@ PostContruct',即来自J2EE的'javax.annotation.PostConstruct'。 –

+0

感谢您的帮助 –

1

只是提供一些进一步明晰到我如何解决这个问题,我选择回答我自己的问题。

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> 
+0

所以你不使用弹簧reqeust处理程序,你可以将它添加到模型,也许作为modelattribute? – digitaljoel