如何用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
)渲染视图时,确实发生了三件事情:
- 从模型中获取所有模型参数(由你的控制器处理方法返回,即
"public ModelAndView doSomething() { return new ModelAndView("home") }"
) - 将这些模型参数公开为请求属性(以便它可以被JspServlet读取)
- 转发请求到JspServlet。
RequestDispatcher
知道每个* .jsp请求都应该被转发到JspServlet(因为这是默认的tomcat的configuration)
当你简单地将视图名称改为home.html时,tomcat将不知道如何处理请求。 这是因为没有处理* .html请求的servlet。
解
如何解决这个问题。 有三个最明显的解决scheme:
- 公开html作为资源文件
- 指示JspServlet也处理* .html请求
- 编写自己的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器
这听起来像你正在试图做这样的事情:
- 静态HTML视图
- 弹簧控制器服务于AJAX
如果是这样,如前所述,最有效的方法是让Web服务器(而不是Spring)将HTML请求作为静态资源来处理。 所以你需要以下几点:
- 将所有.html,.css,.js,.png等请求转发到networking服务器的资源处理程序
- 将所有其他请求映射到弹簧控制器
这是一个方法来完成…
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"); } }