SpringMVC 筆記——訪問靜態資源DispatcherServlet 配置問題
一、普通方式訪問
web.xml 關鍵配置:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!--- 所有型別靜態資源都可如此訪問 -->
訪問時,直接檔名訪問:
localhot:8080/projectName/.../fileName.jpg
二、SpringMVC 的DispatcherServlet 中處理
DispatcherServlet 配置檔案:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 掃描Controller 元件基礎包 --> <context:component-scan base-package="com.milan.web.controller"></context:component-scan> <!-- 配置檢視解析器 如Controller方法返回字串解析為實際的物理檢視 --> <!-- 假設所有jsp頁面放在webapp目錄下自建的views資料夾中 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name = "prefix" value="/views/"></property> <property name = "suffix" value = ".jsp"></property> <property name="order" value="1"></property> </bean> </beans>
com.milan.web.controller.TestController 元件:
package com.milan.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/request") public class TestController { @RequestMapping("/testController") public String getString(){ System.out.println("hello world"); return "success"; } }
web.xml 關鍵配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
測試:
1、訪問路徑:
http://localhost:8082/Test/request/testController
結果:會進入Controller,但頁面提示500 錯誤:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveMajorVersion()I2、在web.xml中新增如下配置:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
結果:會進入Controller ,並顯示頁面。
問題:
既然要配置第二步中的資訊才能正確返回頁面,那麼DispatcherServlet 配置檔案中配置 InternalResourceViewResolver 檢視解析器有啥作用?
測試:去掉配置的 InternalResourceViewResolver ,再次訪問 http://localhost:8082/Test/resource/testController 將提示404 錯誤,說明配置的檢視解析器解決了訪問資源的路徑問題,定位資源位置,而web.xml 中配置的default 的servlet-mapping 才會真正渲染頁面並傳給客戶端。
三、mvc:default-servlet-handler 、 mvc:annotation-driven 與 mvc:resources
這三項配置在DispatcherServlet 的配置檔案中。
對第一項具體作用不太瞭解,按其註釋,它會將所有請求指向預設的Servlet (應該是對應的default的servlet),其order值是Integer.MAX,所以其它的servlet必須設定order比該值小才會起作用。既然是指向default 的servlet ,但當自己去掉web.xml中關於jsp對映路徑的default的配置後,將無法訪問頁面,雖然已經配置了該項。
第二項,它驅動了Controller 元件的對映模型,即使@RequestMapping 註解能工作。注意:若配置了MVC:default-servlet-handler,則必須配置此項,否則Controller 元件@RequestMapping 將不起作用,即Controller 無法訪問。
配置方式:
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
第三項,實現資源路徑對映,見上一篇。
還在學基礎,這裡好多錯誤與累贅,後面慢慢整理。