1. 程式人生 > >SpringMVC 筆記——訪問靜態資源DispatcherServlet 配置問題

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()I

2、在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>

第三項,實現資源路徑對映,見上一篇。

還在學基礎,這裡好多錯誤與累贅,後面慢慢整理。