tag que mvc form example espaƱol spring spring-mvc

que - Spring MVC ViewResolver no se asigna a archivos HTML



spring mvc example (4)

Comprueba esto para mapear archivos html en Spring mvc (el paso de detalles se proporciona en Respuesta):

¿Qué tipo de resolución de la primavera juega bien con angularjs?

En simple:

Para usar los recursos estáticos (html, css, img, js) en spring, use una estructura de directorios que tenga el siguiente aspecto:

src/ package/ LayoutController.java WebContent/ WEB-INF/ static/ html/ layout.html images/ image.jpg css/ test.css js/ main.js web.xml springmvc-servlet.xml @Controller public class LayoutController { @RequestMapping("/staticPage") public String getIndexPage() { return "layout.htm"; } } <!-- in spring config file --> <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />

layout.html

<h1>Page with image</h1> <img src="/static/img/image.jpg"/>

No puedo obtener mvc de primavera para resolver archivos de vista .html.

Tengo la siguiente estructura de carpetas de vista:

WEB-INF `-views |- home.jsp `- home.html

Tengo un método simple de controlador de hello world que solo imprime un mensaje y devuelve el nombre de vista "home". Tengo un archivo home.jsp, pero me gustaría usar home.html en su lugar.

<!-- Working servlet mapping --> <servlet-mapping> <servlet-name>spaceShips</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- working servlet context --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean>

Cuando llego a las naves espaciales / home, el controlador imprime el mensaje de hello world y veo la vista home.jsp sin ningún problema.

El problema es cuando cambio el sufijo a .html.

Después de cambiar el sufijo y navegar a / home, el controlador imprime el mensaje; sin embargo, veo un error 404 en el navegador y lo siguiente en la consola: ADVERTENCIA: No se encontró asignación para la solicitud HTTP con URI [/ spaceships / WEB-INF / views /home.html]

Para aclarar:

<!-- not working with .html --> <servlet-mapping> <servlet-name>spaceShips</servlet-name> <!-- I have tried /* here as well without success --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- not working with .html--> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="WEB-INF/views/" /> <beans:property name="suffix" value=".html" /> </beans:bean>

He comprobado en la carpeta de guerra explotada y puedo confirmar que ambos archivos de inicio están presentes.

¿Alguien ha encontrado algo como esto antes?

Último trozo de mensaje de consola:

INFO: Server startup in 5256 ms Hello, World! Jul 27, 2014 12:52:01 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound WARNING: No mapping found for HTTP request with URI [/spaceships/WEB-INF/views/home.html] in DispatcherServlet with name ''spaceShips''

Gracias por leer.

=========== SOLUCIÓN ============

La siguiente configuración (fea) resolvió el problema. Probablemente haya formas de solucionar esto, pero si experimenta el mismo problema, es posible que pueda encontrar una solución a partir de esto.

Estructura de la carpeta:

WEB-INF `-static |-html `-home.html |-css `-img

Método del controlador:

@RequestMapping(value = "/home") public String goHome() { System.out.println("lolololololol"); return "static/html/home"; }

Configuración de primavera:

<resources mapping="/static/**" location="/WEB-INF/static/" /> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="" /> <beans:property name="suffix" value=".html" /> </beans:bean>


Esto se debe a que normalmente los patrones de uri de estilo *.jsp son manejados por el contenedor de servlets y en esta instancia específica *.html no es manejado por el contenedor y, en cambio, la ruta se está delegando a Spring MVC, que no sabe cómo renderizar estas extensiones. .

Como ejemplo, si está utilizando Tomcat, verá estas entradas en el archivo conf/web.xml :

<servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>

es decir, jsp servlet se encarga de la extensión * .jsp, * .jspx.

Entonces, dado esto, una posible solución será agregar .html para agregarse para que sea manejado por el servlet jsp, como en este enlace:

Usando archivos .html como JSPs

o incluso mejor, deje la extensión como .jsp y use .html como un patrón de controlador.


//Finally a working solution both html and jsp view together ------------------------------------------------------------------------ public class ChainableInternalResourceViewResolver extends InternalResourceViewResolver { private static Log logger = LogFactory.getLogger(ChainableInternalResourceViewResolver.class); /** * */ protected AbstractUrlBasedView buildView(String viewName) throws Exception { logger.entering("buildView"); String url = getPrefix() + viewName + getSuffix(); InputStream stream = getServletContext().getResourceAsStream(url); if (stream == null) { logger.log(Log.DEBUG,"-----!!!------resource not found-------!!!-----"+getPrefix() + viewName + getSuffix()); return new NonExistentView(); } else { logger.log(Log.DEBUG,"----***-------resource found-------***-----"+getPrefix() + viewName + getSuffix()); stream.close(); } return super.buildView(viewName); } /** * * @author * */ private static class NonExistentView extends AbstractUrlBasedView { //private static Log logger = LogFactory.getLogger(NonExistentView.class); protected boolean isUrlRequired() { //logger.entering("isUrlRequired"); return false; } public boolean checkResource(Locale locale) throws Exception { //logger.entering("checkResource"); return false; } protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //logger.entering("renderMergedOutputModel"); // Purposely empty, it should never get called } } } ---------------------------------------------------------------------------- @EnableWebMvc @Configuration @ComponentScan({ "com.*" }) public class ApplicationConfig extends WebMvcConfigurerAdapter { //Be careful while changing here private static final String VIEW_DIR_HTML = "/WEB-INF/static/"; private static final String VIEW_EXTN_HTML = ".html"; private static final String VIEW_DIR_JSP = "/WEB-INF/"; private static final String VIEW_EXTN_JSP = ".jsp"; private static final String RESOURCE_URL_PATTERN_1 = "/resources/**"; private static final String RESOURCE_URL_PATTERN_2 = "/WEB-INF/static/**"; private static final String RESOURCE_PATH_1 = "/resources/"; private static final String RESOURCE_PATH_2 = "/WEB-INF/static/"; private static Logger logger = LoggerFactory.getLogger(ApplicationConfig.class); /** * * @return */ @Bean public ViewResolver htmlViewResolver() { logger.info(" htmlViewResolver method "); InternalResourceViewResolver viewResolver= new ChainableInternalResourceViewResolver(); viewResolver.setPrefix(VIEW_DIR_HTML); viewResolver.setSuffix(VIEW_EXTN_HTML); viewResolver.setOrder(0); return viewResolver; } @Bean public ViewResolver jspViewResolver() { logger.info(" jspViewResolver method "); InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix(VIEW_DIR_JSP); viewResolver.setSuffix(VIEW_EXTN_JSP); viewResolver.setOrder(1); return viewResolver; } -------------------------------------------------------------------------------- return "pages/login"; // for login.html resides inside /WEB-INF/static/pages/login.html return "jsp/login"; // for login.jsp resides inside /WEB-INF/jsp/login.jsp


I was also facing the same issue and tried various solutions to load the AngularJS html file using Spring configuration. After applying below steps it got resolved. Step-1 in server''s web.xml commemt these two lines <!-- <mime-mapping> <extension>htm</extension> <mime-type>text/html</mime-type> </mime-mapping>--> <!-- <mime-mapping> <extension>html</extension> <mime-type>text/html</mime-type> </mime-mapping> --> Step-2 enter following code in application''s web xml <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> Step-3 create a static controller class @Controller public class StatisController { @RequestMapping("/landingPage") public String getIndexPage() { return "CompanyInfo"; } } Step-4 in the Spring configuration file change the suffix to .htm <property name="suffix"> <value>.htm</value> </property> Step-5 Rename page as .htm file and store it in WEB-INF and build/start the server localhost:8080/.../landingPage