如何使用Spring提供.html文件

时间:2013-03-18 14:26:53

标签: spring spring-mvc

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

现在我已经注释掉了我的servlet配置的这一部分

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

并尝试从控制器返回资源的完整路径。

@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时,我的服务器现在正确地为该页面提供服务。

谢谢。

9 个答案:

答案 0 :(得分:96)

最初的问题是配置指定了属性suffix=".jsp",因此ViewResolver实现类会将.jsp添加到从方法返回的视图名称的末尾。

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

由于.html文件是静态并且不需要servlet处理,因此使用<mvc:resources/> mapping会更有效,也更简单。这需要Spring 3.0.4 +。

例如:

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

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

因此,将index.html放入webapp/static/并使用方法中的return "static/index.html";,Spring应该会找到该视图。

答案 1 :(得分:8)

我只是补充一点,您不需要为此实现控制器方法,因为您可以在servlet配置文件中使用 view-controller 标记(Spring 3):

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

答案 2 :(得分:8)

问题的背景

首先要理解的是:它不是渲染jsp文件的spring。它是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配置)
  4. 当您只是将视图名称更改为home.html时,tomcat将知道如何处理请求。这是因为没有servlet处理* .html请求。

    <强>解决方案

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

    1. 将html公开为资源文件
    2. 指示JspServlet也处理* .html请求
    3. 编写自己的servlet(或传递给另一个现有的servlet请求* .html)。
    4. 有关完整的代码示例如何实现此目的,请在另一篇文章中回答我的回答:How to map requests to HTML file in Spring MVC?

答案 3 :(得分:7)

您仍然可以继续使用相同的View解析程序,但将后缀设置为空。

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

现在您的代码可以选择返回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";
}   

答案 4 :(得分:1)

  

我遇到了同样的问题并尝试了各种解决方案来加载html   来自Spring MVC的页面,以下解决方案为我工作

服务器的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中输入以下代码

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

Step-3创建一个静态控制器类

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

    }

}

Spring配置文件中的步骤4将后缀更改为.htm                              热媒             

步骤5将页面重命名为.htm文件并将其存储在WEB-INF中并构建/启动服务器

localhost:8080/.../landingPage

答案 5 :(得分:1)

html文件的Java配置(在本例中为index.html):

@Configuration
@EnableWebMvc
public class DispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/index.html").addResourceLocations("/index.html");
    }

}

答案 6 :(得分:0)

相应地更改p:suffix =“。jsp”值,否则我们可以开发自定义视图解析器

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

答案 7 :(得分:0)

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

  • 静态HTML视图
  • 为AJAX提供服务的Spring控制器

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

  1. 将所有.html,.css,.js,.png等请求转发给 webserver的资源处理程序
  2. 将所有其他请求映射到弹簧控制器
  3. 这是实现这一目标的一种方法......

    web.xml - 将servlet映射到root(/)

    <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重写过滤器。
    • 模板化 - 您不希望在每个HTML页面中复制标记以获取常用元素。如果将HTML作为静态资源提供,则可能无法在服务器上完成此操作。查看客户端* VC框架。我很喜欢YUI,它有许多模板机制,包括Handlebars。

答案 8 :(得分:0)

如果使用Spring Boot,则一定不要在application.properties文件中设置属性spring.mvc.view.prefixspring.mvc.view.suffix,而是从配置类配置bean ViewResolver

application.properties

# Configured in @Configuration GuestNav
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp
# Live reload
spring.devtools.restart.additional-paths=.
# Better logging
server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.file-date-format=yyyy-MM-dd
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.suffix=.log

主要方法

@SpringBootApplication
public class WebApp extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApp.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebApp.class, args);
    }

}

配置类

@Configuration
@EnableWebMvc
public class DispatcherConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/views/**").addResourceLocations("/views/");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/notinuse/");
        viewResolver.setSuffix("");
        return viewResolver;
    }

}

控制器类

@Controller
public class GuestNav {

    @GetMapping("/")
    public String home() {
        return "forward:/views/guest/index.html";
    }
}

您必须将文件放置在目录/webapp/views/guest/index.html中,请注意,webapp目录位于资源目​​录之外。
这样,您可以使用spring-mvc的网址格式,但可以提供静态上下文。