如何用Spring来提供.html文件

我正在用Spring开发一个网站,并试图提供不是.jsp文件的资源(例如.html)

现在我已经注释掉了这部分的servletconfiguration

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

并试图从控制器返回资源的完整path。

 @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"; } } 

index.html文件存在于该文件夹中。

注意:当我将index.html更改为index.jsp时,我的服务器现在正确地为页面提供服务。

谢谢。

最初的问题是configuration指定了属性suffix=".jsp"所以ViewResolver实现类将把.jsp添加到从方法返回的视图名称的末尾。

但是,由于您注释掉了InternalResourceViewResolver ,因此根据应用程序configuration的其余部分,可能没有任何其他ViewResolver注册。 你可能会发现现在没有任何工作。

由于.html文件是静态的 ,不需要servlet处理,因此使用<mvc:resources/>映射更高效,更简单。 这需要Spring 3.0.4+。

例如:

 <mvc:resources mapping="/static/**" location="/static/" /> 

它将通过/static/开头的所有请求传递webapp/static/目录。

所以通过将index.html放在webapp/static/并使用return "static/index.html"; 从你的方法,spring应该find的观点。

问题的背景

首先要理解的是:它不是popup的jsp文件。 这是它的JspServlet(org.apache.jasper.servlet.JspServlet)。 这个servlet和Tomcat(jasper编译器)一起来,而不是用spring。 这个JspServlet知道如何编译jsp页面以及如何将它作为html文本返回给客户端。 tomcat中的JspServlet默认只处理匹配两种模式的请求:* .jsp和* .jspx。

现在,当Spring使用InternalResourceView (或JstlView )渲染视图时,确实发生了三件事情:

  1. 从模型中获取所有模型参数(由你的控制器处理方法返回,即"public ModelAndView doSomething() { return new ModelAndView("home") }"
  2. 将这些模型参数公开为请求属性(以便它可以被JspServlet读取)
  3. 转发请求到JspServlet。 RequestDispatcher知道每个* .jsp请求都应该被转发到JspServlet(因为这是默认的tomcat的configuration)

当你简单地将视图名称改为home.html时,tomcat将知道如何处理请求。 这是因为没有处理* .html请求的servlet。

如何解决这个问题。 有三个最明显的解决scheme:

  1. 公开html作为资源文件
  2. 指示JspServlet也处理* .html请求
  3. 编写自己的servlet(或传递给另一个现有的servlet请求* .html)。

有关完整的代码示例如何实现这一点,请在另一篇文章中回答我的回答: 如何在Spring MVC中将请求映射到HTML文件?

我只是补充说,你不需要实现一个控制器方法,因为你可以在servletconfiguration文件中使用view-controller标签(Spring 3):

 <mvc:view-controller path="/" view-name="/WEB-INF/jsp/index.html"/> 

您仍然可以继续使用相同的视图parsing器,但将后缀设置为空。

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix="" /> 

现在你的代码可以select返回index.html或者index.jsp,如下面的示例所示 –

 @RequestMapping(value="jsp", method = RequestMethod.GET ) public String startJsp(){ return "/test.jsp"; } @RequestMapping(value="html", method = RequestMethod.GET ) public String startHtml(){ return "/test.html"; } 

我面临同样的问题,并尝试各种解决scheme来加载从Spring MVC的HTML页面,下面的解决scheme为我工作

在服务器的web.xml中的步骤1注释这两行

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

步骤2在应用程序的Web xml中input以下代码

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

第3步创build一个静态控制器类

 @Controller public class FrontController { @RequestMapping("/landingPage") public String getIndexPage() { return "CompanyInfo"; } } 

Springconfiguration文件中的Step-4将后缀更改为.htm .htm

Step-5将页面重命名为.htm文件并将其存储在WEB-INF中,然后构build/启动服务器

 localhost:8080/.../landingPage 

改变p:suffix =“。jsp”的值,否则我们可以开发自定义视图parsing器

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/UrlBasedViewResolver.html

这听起来像你正在试图做这样的事情:

  • 静态HTML视图
  • 弹簧控制器服务于AJAX

如果是这样,如前所述,最有效的方法是让Web服务器(而不是Spring)将HTML请求作为静态资源来处理。 所以你需要以下几点:

  1. 将所有.html,.css,.js,.png等请求转发到networking服务器的资源处理程序
  2. 将所有其他请求映射到弹簧控制器

这是一个方法来完成…

web.xml – 将servlet映射到根(/)

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

其他注意事项

  • 隐藏.html扩展名 – 如果你正在委托静态资源请求,这就超出了Spring的范围。 看看一个URL重写filter。
  • 模板化 – 您不希望在每个HTML页面中重复标记以获取常用元素。 如果将HTML用作静态资源,这可能无法在服务器上完成。 看看客户端* VC框架。 我是YUI的粉丝,有很多模板机制,包括把手。

html文件的Javaconfiguration(在本例中为index.html):

 @Configuration @EnableWebMvc public class DispatcherConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/index.html").addResourceLocations("/index.html"); } }