2014-08-28 119 views
0

的web.xml彈簧:Servlet映射 - > URL模式:/ *工作,但不能顯示

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/webmvc-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<welcome-file-list> 
    <welcome-file>/</welcome-file> 
</welcome-file-list> 

/WEB-INF/spring/webmvc-config.xml

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="atom" value="application/atom+xml" /> 
      <entry key="html" value="text/html" /> 
      <entry key="json" value="application/json" /> 
     </map> 
    </property> 
    <property name="viewResolvers"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 
      <bean 
       class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
       <property name="prefix" value="/WEB-INF/views/" /> 
       <property name="suffix" value=".jsp" /> 
      </bean> 
     </list> 
    </property> 
    <property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
     </list> 
    </property> 
</bean> 

控制器

@Controller 
@RequestMapping ("/") 
public class IndexController extends BaseController 
{ 
    @RequestMapping ("/") 
    public String index (Model model){ 
     System.out.println("AA"); 
     return index2(model); 
    } 

    @RequestMapping ("/index") 
    public String index2 (Model model){ 
     System.out.println("BB"); 
     return "index"; 
    } 
} 

而存在index.jsp文件

enter image description here

我想這是非常好的工作

BBBBBBBBBBBUUUUUUUUUTTTTTTTTT,但是!

enter image description here

WHY ???? 爲什麼? 爲什麼? 爲什麼?

而且更奇怪的

enter image description here

????????????????????????????????? ?????????????????????????????????

控制器工作!但不顯示瀏覽器

發生了什麼事?

請幫幫我。


和日誌

與名稱的DispatcherServlet '調度' 處理GET爲[/WEB-INF/views/index.jsp]

沒有映射請求中找到用於與URI [/ WEB HTTP請求-INF/views/index.jsp] in DispatcherServlet with name'dispatcher'

+0

您應該啓用Spring日誌記錄,您應該注意到它記錄了它找不到'/ WEB-INF/views/index.jsp'的處理程序。 – 2014-08-28 15:22:21

+0

看看日誌。絕對必須嘗試找到[/WEB-INF/views/index.jsp]。 帶名稱'dispatcher'的DispatcherServlet處理[/WEB-INF/views/index.jsp]的GET請求 在DispatcherServlet中找到名爲'調度員' – 2014-08-28 15:31:41

+0

現在考慮'/ *'的含義。 – 2014-08-28 15:32:30

回答

11

Servlet容器有如何映射和處理URI請求的規則。這些可以在Servlet Specification中找到。同樣重要的是要注意,大多數Servlet容器都有一個Servlet來處理JSP,映射到*.jsp,這是一個擴展映射。 Tomcat有一個JspServlet來做到這一點。

您費盡DispatcherServlet

<url-pattern>/*</url-pattern> 

這是一個路徑映射。路徑映射優先於擴展映射。所以,當你提交你的視圖名稱

return "index"; 

Spring將使用ViewResolver

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

,以解決一個RequestDispatcherforward方法來使用路徑。該路徑將是/WEB-INF/views/index.jsp。現在Servlet容器將接收該路徑並嘗試找到Servlet來處理它。既然你已經映射到一個/*Servlet將使用它,但你的DispatcherServlet沒有該路徑映射,因此有404

簡單的解決辦法是改變你的映射/響應,這是默認處理程序,如果沒有其他匹配找到。在這種情況下,當您提交視圖並且容器必須找到映射Servlet時,它會找到JspServlet並使用它。

+0

他也映射/索引與「索引」這是合法的,但奇怪 – 2014-08-28 16:13:05

+1

這個答案應該被接受 – 2016-04-19 17:47:00