Spring MVC找不到* .jsp文件

时间:2014-03-06 03:10:51

标签: spring jsp spring-mvc spring-boot

在网络开发方面,我是一个绝对的菜鸟。但我得到了一些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扩展名,则无法找到该文件。 如果我键入没有像localhost:8080 / index这样的扩展名的网址,页面会正确显示。 如果我输入带有localhost:8080 / index.jsp的扩展名的url,页面将返回404错误。对于控制器中声明的所有页面,这都是相同的。

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

4 个答案:

答案 0 :(得分: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在很多方面都不如其他视图技术,所以不幸的是它无处不在。存在许多限制,包括对打包和运行Boot应用程序的方式的限制(有关详细信息,请参阅here)。如果你能节省时间,那么值得你努力忘掉JSP。

答案 1 :(得分:1)

我记得当我开始使用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

答案 2 :(得分:1)

嗯,我不确定这个答案对你有帮助,因为这个问题是在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>
    

    <meta charset="UTF-8">并未以/></meta>结尾。 在HTML5文件中,这是正确的。但是Thymeleaf使用XHTML加载文件,因此应该关闭<meta>

答案 3 :(得分:-1)

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

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

然后内部视图解析器将返回视图,就像您配置一样。

你可以尝试

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

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