java 如何使用Spring提供.html文件

bqf10yzr  于 2022-12-21  发布在  Java
关注(0)|答案(9)|浏览(186)

我正在用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时,我的服务器现在可以正确地提供页面。
谢谢你。

xxe27gdn

xxe27gdn1#

最初的问题是,配置指定了一个属性suffix=".jsp",因此ViewResolver实现类会将.jsp添加到从方法返回的视图名称的末尾。
然而,由于您注解掉了InternalResourceViewResolver,根据应用程序配置的其余部分,可能没有注册任何其他ViewResolver,您可能会发现现在什么都不工作。
因为.html文件是静态的,不需要servlet处理,所以使用<mvc:resources/>Map会更有效、更简单,这需要Spring 3.0.4+。
例如:

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

其将把以/static/开始的所有请求 * 传递 * 到webapp/static/目录。
因此,通过将index.html放入webapp/static/并从方法中使用return "static/index.html";,Spring应该可以找到视图。

bhmjp9jg

bhmjp9jg2#

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

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

mwecs4sa3#

    • 问题的背景**

首先要了解以下内容:呈现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") }"
1.将这些模型参数公开为请求属性(以便JspServlet可以读取)
1.将请求转发到JspServlet。RequestDispatcher知道每个 *. jsp请求都应该转发到JspServlet(因为这是Tomcat的默认配置)
当你简单地将视图名改为home.html时,tomcat将 * 不 * 知道如何处理请求,这是因为没有servlet处理 *. html请求。

    • 解决方案**

如何解决这个问题。有三个最明显的解决方案:
1.公开html作为资源文件
1.指示JspServlet也处理 *. html请求
1.编写您自己的servlet(或将请求传递给另一个现有的servlet到 *. html)。
完整的代码示例如何实现这一点,请参考我的答案在另一个职位:如何在Spring MVC中将请求Map到HTML文件?

mwyxok5s

mwyxok5s4#

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

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

dxpyg8gm5#

我遇到了同样的问题,尝试了各种解决方案从SpringMVC加载html页面,以下解决方案对我很有效
服务器的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>

步骤3创建静态控制器类

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

    }

}

在Spring配置文件的步骤4中,将后缀更改为.htm
步骤5将页面重命名为.htm文件并将其存储在WEB-INF中,然后构建/启动服务器

localhost:8080/.../landingPage
cig3rfwq

cig3rfwq6#

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

@Configuration
@EnableWebMvc
public class DispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

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

}
xt0899hw

xt0899hw8#

听起来你是想做这样的事情:

  • 静态HTML视图
  • 支持 AJAX 的Spring控制器

如果是这样的话,正如前面提到的,最有效的方法是让Web服务器(而不是Spring)将HTML请求作为静态资源来处理。
1.将所有.html、.css、.js、.png等请求转发到Web服务器的资源处理程序
1.将所有其他请求Map到Spring控制器
这里有一个方法来实现这一点...

web.xml-将servletMap到根目录(/)

<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 Java配置

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的粉丝,它有很多模板化机制,包括Handlebar。
wlzqhblo

wlzqhblo9#

如果使用spring Boot ,则不能在www.example.com文件中设置属性spring.mvc.view.prefixspring.mvc.view.suffixapplication.properties,而是从配置类配置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目录在resources目录之外。
通过这种方式,您可以使用spring-mvc的url模式,但服务于静态上下文。

相关问题