我正在使用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时,我的服务器现在正确地为该页面提供服务。
谢谢。
答案 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
)呈现视图时,确实发生了三件事:
"public ModelAndView doSomething() { return new ModelAndView("home") }"
)RequestDispatcher
知道每个* .jsp请求都应该转发到JspServlet(因为这是默认的tomcat配置)当您只是将视图名称更改为home.html时,tomcat将不知道如何处理请求。这是因为没有servlet处理* .html请求。
<强>解决方案强>
如何解决这个问题。有三个最明显的解决方案:
有关完整的代码示例如何实现此目的,请在另一篇文章中回答我的回答: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”值,否则我们可以开发自定义视图解析器
答案 7 :(得分:0)
听起来你正试图做这样的事情:
如果是这种情况,如前所述,最有效的方法是让Web服务器(而不是Spring)将HTML请求作为静态资源处理。所以你需要以下内容:
这是实现这一目标的一种方法......
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;
}
}
其他注意事项
答案 8 :(得分:0)
如果使用Spring Boot,则一定不要在application.properties文件中设置属性spring.mvc.view.prefix
和spring.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的网址格式,但可以提供静态上下文。