with sintaxis plantillas page name motor espaƱol dependencias spring jsp spring-mvc thymeleaf

spring - sintaxis - Usando Thymeleaf y JSP



thymeleaf th name (4)

Según esta publicación en el foro de Thymeleaf, tienes dos soluciones.

Primera solución :

Elimine la propiedad de sufijo en su declaración de beans ( <property name="suffix" value=".html" /> y <property name="suffix" value=".jsp" /> ) y pase el sufijo en el valor de retorno de sus controladores, por ejemplo:

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

Segunda solución :

Agregue la propiedad viewNames a los resolvers. El valor es el nombre de una carpeta que contiene vistas en función de su extensión. Por lo tanto, tendrá una carpeta para archivos JSP y otra para archivos HTML (thymeleaf), por ejemplo:

Configuración

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

Controlador

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

Carpeta de proyecto

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

Ambas soluciones funcionan pero tienen algunas desventajas. Debe especificar de una manera u otra si desea resolver con JSP o Thymeleaf.

La solución "perfecta" para encadenar JSP y Thymeleaf, que consistiría en tratar de resolver la vista con JSP cuando no se puede resolver con Thymeleaf o viceversa , no es posible, y Daniel Fernández (equipo de Thymeleaf) explicó por qué en este mismo post :

Thymeleaf le permite crear la implementación de ITemplateResolver que desee, incluidas algunas que pueden no permitir determinar si la plantilla existe o no antes de leerla realmente. [...] Entonces, no hay forma de que Thymeleaf esté seguro de si una plantilla se podrá resolver o no antes de tratar de procesar la plantilla. Y es por eso que ThymeleafViewResolver tiene que recurrir a la propiedad "viewNames".

Estaba usando JSP + JSTL pero estoy aburrido de c: if, c: choose, ...

Por lo tanto, quiero que mis páginas JSP se procesen con JSP y Thymeleaf (planeo eliminar todo JSTL lo antes posible). Estoy usando el marco 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>

En mi controlador, simplemente devuelvo el jsp sin extenion.

return "folder/page";

¿Pueden mis páginas JSP ser procesadas primero con la resolución JSP y luego con la resolución Thymeleaf? Si es así, ¿cómo?

Parece que es muy complicado encadenar JSP y Thymeleaf. Entonces, quiero usar la resolución interna para archivos JSP y la resolución de plantillas Thymeleaf para archivos HTML. ¿Cómo puedo hacerlo?


Aquí está la respuesta basada en la respuesta @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>

Y uso esto para el mapeo:

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


Alternativamente, dos servlets funcionan bien. La clave es mantener la configuración del servlet mínima e incluir un appConfig.xml para la base de datos y otros servicios (esto evita la duplicación masiva de la configuración)

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

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

servlet para tomillo

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

Intenté y funciona bien


de acuerdo con la respuesta de @ Athanor, podemos tener otra opción.

utilizamos la propiedad "viewNames" para controlar qué resolver selecciona la plantilla

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

y el controlador

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