Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring4MVC不识别JSP_Spring Mvc_Gradle_Jetty_Spring 4 - Fatal编程技术网

Spring mvc Spring4MVC不识别JSP

Spring mvc Spring4MVC不识别JSP,spring-mvc,gradle,jetty,spring-4,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; }

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

但是只有html呈现服务器端的东西不起作用首先,您需要知道Servlet容器(我也假设Jetty)有一个用于呈现JSP的Servlet。此Servlet通常是映射到
*.jsp
的扩展

  • 容器将尝试找到请求路径与servlet路径的精确匹配。成功匹配将选择 servlet
  • 容器将递归地尝试匹配最长的路径前缀。这是通过在目录中的路径树上走下来完成的 每次使用“/”字符作为路径分隔符。最长的 match确定所选的servlet
  • 如果URL路径中的最后一段包含扩展名(例如.jsp),servlet容器将尝试匹配处理 请求延期。扩展被定义为的一部分 最后一个“.”字符后的最后一段
  • 如果前三个规则都没有导致servlet匹配,那么容器将>尝试提供适合所请求资源的内容如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供隐式 为内容提供服务的默认servlet
  • 在你的情况下,当你期待

    /WEB-INF/jsp/index.jsp
    
    Servlet容器将该路径与映射到的
    DispatcherServlet
    匹配

    /*
    
    这发生在容器能够匹配映射到
    *.JSP
    的JSP servlet之前

    因此,它使用您的
    DispatcherServlet
    服务(..)
    请求。但是您的
    DispatcherServlet
    没有用于的处理程序

    /WEB-INF/jsp/index.jsp
    
    简单的解决方案是将您的
    DispatcherServlet
    映射到

    /
    

    如果找不到匹配项,则将其设置为备用
    Servlet

    让我们看看您的web.xml。好了,我已将web.xml添加到其中,因为它在使用Websphere@Jackie
    DispatcherServlet
    是否映射到
    /*
    或类似于
    /something/*
    的东西?不,它设置为/*我使用registry.addResourceHandler(“/css/**”).addResourceLocations(“/static/css/”).setCachePeriod(31556926);我试过了,但是如果我为JSPOk尝试这个,它不会呈现jsp,所以添加/app/*反而让它工作了,但我真的不想这样。我想我可以重写,但我想避免这种情况。你能再解释一下这句话吗“如果找不到匹配项,就让它成为备用Servlet。”@Jackie我必须查看你发布的链接,但要回答你的问题。映射到
    /
    的Servlet被视为“默认”Servlet。正如您在匹配列表中所看到的,如果没有匹配其他servlet来处理请求,那么将使用默认servlet。因为它位于最后,像
    blabla.jsp
    这样的路径将匹配到jsp Servlet并进行处理。但是,使用
    /*
    时,该路径首先由
    DispatcherServlet
    匹配,而DispatcherServlet无法正确处理该路径。
    /