2014-03-06 106 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>