0

Spring MVCアプリケーションのセッションにオブジェクトのリストを保存しようとしています。これにより、JSP内でオブジェクトを反復処理して、ドロップダウンでオプションを作成できます。

投稿やブログを約2時間読んだ後、私は非常に混乱しています。実際、どこから始めればいいのかさえわかりません。次の基準を満たすSpringベースのソリューション[ドキュメント、チュートリアル、例]の方向に誰かが私を向けることができますか?

  1. リストの値は、データベーステーブルから取得されます。
  2. このリストは、アプリケーションの起動時に読み込まれます。
  3. コントローラ内のセッションに直接アクセスすることはありません。
4

3 に答える 3

1

春の豆を定義する必要があります。この質問への回答で、起動時にBean内でコードを実行する方法を確認できます。ApplicationListenerのようなものが機能するはずです。そのスタートアップコードでは、テーブルをメモリにロードできます(それがあなたが探しているもののように聞こえます)。

コントローラ内に、必要な値を取得するメソッドを持つSpringBeanを注入します。次に、これらの値をリクエストハンドラーのモデル(セッションではなく)に追加すると、モデルはビュー(JSPページ)によって使用され、値を反復処理して表示できます。

于 2012-11-16T17:40:37.090 に答える
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配置するために、リクエストが受信されるたびに実行されるaを作成しました。この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. SpringMVCWebアプリケーション構成内にHandlerInterceptorを登録します

サーブレット-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 に答える