2011-12-19 17 views
-1

ポートレットごとに異なるビューリゾルバ(すべてがJstlViewタイプ)を構成できますか?私のJSPのディレクトリ構造は次のようになります。私は、一般的なアプリケーションコンテキストのcommon.xmlおよびポートレットに1つずつ(mydetails-portlet.xmlmyorder-portlet.xml)を持っているポートレットごとに異なるビューリゾルバを使用する

treegen使用して生成

+- WEB-INF 
    | 
    +- jsp 
     | 
     +- myorder 
     | | 
     | |- summary.jsp 
     | | 
     | |- edit-order.jsp 
     | 
     +- mydetails 
     | | 
     | |- summary.jsp 
     | | 
     | |- edit-details.jsp 
     | 
     |- error.jsp 
     | 
     |- success.jsp 

私はまた、任意のポートレット(error.jsp,)から呼び出すことができるいくつかの一般的なJSPを持っています。

common.xml内部viewResolver定義は次のようになります。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/mydetails/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="order" value="1" /> 
</bean> 

そして、私は@RequestMapping内の次の行を使用してerror.jspedit-details.jspを呼び出すために期待しています:mydetails-portlet.xml内部viewResolver定義がどのように見える

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="order" value="2" /> 
</bean> 

コントローラメソッド、例えば、mydetails-portlet:

return "error"; 
return "edit-details"; 

viewResolverJstlViewに複数定義すると古いものが上書きされてしまい、最終的に最後に読み込まれるようになります。この結果、私は私の意見を正しく解決することができません。

return "mydetails/edit-details"のようなハードコードされたパスに頼らずに、私がしようとしていることを達成するための他の方法はありますか?

答えて

2

私はこれをInternalResourceViewResolverに拡張して解決しました。この背後にある論理は簡単です。 InternalResourceViewResolverという性質のため、IRVRが1つしかなく、チェーンの最後に表示されない限り、別のIRVRで実際にチェーンすることはできません。

だから、私たちがキックするチェーン内の次のIRVRを引き起こすいくつかの条件に基づいてビューを解決するときにreturn nullに春を伝える必要があります。

これを行うには、私がしたすべてはIRVRを拡張して使用しました事前に設定されたexcludePrefixがビュー名に存在する場合、私のIRVRはそれを除外して連鎖を起こさせます。

public class ExcludingInternalResourceViewResolver extends 
     InternalResourceViewResolver { 

    private String excludePrefix; 

    @Override 
    public View resolveViewName(String viewName, Locale locale) 
      throws Exception { 

     if (this.excludePrefix != null && viewName.startsWith(this.excludePrefix)) { 
      return null; 
     } 

     return super.resolveViewName(viewName, locale); 
    } 

    public void setExcludePrefix(String excludePrefix) { 
     this.excludePrefix = excludePrefix; 
    } 
} 

まあ、基本的に私が設定され、ビューリゾルバの2セットを持っている:ここでは

は私ExcludingInternalResourceViewResolverがどのように見えるかです。そのうちの一つは、エラー、その宣言のように見える成功のページを処理するための一般的なものである:

<bean id="commonViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="order" value="3" /> 
</bean> 

のように各ポートレット内部に入る他方が見えます:

:私のエラーハンドラがどのように見える

<bean id="viewResolver" class="com.foo.common.spring.web.view.ExcludingInternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/mydetails/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="order" value="1" /> 
    <property name="excludePrefix" value="common" /> 
</bean> 

<bean id="defaultExceptionHandler" class="org.springframework.web.portlet.handler.SimpleMappingExceptionResolver"> 
    <property name="order" value="2" /> 
    <property name="defaultErrorView" value="common/error" /> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="javax.portlet.PortletException">common/portlet-error</prop> 
     </props> 
    </property> 
</bean> 

そして最後に、私は/WEB-INF/jsp/common//WEB-INF/jsp/から私のerror.jspportlet-error.jspを動かしました。

0

はい、できます。 spring-mvcは、設定よりも規則を提供します。 thisの記事を読んでください。 cocの概念を理解するのに役立ちます。要件ごとに、異なるフォルダからの異なるJSPページを使用できます。

+0

私の場合は動作しません。私はspring-portlet-mvcを使用します。 – adarshr

1

xmlファイルの代わりにリソースバンドルを使用することもできます。これは私のために働いた。

このため、あなたのビューが下記のように宣言されたファイルany_name.propertiesがバンドルファイルに含まれている必要があります。

私は、WEB-INF/JSP /飛行/ bookingSuccess.jsp
WEB-INF/JSP/appError

WEB-INF/JSP /飛行/ bookingForm.jsp
次のポートレットJSPファイルを持っています。 jsp

内容any_name.propertiesファイルは以下のとおりです。宣言にはビュー名の後に.(class).urlが続くことに注意してください。


bookingForm.(class)=org.springframework.web.servlet.view.JstlView 
bookingForm.url=/WEB-INF/jsp/flight/bookingForm.jsp 

bookingSuccess.(class)=org.springframework.web.servlet.view.JstlView 
bookingSuccess.url=/WEB-INF/jsp/flight/bookingSuccess.jsp 

これは、バンドルをany_name.propertiesがあなたのAPPVIEW-portlet.xmlの設定ファイルに統合する必要があります(あなたのportlet.xmlで宣言さAPPVIEWポートレットを持っていると仮定)。あなたはcom.module.viewsパッケージにany_name.propertiesを配置した場合

、あなたは以下のように設定する必要があります。 appError.jspについては

<!-- View Resolver --> 
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
     <property name="basenames"> 
      <list> 
     <value>com.module.views.any_name</value> 
      </list> 
     </property> 
    </bean> 

、デフォルトのビューリゾルバを持つことができ、もしあれば、あなたのapplicationContext.xmlをファイルで宣言。

<!-- Default View Resolver --> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="cache" value="true"/> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

希望します。