que mvc form example docs spring spring-mvc

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:

  1. Reenviar todas las solicitudes .html, .css, .js, .png, etc. al manejador de recursos del servidor web
  2. 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"; }



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:

  1. 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") }" )
  2. exponer estos parámetros de modelo como atributos de solicitud (para que JspServlet pueda leerlo)
  3. 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:

  1. exponer el html como un archivo de recursos
  2. instruir al JspServlet para que también maneje las solicitudes * .html
  3. 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?