1. 程式人生 > >使用Eclipse基於Maven的Spring MVC 除錯心得(二)--- Spring配置

使用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來完成,然後注入呼叫者因此也稱為依賴注入。