2015-02-12 16 views
10

używałem JSP + JSTL ale jestem nudny C: jeśli c: wybierz ...Korzystanie zarówno Thymeleaf i JSP

Tak, chcę moje strony JSP mają być świadczone zarówno JSP i Thymeleaf (Mam zamiar usunąć wszystkie JSTL tak szybko, jak to możliwe). Używam Wiosna MVC ramowa:

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

W moim kontrolera, po prostu zwrócić JSP bez extenion.

return "folder/page"; 

Czy moje strony JSP należy najpierw z rezolwerem JSP, a następnie renderd z rezolwerem Thymeleaf? Jeśli tak, w jaki sposób?

Wydaje się, że łańcuchy JSP i Thymeleaf są bardzo skomplikowane. Tak więc chcę użyć wewnętrznego przelicznika dla plików JSP i programu Thymeleaf do rozpoznawania szablonów dla plików HTML. Jak mogę to zrobić?

+0

kilka myśli na temat swojego pomysłu: możesz podać własne ViewResolver które instrumenty 'ServletContextTemplateResolver' i 'InternalResourceViewResolver', ale przetwarzałoby oba jednocześnie, co może prowadzić do ciężkiego scenariusza WTF. Tak samo jak komentarz, ponieważ nie widzę żadnego rozwiązania, które umożliwiłoby przetworzenie obu procesów w łańcuchu. – meistermeier

+0

Rozumiem, w jaki sposób mogę użyć strony JSP dla plików * .jsp i Thymeleaf dla plików * .html? Czy muszę zmieniać pasz w moim kontrolerze? – Athanor

+0

Jeśli rozumiem, że masz rację, teraz "chcesz" dokonać przełączenia na podstawie zwróconego widoku? Więc nie ma obsługi widoku hybrydowego. Możesz spróbować, zmieniając sufiks nazwy pliku Thymeleaf ViewResolver na html. To może spaść przez InternalViewResolver bez żadnego wyjątku i wyzwolić templateResolver. Zmieniasz nazwy swoich nowych szablonów na * .html. Nie mam tu kodu ani bibliotek, aby przetestować ten pomysł. – meistermeier

Odpowiedz

3

Oto odpowiedź na podstawie odpowiedzi @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> 

i używam tego do mapowania:

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

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

Zgodnie z this post na forum Thymeleaf masz dwa rozwiązania.

Pierwsze rozwiązanie:

usunąć właściwość sufiksu w zgłoszenia fasoli (<property name="suffix" value=".html" /> i <property name="suffix" value=".jsp" />) i przechodzą sufiksu wartości powrotnej kontrolerów, np :

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

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

drugie rozwiązanie:

Dodaj właściwość viewNames do rozpoznawania nazw. Wartością jest nazwa folderu zawierającego widoki w zależności od ich rozszerzenia. Będziesz mieć jeden folder dla plików JSP i inny dla plików HTML (thymeleaf), np. :

Konfiguracja

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

Controller

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

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

folderze projektu

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

Oba rozwiązania praca ale mają pewne ograniczenia. Musisz określić w ten czy inny sposób, czy chcesz rozwiązać za pomocą JSP lub Thymeleaf.

„Doskonały” rozwiązanie łańcucha JSP i Thymeleaf - które polegają na próbuje rozwiązać ten widok z JSP, gdy nie mogą być rozwiązane z Thymeleaf lub odwrotnie - nie jest to możliwe, a Daniel Fernández (zespół Thymeleaf) wyjaśnił, dlaczego w this same post:

Thymeleaf pozwala tworzyć cokolwiek ITemplateResolver realizacja chcesz, w tym takie, które nie mogą pozwolić na ustalenie, czy szablon istnieje, czy nie, zanim rzeczywiście go czytać. [...] Zatem Thymeleaf nie ma pewności, czy szablon zostanie rozwiązany, czy nie, zanim spróbujemy przetworzyć szablon. I dlatego ThymeleafViewResolver musi odwoływać się do właściwości "viewNames".

6

Alternatywnie, dwa serwlety działa dobrze. Najważniejsze jest, aby zachować konfigurację serwletu minimalne obejmują appConfig.xml do bazy danych i innych usług (pozwala to uniknąć ogromny powielania konfiguracji)

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> 
 
    ........

serwlet dla jsp:

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

 

 

 
\t .......... 
 

 

 

 
\t 
 
\t <import resource="applicationContext.xml" /> 
 

 

 

 
</beans>

aplet dla thymeleaf

<mvc:annotation-driven /> 
 
\t 
 
<!-- 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> \t 
 
    
 
    
 

 

 
\t 
 
\t <import resource="applicationContext.xml" />

spróbowałem i działa dobrze

0

według @ odpowiedź ATHANOR, możemy mieć innego wyboru.

używamy własności „viewNames”, aby kontrolować, które rezolwer szablon wybrać

<!-- 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> 

i kontrolera

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

    return modelAndView; 
}