Spring4 MVC无法识别jsps

时间:2014-03-06 02:29:58

标签: spring-mvc gradle jetty spring-4

我正在尝试使用gradle和Spring4创建一个MVC项目。

@Bean
public UrlBasedViewResolver viewResolver() {
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setPrefix("/WEB-INF/jsp/");
  resolver.setSuffix(".jsp");
  return resolver;
}

...
@RequestMapping("/home")
public String welcome() {
  return "index";
}

My Project

但是当我使用gradle jettyRun运行时,我得到......

http://localhost:8080/personal-war/home
HTTP ERROR 404

Problem accessing /personal-war/WEB-INF/jsp/index.jsp. Reason:
  NOT_FOUND

更新Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
  <display-name>Spring MVC Application</display-name>
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
      </init-param>
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.proj.spring.config</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>mvc-dispatcher</servlet-name>
      <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

我添加了这一行

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

但是只有html呈现服务器端的东西不能正常工作

1 个答案:

答案 0 :(得分:1)

首先,你需要知道Servlet容器(我也假设Jetty)有一个用于呈现JSP的Servlet。此Servlet通常是扩展映射到*.jsp

Servlet Specification gives the order of url-pattern matching

  
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择   的servlet。
  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这是通过将路径树踩到目录来完成的   一次,使用'/'字符作为路径分隔符。最长的   match确定所选的servlet。
  4.   
  5. 如果URL路径中的最后一个段包含扩展名(例如.jsp),,servlet容器将尝试匹配处理的servlet   请求延期。扩展名被定义为   最后一个'。'字符后的最后一段。
  6.   
  7. 如果前三个规则都没有导致servlet匹配,则容器将>尝试提供适合所请求资源的内容。 如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供隐式   用于提供内容的默认servlet。
  8.   

在你的情况下,当你转发到

/WEB-INF/jsp/index.jsp

Servlet容器将匹配映射到

DispatcherServlet的路径
/*

这在容器可以匹配映射到*.jsp的JSP servlet之前发生。

因此,它会使用您的DispatcherServletservice(..)请求。但是你的DispatcherServlet没有

的处理程序
/WEB-INF/jsp/index.jsp

简单的解决方案是将DispatcherServlet映射到

/

如果找不到匹配项,请将其作为后备Servlet