mvc - Cómo servir archivos.html con Spring
spring mvc netbeans (8)
Enfrenté el mismo problema e intenté varias soluciones para cargar la página html de Spring MVC, la siguiente solución funcionó para mí
El paso 1 en web.xml del servidor comenta estas dos líneas
<!-- <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>
-->
El paso 2 ingresa el siguiente código en la aplicación web xml
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Paso 3: crea una clase de controlador estático
@Controller
public class FrontController {
@RequestMapping("/landingPage")
public String getIndexPage() {
return "CompanyInfo";
}
}
Paso 4 en el archivo de configuración de Spring cambie el sufijo a .htm .htm
Paso-5 Cambie el nombre de la página como archivo .htm y guárdelo en WEB-INF y compile / inicie el servidor
localhost:8080/.../landingPage
Estoy desarrollando un sitio web con Spring, y estoy intentando servir recursos que no son archivos .jsp (.html por ejemplo)
ahora mismo he comentado esta parte de mi configuración de servlet
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
Y traté de devolver desde el controlador el camino completo al recurso.
@Controller
public class LandingPageController {
protected static Logger logger = Logger.getLogger(LandingPageController.class);
@RequestMapping({"/","/home"})
public String showHomePage(Map<String, Object> model) {
return "/WEB-INF/jsp/index.html";
}
}
el archivo index.html existe en esa carpeta.
NOTA: cuando cambio el index.html a index.jsp mi servidor ahora sirve la página correctamente.
Gracias.
Configuración de Java para archivos html (en este caso index.html):
@Configuration
@EnableWebMvc
public class DispatcherConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/index.html").addResourceLocations("/index.html");
}
}
El problema inicial es que la configuración especifica un suffix=".jsp"
propiedad suffix=".jsp"
por lo que la clase de implementación ViewResolver agregará .jsp
al final del nombre de vista que se devuelve desde su método.
Sin embargo, como usted comentó el InternalResourceViewResolver
entonces, dependiendo del resto de la configuración de su aplicación, es posible que no haya ningún otro ViewResolver registrado. Puede encontrar que nada está funcionando ahora.
Como los archivos .html
son estáticos y no requieren procesamiento por parte de un servlet, es más eficiente y más simple utilizar una asignación <mvc:resources/>
. Esto requiere Spring 3.0.4+.
Por ejemplo:
<mvc:resources mapping="/static/**" location="/static/" />
que pasaría por todas las solicitudes que comienzan con /static/
al directorio webapp/static/
.
Así que colocando index.html
en webapp/static/
y usando return "static/index.html";
de su método, Spring debería encontrar la vista.
Parece que estás intentando hacer algo como esto:
- Vistas de HTML estático
- Controladores de resorte que sirven AJAX
Si ese es el caso, como se mencionó anteriormente, la forma más eficiente es permitir que el servidor web (no Spring) maneje las solicitudes HTML como recursos estáticos. Entonces querrás lo siguiente:
- Reenviar todas las solicitudes .html, .css, .js, .png, etc. al manejador de recursos del servidor web
- Asigne todas las demás solicitudes a los controladores de primavera
Aquí hay una manera de lograr eso ...
web.xml - Asignación de mapa a la raíz (/)
<servlet>
<servlet-name>sprung</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
...
<servlet>
<servlet-mapping>
<servlet-name>sprung</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring JavaConfig
public class SpringSprungConfig extends DelegatingWebMvcConfiguration {
// Delegate resource requests to default servlet
@Bean
protected DefaultServletHttpRequestHandler defaultServletHttpRequestHandler() {
DefaultServletHttpRequestHandler dsrh = new DefaultServletHttpRequestHandler();
return dsrh;
}
//map static resources by extension
@Bean
public SimpleUrlHandlerMapping resourceServletMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
//make sure static resources are mapped first since we are using
//a slightly different approach
mapping.setOrder(0);
Properties urlProperties = new Properties();
urlProperties.put("/**/*.css", "defaultServletHttpRequestHandler");
urlProperties.put("/**/*.js", "defaultServletHttpRequestHandler");
urlProperties.put("/**/*.png", "defaultServletHttpRequestHandler");
urlProperties.put("/**/*.html", "defaultServletHttpRequestHandler");
urlProperties.put("/**/*.woff", "defaultServletHttpRequestHandler");
urlProperties.put("/**/*.ico", "defaultServletHttpRequestHandler");
mapping.setMappings(urlProperties);
return mapping;
}
@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
//controller mappings must be evaluated after the static resource requests
handlerMapping.setOrder(1);
handlerMapping.setInterceptors(this.getInterceptors());
handlerMapping.setPathMatcher(this.getPathMatchConfigurer().getPathMatcher());
handlerMapping.setRemoveSemicolonContent(false);
handlerMapping.setUseSuffixPatternMatch(false);
//set other options here
return handlerMapping;
}
}
consideraciones adicionales
- Ocultar extensión .html: esto está fuera del alcance de Spring si está delegando las solicitudes de recursos estáticos. Mire en un filtro de reescritura de URL.
- Templating: no desea duplicar el marcado en cada página HTML para elementos comunes. Es probable que esto no se pueda hacer en el servidor si se sirve HTML como un recurso estático. Mire en un marco de VC del lado del cliente. Soy fan de YUI, que tiene numerosos mecanismos de plantillas, incluidos manubrios.
Solo agregaría que no necesita implementar un método de controlador para eso, ya que puede usar la etiqueta view-controller (Spring 3) en el archivo de configuración del servlet:
<mvc:view-controller path="/" view-name="/WEB-INF/jsp/index.html"/>
Todavía puede seguir utilizando la misma resolución de vista, pero establezca el sufijo como vacío.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix="" />
Ahora su código puede elegir devolver index.html o index.jsp como se muestra en la muestra siguiente:
@RequestMapping(value="jsp", method = RequestMethod.GET )
public String startJsp(){
return "/test.jsp";
}
@RequestMapping(value="html", method = RequestMethod.GET )
public String startHtml(){
return "/test.html";
}
cambie p: sufijo = ". jsp" value de lo contrario, de lo contrario podemos desarrollar resolución de vista personalizada
Antecedentes del problema
Lo primero que debemos entender es lo siguiente: NO es la primavera la que genera los archivos jsp. Es JspServlet (org.apache.jasper.servlet.JspServlet) que lo hace. Este servlet viene con Tomcat (compilador jasper) no con la primavera. Este JspServlet sabe cómo compilar la página jsp y cómo devolverla como texto html al cliente. El JspServlet en Tomcat de forma predeterminada solo maneja las solicitudes que coinciden con dos patrones: * .jsp y * .jspx.
Ahora, cuando Spring muestra la vista con InternalResourceView
(o JstlView
), realmente ocurren tres cosas:
- obtener todos los parámetros del modelo del modelo (devuelto por el método del controlador de su controlador, es decir,
"public ModelAndView doSomething() { return new ModelAndView("home") }"
) - exponer estos parámetros de modelo como atributos de solicitud (para que JspServlet pueda leerlo)
- Reenviar solicitud a JspServlet.
RequestDispatcher
sabe que cada solicitud * .jsp se debe reenviar a JspServlet (porque esta es la configuración predeterminada de tomcat)
Cuando simplemente cambia el nombre de la vista a home.html, Tomcat no sabrá cómo manejar la solicitud. Esto se debe a que no hay solicitudes de servlet handling * .html.
Solución
Cómo resolver esto Hay tres soluciones más obvias:
- exponer el html como un archivo de recursos
- instruir al JspServlet para que también maneje las solicitudes * .html
- escriba su propio servlet (o pase a otras solicitudes de servlets existentes a * .html).
Para obtener ejemplos completos de código sobre cómo lograr esto, consulte mi respuesta en otra publicación: ¿Cómo asignar solicitudes al archivo HTML en Spring MVC?