2011-11-08 7 views
2

私のJSPページでアプリケーションコンテキストを取得しようとしています。 私はJSPで以下のスクリプトレットを持っています。JSPでnull nullのアプリケーションコンテキスト

 WebApplicationContext appCtx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
     MyClass myClass = (MyClass)(appCtx.getBean("myClass")); 

これを使用すると、アプリケーションコンテキストに対してNULLポインタ例外がスローされます。 ここで何が間違っていますか? 私はアプリケーションコンテキストを必要としないので、application-context.xmlファイルはありません。私は通常のディスパッチャ - servlet.xmlにハンドラマッピングを持っています。

また、追加情報として: 外部環境変数から読み込み、 "myClass"に注入するPropertyPlaceholderConfigurerを使用して注入されているこの "myClass"オブジェクトにアクセスしようとしています。すべてのポインタ?

更新:

示唆したように、私は「RequestContextUtils」を使用してみましたが、現在は「いいえWebApplicationContextが見つかり:ないDispatcherServletの要求に」取得しています例外。 BeanにアクセスしようとしているJSPがアプリケーションのエントリポイントです。 マイビューリゾルバは次のようになり、

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/WEB-INF/views/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
    <property name="exposedContextBeanNames"> 
     <value>myClass</value> 
    </property> 
    </bean> 

JSPがアクセスしようとしていますが、この「意見」フォルダの外にあります。お知らせください

+2

私はSpring MVCを実行しませんが、Spring MVCではEL '$ {myClass} 'だけではありませんか?とにかくJavaコードはJSPに属していません。 – BalusC

+1

なぜJSP内のアプリコンテキストにアクセスしようとしていますか?あなたはMVCを使用しています、ビュー層のためのものはコントローラを通して公開されるべきです。 –

+0

@BalusC:ビューリゾルバがBeanを属性として公開するように設定されている場合のみ。 – axtavt

答えて

4

WebApplicationContextUtils.getRequiredWebApplicationContext()ContextLoaderListener(つまりapplicationContext.xml)に関連付けられたアプリケーションコンテキストを返します。

DispatcherServletに関連付けられたコンテキストを取得するには、RequestContextUtils.getWebApplicationContext(request)に電話する必要があります。

また、InternalResourceViewResolverを設定して、Beanを属性として公開することもできます。次に、JSP内のBeanには${myClass}という名前でアクセスできます。 exposeContextBeansAsAttributestrueに設定することで、すべてのBeanを公開することができます(パフォーマンスペナルティが発生すると思います)。具体的には、exposedContextBeanNamesで公開するBeanを明示的にリストします。

+0

この提案に基づいて質問を更新しました。残念ながら私の場合は動作しません – Raghav

+1

@Srini:もしそうなら、あなたは 'DispatcherServlet'のコンテキストにアクセスすることができません。場合によっては、すべてのJSPを 'DispatcherServlet'の後ろに置く方がよいでしょう。あなたの問題も解決します。簡単なコントローラを書くのを避けるには、 ' 'を使うことができます。 – axtavt

+0

axtavtが示唆していたように、JSPを前のコントローラの後ろに動かすようにしました。みんなのおかげで彼らの提案 – Raghav