0

我正在尝试使用 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";
}

我的项目

但是当我使用 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 呈现服务器端的东西不起作用

4

1 回答 1

1

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

Servlet 规范给出了匹配的顺序url-pattern

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

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

/WEB-INF/jsp/index.jsp

Servlet 容器将匹配该路径到您的DispatcherServlet映射到

/*

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

因此它使用您DispatcherServletservice(..)请求。但是您DispatcherServlet没有处理程序

/WEB-INF/jsp/index.jsp

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

/

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

于 2014-03-06T03:23:22.620 回答