web-dev-qa-db-ja.com

ThymeleafとJSPの両方を使用する

私はJSP + JSTLを使用していましたが、c:if、c:choose、...

したがって、JSPページをJSPとThymeleafの両方でレンダリングしたい(できるだけ早くすべてのJSTLを削除する予定です)。私はSpring MVCフレームワークを使用しています:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="1" />
</bean>
<!-- Thymeleaf -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
    <property name="order" value="2" />
</bean> 

私のコントローラーでは、エクステンションなしでjspを返します。

return "folder/page";

JSPページを最初にJSPリゾルバーでレンダリングしてから、Thymeleafリゾルバーでレンダリングできますか?はいの場合、どのように?

JSPとThymeleafをチェーン接続するのは非常に複雑なようです。そこで、JSPファイルの内部リゾルバーとHTMLファイルのThymeleafテンプレートリゾルバーを使用したいと思います。どうすればできますか?

17
Athanor

これは@Igd応答に基づく答えです

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="viewNames" value="*.jsp" />
</bean>
<!-- Thymeleaf -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="templateMode" value="HTML5" />
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewNames" value="redirect*" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
    <property name="viewNames" value="*.html" />
</bean> 

そして私はこれをマッピングに使用します:

@RequestMapping("/view1")
public String thymeleafView(){
    return "mythymeleafview.html";
}

@RequestMapping("/view2")
public String jspView(){
    return "myjspview.jsp";
}
3
Athanor

Thymeleafフォーラムの この投稿 によると、2つの解決策があります。

最初のソリューション

サフィックスプロパティを削除 Bean宣言(<property name="suffix" value=".html" />および<property name="suffix" value=".jsp" />)とpass suffixコントローラーの戻り値で、例えば:

@RequestMapping("/view1")
public String thymeleafView(){
    return "mythymeleafview.html";
}

@RequestMapping("/view2")
public String jspView(){
    return "myjspview.html";
}

2番目のソリューション

viewNamesプロパティをリゾルバーに追加します。値は、拡張子に応じてビューを含むフォルダーの名前です。したがって、JSPファイル用の1つのフォルダーとHTML(thymeleaf)ファイル用の別のフォルダーがあります。 :

構成

<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
     <property name="prefix" value="/WEB-INF/views/" />
     <property name="suffix" value=".html" />
     <property name="viewNames" value="thymeleaf/*" />
     <property name="templateMode" value="HTML5" />
</bean>

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
     <property name="prefix" value="/WEB-INF/views/" />
     <property name="viewNames" value="jsp/*" />
     <property name="suffix" value=".jsp" />
</bean>

コントローラ

@RequestMapping("/view1") 
public String thymeleafView() { 
     return "thymeleaf/mythymeleafview"; 
} 

@RequestMapping("/view2") 
public String jspView() { 
     return "jsp/myjspview"; 
}

プロジェクトフォルダ

WEB-INF/views/jsp/myjspview.jsp
WEB-INF/views/thymeleaf/mythymeleafview.jsp

どちらのソリューションも機能しますが、いくつかの制約があります。 JSPとThymeleafのどちらで解決するかを、何らかの方法で指定する必要があります。

JSPとThymeleafをチェーン化するための「完全な」ソリューションは、Thymeleafまたはその逆で解決できない場合にJSPでビューを解決しようとすることであり、不可能であり、DanielFernández(Thymeleafチーム) この同じ投稿 で理由を説明しました:

Thymeleafを使用すると、テンプレートを実際に読み取る前にテンプレートが存在するかどうかを判別できないものを含め、希望するITemplateResolver実装を作成できます。 [...]そのため、Thymeleafがテンプレートを処理する前に、テンプレートが解決可能かどうかを確認する方法はありません。そして、それがThymeleafViewResolverが "viewNames"プロパティに頼らなければならない理由です。

19
lgd

または、2つのサーブレットが正常に機能します。重要なのは、サーブレットの構成を最小限に抑え、データベースやその他のサービスのappConfig.xmlを含めることです(これにより、構成の大量の重複を回避できます)。

Web.xml:

<web-app id="WebApp_ID" version="2.4"
   xmlns="http://Java.Sun.com/xml/ns/j2ee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee 
   http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd">

   <display-name>Spring MVC Application</display-name>

   <servlet>
      <servlet-name>AssessmentAdmin</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
 <servlet-mapping>
      <servlet-name>AssessmentAdmin</servlet-name>
      <url-pattern>/xz/*</url-pattern>
   </servlet-mapping>
   
   
<servlet>
      <servlet-name>AssessmentAdminTL</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>   
   <servlet-mapping>
      <servlet-name>AssessmentAdminTL</servlet-name>
      <url-pattern>/xztl/*</url-pattern>
   </servlet-mapping>
   ........

jspのサーブレット:

<mvc:annotation-driven />
        
        <bean
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/" />
                 <!--  <property name="viewNames" value="jsp/*" />-->
                  <property name="suffix" value=".jsp" />
        </bean>



        ..........



        
        <import resource="applicationContext.xml" />



</beans>

thymeleafのサーブレット

<mvc:annotation-driven />
        
<!-- Thymeleaf -->

<bean id="templateResolver"
        class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="prefix" value="/WEB-INF/html/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="cacheable" value="false" />
  </bean>
    
  <bean id="templateEngine"
        class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
  </bean>
   
  <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
  </bean> 
    
 
   
  <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
  </bean>         
  
  


        
        <import resource="applicationContext.xml" />

試してみましたがうまくいきました

7
Jake

@Athanorの回答によると、別の選択肢があるかもしれません。

プロパティ「viewNames」を使用して、テンプレートが選択するリゾルバーを制御します

<!-- jsp -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="1" />
    <property name="viewNames" value="*admin/*,*packer/*,*courier/*,/" />
</bean>
<!-- thymeleaf -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="prefix" value="/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="cacheable" value="false"/>
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
    <property name="characterEncoding" value="UTF-8"/>
    <property name="templateEngine" ref="templateEngine" />
    <property name="viewNames" value="*thymeleaf/*" />
    <property name="order" value="2" />
</bean>

そしてコントローラー

@RequestMapping(value="/test")
public ModelAndView dboxPrint(Model model){
    ModelAndView modelAndView = new ModelAndView("thymeleaf/dbox_print");

    return modelAndView;
}
0
user5606857