使用Eclipse基於Maven的Spring MVC 除錯心得(二)--- Spring配置
3.Spring專案的web.xml配置
在Dynamic Web Project中,web.xml可謂是最重要的檔案之一,它的配置包括:1)請求地址(url-pattern)與處理類(servlet-class)之間通過servlet-name來進行的對映(servlet-mapping)。因此,此檔案的配置也關乎到我們訪問網站的請求能否正常的處理。
(1)在Spring MVC專案中通過配置web.xml來攔截所有的url請求,配置如下:
<span style="font-size:18px;"><servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <!-- mvc-dispatcher攔截所有的請求--> <url-pattern>/</url-pattern> </servlet-mapping></span>
(2)DispatcherServlet是Spring MVC的核心,因此我們不需要通過web.xml來攔截並分配url請求,而是將所有請求都交給Spring中的DispatcherServlet,讓DispatcherServlet來進行處理,配置如下:
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
(3)這裡需要在“<servlet>…</servlet>”標籤中新增DispatcherServlet配置檔案的路徑,否則預設為/WEB-INF/$servlet-name$-serlet.xml,這裡配置路徑為/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml配置如下:
<init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/configs/spring/mvc-dispatcher-servlet.xml </param-value> </init-param>
因此 <servlet> 標籤的完整配置如下:
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name><param-value>
/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
(4)web.xml的完整配置如下
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEweb-app PUBLIC
"-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"
version="2.5">
<display-name>Archetype Created WebApplication</display-name>
<!-- DispatcherServlet, Spring MVC的核心 -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- DispatcherServlet對應的上下文配置,預設為/WEB-INF/$servlet-name$-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name> <param-value>
/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher攔截所有的請求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.DispatcherServlet的xml配置檔案的配置
DispatcherServlet的配置檔案MVC_Dispatcher_Servlet.xml(此名字可變,與上面web.xml配置檔案中的<servlet> --><init-param> --> <param-value> 標籤中的值相同即可)提供相關的Spring MVC 配置。可配置選項包括:啟用的功能(如註釋功能),DispatcherServlet上下文,靜態資源處理,啟用的ViewResolver等等。
(1)啟用Spring基於註釋(annotation )的依賴注入(dependencyinjection,DI,關於依賴注入的講解見小知識點),配置如下:
<context:annotation-config/>
(2)配置Dispatcher的上下文環境,包括控制器(Controller)所在的包名,配置如下:
<context:component-scanbase-package="com.study.mvc">
<context:include-filtertype="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
(3)HandlerMapping配置。這裡無需配置,因為Spring MVC可以預設啟動。
(4)註解驅動配置。此配置可擴充註解驅動,用於將請求引數繫結到控制器引數,即將請求的地址繫結到註解了控制器的某個類的某個方法上,詳細請見控制器的編寫部分。配置如下:
<mvc:annotation-driven/>
(5)配置載入的靜態資源的路徑,靜態資源包括 CSS,JavaScript, images 等資原始檔,配置如下:
<mvc:resourcesmapping="/resources/**" location="/resources/" />
(6)配置處理 ViewResolver 的類,可以用多個ViewResolver,使用order屬性排序。配置如下:
<bean
class="
org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order"value="1" />
<propertyname="mediaTypes">
<map>
<entrykey="json" value="application/json" />
<entrykey="xml" value="application/xml" />
<entry key="htm" value="text/html" />
</map>
</property>
<propertyname="defaultViews">
<list>
<!-- JSON View -->
<bean
class=
"org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
</list>
</property>
<propertyname="ignoreAcceptHeader" value="true" />
</bean>
(7)配置Spring MVC 內部的ViewResolver。因為InternalResourceViewResolver是Spring 內部的ViewResolver,所以應將其放在最後,並應配置其字首(prefix)和字尾(suffix)屬性,以便控制器返回字串時能找到對應的檢視(View)。比如這裡配置了prefix 為 /WEB-INF/jsps/,suffix為 .jsp,則若方法返回一個字串home 時,ViewResolver 會自動拼接成 /WEB-INF/jsps/home.jsp。此配置如下:
<bean
class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix"value="/WEB-INF/jsps/" />
<property name="suffix"value=".jsp" />
</bean>
(8)配置 ResolveLazily為200*1024*1024,即200M,用於捕獲檔案異常,此配置我還未弄懂??
<beanid="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"value="209715200" />
<property name="defaultEncoding"value="UTF-8" />
<propertyname="resolveLazily" value="true" />
</bean>
(9)完整配置如下:
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="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-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 本配置檔案是工名為mvc-dispatcher的DispatcherServlet使用,提供其相關的Spring MVC配置 -->
<!-- 啟用Spring基於annotation的DI, 使使用者可以在Spring MVC中使用Spring的強大功能。 啟用 @Required
@Autowired,JSR 250's @PostConstruct,@PreDestroy and @Resource 等標註 -->
<context:annotation-config />
<!-- DispatcherServlet上下文,只管理@Controller型別的bean,忽略其他型的bean, 如@Service -->
<context:component-scanbase-package="com.study.mvc">
<context:include-filtertype="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- HandlerMapping, 無需配置, Spring MVC可以預設啟動。DefaultAnnotationHandlerMapping
annotation-driven HandlerMapping-->
<!-- 擴充了註解驅動,可以將請求引數繫結到控制器引數 -->
<mvc:annotation-driven />
<!-- 靜態資源處理, css, js, imgs -->
<mvc:resourcesmapping="/resources/**" location="/resources/" />
<!-- 配置ViewResolver。 可以用多個ViewResolver。 使用order屬性排序。 InternalResourceViewResolver放在最後。 -->
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order"value="1" />
<propertyname="mediaTypes">
<map>
<entrykey="json" value="application/json" />
<entrykey="xml" value="application/xml" />
<entrykey="htm" value="text/html" />
</map>
</property>
<propertyname="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
</list>
</property>
<propertyname="ignoreAcceptHeader" value="true" />
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsps/"/>
<property name="suffix"value=".jsp" />
</bean>
<!--200*1024*1024即200M resolveLazily屬性啟用是為了推遲檔案解析,以便捕獲檔案大小異常 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<propertyname="maxUploadSize" value="209715200" />
<propertyname="defaultEncoding" value="UTF-8" />
<propertyname="resolveLazily" value="true" />
</bean>
</beans>
5.控制器(Controller)類的編寫
編寫控制器類和控制器方法時,由於需要基於註解的控制器和擴充了註解驅動,因此需要匯入org.springframework.stereotype 包和org.springframework.web.bind.annotation.RequestMapping 包。
(1)編寫控制器類
因為在MVCDispatcherServlet.xml配置檔案中啟用了基於註解(annotation)依賴注入,因此控制器類前應加上註解 @Controller。又因為在MVCDispatcherServlet.xml配置檔案中擴充了註解驅動,即可以將請求引數繫結到控制器引數,因此控制器類前應加上註解@RequestMapping ,如:@RequestMapping("/hello"),則訪問 localhost:8080/專案名/hello ,就會訪問本類
(2)編寫控制器方法
在控制器類中編寫控制器方法前,只需加上註解@RequestMapping()即可,如:@RequestMapping("/mvc"),則訪問 localhost:8080/專案名/hello/mvc ,就會訪問本方法。然後ViewResolver根據本方法返回的引數,依據4.(7),拼接檢視地址,如:本方法返回字串 home ,則依據4.(7),拼接出/WEB-INF/jsps/home.jsp的檢視(View)地址。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("hello")
public class HelloSpringMVC
{
@RequestMapping("mvc")
public String hello()
{
return "home";
}
}
6.注意問題:
(1)需要在專案的Project Facets 新增 Dynamic Web Module ,否則專案將無法新增到Tomcat容器中。
右擊專案 --> 屬性 -->Project Facets --> 勾選 Dynamic WebModule
(2)需要在 Deployment Assembly 中新增 Maven Dependencies ,否則專案編譯時會缺失通過Maven下載的依賴包。
右擊專案 --> 屬性 -->Deployment Assembly --> Add --> Java Build Path Entries --> MavenDependencies --> 完成。
(3)需要在Java 構建路徑中新增Server Runtime庫,否則會報錯。
右擊專案 --> 屬性 --> JavaBuild Path--> --> Library -->Add Library --> Server Runtime -->Apache Tomcat v7.0 --> 完成。
7.小知識點:
(1)依賴注入:依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色需要另外一個角色協助的時候,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在spring中建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉。建立被呼叫者的工作由spring來完成,然後注入呼叫者因此也稱為依賴注入。