【问题标题】:Spring MVC cannot find *.jsp filesSpring MVC 找不到 *.jsp 文件
【发布时间】:2014-04-08 11:23:41
【问题描述】:

在 Web 开发方面,我绝对是个菜鸟。但是我有一些 C/C++/Java 的背景,所以我对 MVC 控制器没有问题。让我头疼的是配置。

我正在使用 Spring Boot。根据教程,它可以神奇地解决所有问题,甚至无需打开编辑器并输入单个字符。显然不是。

我有一个视图解析器配置如下:

@Configuration
@ComponentScan (basePackages = {"my.test.controller"})
@EnableAutoConfiguration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

@Bean
    public InternalResourceViewResolver getViewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
   }



   public static void main(String[] args) throws Exception {
       SpringApplication.run(WebConfig.class, args);
   }

}

我有一个这样的控制器:

@Controller
public class PageController {

@RequestMapping(value = "/index")
public String doSomething() {

        //.. do Something

        return "/index";
    }

我的主要问题是如果地址中有 jsp 扩展名,则无法找到该文件。 如果我键入的 url 没有像 localhost:8080/index 这样的扩展名,则页面将正确显示。 如果我键入带有 localhost:8080/index.jsp 之类的扩展名的 url,页面将返回 404 错误。这对于控制器中声明的所有页面都是相同的。

任何帮助将不胜感激。谢谢谢谢。

【问题讨论】:

  • 如果我尝试删除 SetSuffix(".jsp"),localhost:8080/index 也会返回 404 错误,这意味着 java 正在读取我的 viewresolver 代码。但是当我将后缀设置为“.jsp”时,为什么无法将 index.jsp 映射到 index.jsp?我缺少什么配置?
  • 这就是您配置事物的方式,也是事物应该如何工作的方式。您不应该直接访问您的 jsp 文件(也不能因为它们位于 /WEB-INF 下。您必须让 Spring 解析 JSP(因此 /index 有效,因为 spring 正在处理它)。简而言之按预期工作(也许不像您预期​​的那样,但唉)。
  • 谢谢 M. Deinum。现在一切都说得通了。我错过了 /WEB-INF 下的东西不能直接访问的概念。
  • 我错过了不应该直接访问 jsp 文件的最佳实践。

标签: spring jsp spring-mvc spring-boot


【解决方案1】:

Spring Boot 中有一个 JSP 示例,您可以从中借鉴。如果我是你,我不会定义 ViewResolver,因为 Boot 已经为你做到了(但如果你想使用前缀和后缀分辨率,你需要设置 spring.view.prefixspring.view.suffix)。

您的@Controller 应该返回视图名称(而不是路径),因此“index”将在您现有的设置中解析为“/WEB-INF/views/index.jsp”。我也不会为“/resources”映射而烦恼,因为 Spring Boot 已经提供了一个映射,尽管它与您定义的不同(通常人们将静态资源放在“classpath:/static”中,但“classpath:/resources”有效HTTP 端点中的资源路径也没有前缀)。

JSP 在很多方面都不如其他视图技术,所以很遗憾它无处不在。有许多限制,包括对您打包和运行引导应用程序的方式的限制(有关详细信息,请参阅here)。如果你有空的话,不学习 JSP 是值得的。

【讨论】:

    【解决方案2】:

    记得刚开始用spring的时候也遇到过同样的问题,你使用的“url”需要对应特定的Request Mapping,不一定是特定的页面 例如

    @RequestMapping(value = "/home")
    public String doSomething() {
    
        //.. do Something
    
        return "/index";
    }
    

    将在 localhost:8080/home 而不是 localhost:8080/index 或 localhost:8080/index.jsp 处公开一个端点

    一个很好的示例项目位于: https://github.com/mariuszs/spring-boot-web-jsp-example

    【讨论】:

      【解决方案3】:

      好吧,我不确定这个答案是否会对你有所帮助,因为这个问题是在 2014 年发布的。为了帮助人们解决这个问题,我提供了一些我的解决方案。希望这会有所帮助。

      • 确保您的 @Controller 的配置 @RequestMapping("/xx") 不能与您的视图(jsp 或模板)相同

        例如,您有一个名为home.html 的视图。您不能让@RequestMapping() 与视图的名称相同。这将导致圆形错误(--> 圆形视图路径,添加在下面)。 如何解决此错误,路径不能是名称。 (那是JSP文件大多发生)

        当你输入相同的名字时,你会得到这个:

        循环视图路径 [preference]:将再次分派回当前处理程序 URL [/preference]。检查您的 ViewResolver 设置! (提示:由于默认视图名称生成,这可能是未指定视图的结果。)

        这里有一个链接解释了为什么this error would happen

      • 这种错误只针对 HTML5 文件。当您遇到一些页面错误并且您正在使用 HTML5 文件并且找不到其他错误时,可能是下面的这个 当您创建 HTML 文件时,基本文件将是以下代码。

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        
        </body>
        </html>
        

        &lt;meta charset="UTF-8"&gt; 不以/&gt;&lt;/meta&gt; 结尾。 在 HTML5 文件中,这是正确的。但是 Thymeleaf 使用 XHTML 来加载文件,所以 &lt;meta&gt; 应该被关闭。

      【讨论】:

        【解决方案4】:

        如果您将所有请求从 web.xml 映射到调度程序 servlet,那么它将检查适当的控制器映射。

        您已将请求映射到 /index,因此它无法处理 /index.jsp

        然后内部视图解析器将返回您配置的视图。

        你可以试试

        @RequestMapping(value = {"/index","/index.jsp"})
        

        最好避免在 Web 应用中使用 .jsp 扩展名。

        【讨论】:

          猜你喜欢
          • 2021-04-03
          • 2019-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 2013-04-05
          相关资源
          最近更新 更多