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