2014-03-06 172 views
2

当谈到web开发时,我绝对是noob。但是我在C/C++/Java中获得了一些背景,所以我对MVC控制器没有任何问题。这是让我头痛的配置。Spring MVC找不到* .jsp文件

我正在使用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错误。这对于在控制器中声明的所有页面都是一样的。

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

+0

如果我尝试删除SetSuffix(“。jsp”),localhost:8080/index也返回一个404错误,这意味着java正在阅读我的viewresolver代码。但是当我将后缀设置为“.jsp”时,如何将index.jsp映射到index.jsp?我错过了什么配置? – user3386275

+0

这就是你如何配置的东西,也是如何工作。你不应该直接访问你的jsp文件(你也不能像在/ WEB-INF下那样),你将不得不让Spring解决JSP(因此也就是'/ index'作品,因为spring正在处理)按照预想的那样简短地工作(可能与你想要的不一样,但是唉)。 –

+0

谢谢M. Deinum。现在一切都说得通了。我错过了/ WEB-INF下的东西的概念,不能直接访问。 – user3386275

回答

-1

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

已映射的请求/索引,因此无法处理/index.jsp

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

你可以尝试

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

这是更好地避免在Web应用程序.jsp扩展名。

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

我记得有同样的问题,当我开始与春天,“URL”您使用需要对应于特定请求映射,不一定是一个特定页面 例如

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

    //.. do Something 

    return "/index"; 
} 

将暴露的端点在本地主机:8080 /家不是localhost:8080 /指数或本地主机:8080/index.jsp的

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

0

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

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

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

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

    通知视觉路径[偏好]:将分发回当前处理URL [/偏好再次。检查你的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>