1. 程式人生 > >SpringMVC(1):基礎配置檔案web.xml 和 -servlet.xml / springmvc.xml

SpringMVC(1):基礎配置檔案web.xml 和 -servlet.xml / springmvc.xml

日期:2017/12/9

       springMVC是目前流行的java開發框架。如何進行開發呢?個人覺得,如果先接觸過jsp和Servlet開發技術,瞭解一下去寫web底層的對於最原始的請求和響應處理的程式碼,是不錯的;因為springmvc 是基於jsp、servlet與javabean進行的(這三者已經可以組成mvc的最小模組)。

【教程:http://www.yiibai.com/spring_mvc/

【官方文件(英文):https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html

【官方文件(中文):https://linesh.gitbooks.io/spring-mvc-documentation-linesh-translation/content/

    Spring的模型-檢視-控制器(MVC)框架是圍繞一個 DispatcherServlet  來設計的,這個Servlet會把請求分發給各個處理器,並支援可配置的處理器對映、檢視渲染、本地化、時區與主題渲染等,甚至還能支援檔案上傳。處理器是你的應用中註解了@Controller  和 @RequestMapping  的類和方法,Spring為處理器方法提供了極其多樣靈活的配置。Spring 3.0以後提供了 @Controller  註解機制、 @PathVariable  註解以及一些其他的特性,你可以使用它們來進行RESTful web站點和應用的開發。

    先說一下配置檔案web.xml ,它的作用是限定了整個web的執行環境,如:請求過來了,交給誰來處理、瀏覽器對某些請求不接受,要不要轉換一下請求格式等等。

1. DispatcherServlet 其實就是個 Servlet (它繼承自 HttpServlet 基類),同樣也需要在你web應用的 web.xml 配置檔案下宣告。你需要在 web.xml 檔案中把你希
望 DispatcherServlet 處理的請求對映到對應的URL上去。這就是標準的Java EE Servlet配置;

    下面的程式碼就展示了對 DispatcherServlet 和路徑對映的宣告:

<web-app>
<servlet>
         <servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet><servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping></web-app>

    在上面的例子中,所有路徑以 /example 開頭的請求都會被名字為 example 的 DispatcherServlet 處理。在Servlet 3.0+的環境下,你還可以用程式設計的方式配置Servlet容器。下面是一段這種基於程式碼配置的例子,它與上面定義的 web.xml 配置檔案是等效的。

2. web.xml 配置DispatcherServlet 有兩種方法:

   (1)使用spring的bean.xml :命名為springmvc;


           web.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<!-- 配置 DispatcherServlet -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>	
		
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

      (2)實際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置檔案, 而使用預設的的配置檔案為: /WEB-INF/<servlet-name>-servlet.xml,因為使用了預設,肯定也有預設路徑,新建的檔案也要放在 /WEB-INF/資料夾下!!

      新建自定義的<servlet-name>-servlet.xml,例如dispatcherServlet-servlet.xmldispatcherServlet就是<servlet-name>,所以web.xml的<servlet-name>要寫對!!

      web.xml檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">

	<!-- 配置 DispatcherServlet -->
	<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>

</web-app>


3. DispatcherServlet 的處理流程:

      配置好 DispatcherServlet 以後,開始有請求會經過這個 DispatcherServlet 。此時, DispatcherServlet 會依照以下的次序對請求進行處理:

  (1)首先,搜尋應用的 上下文物件 WebApplicationContext 並把它作為一個屬性(attribute)繫結到該請求上,以便控制器和其他元件能夠使用它。屬性的鍵名預設為 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE;

  (2)將地區(locale)解析器繫結到請求上,以便 其他元件在處理請求(渲染檢視、準備資料等)時可以獲取區域相關的資訊。如果你的應用不需要解析區域相關的資訊,忽略它即可。

  (3)將主題(theme)解析器繫結到請求上,以便其他元件(比如檢視等)能夠了解要渲染哪個主題檔案。同樣,如果你不需要使用主題相關的特性,忽略它即可;

  (4) 如果你配置了multipart檔案處理器,那麼框架將查詢該檔案是不是multipart(分為多個部分連續上傳)的。若是,則將該請求包裝成一個MultipartHttpServletRequest 物件,以便處理鏈中的其他元件對它做進一步的處理。關於Spring對multipart檔案傳輸處理的支援,讀者可以參考21.10 Spring的multipart(檔案上傳)支援一小節;

  (5)為該請求查詢一個合適的處理器。如果可以找到對應的處理器,則與該處理器關聯的整條執行鏈(前處理器、後處理器、控制器等)都會被執行,以完成相應模型的準備或檢視的渲染;

  (6)如果處理器返回的是一個模型(model),那麼框架將渲染相應的檢視。若沒有返回任何模型(可能是因為前後的處理器出於某些原因攔截了請求等,比如,安全問題),則框架不會渲染任何檢視,此時認為對請求的處理可能已經由處理鏈完成了。

4.  <servlet-name>-servlet.xml / springmvc.xml 配置檔案

1.作用1是:定義了檢視解析器,使用標籤<bean>:

	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
2.作用2是:配置自動掃描的包:
	<!-- 配置自定掃描的包 -->
	<context:component-scan base-package="com.atguigu.springmvc"></context:component-scan>
3.作用3:配置國際化資原始檔:
	<!-- 配置國際化資原始檔 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="i18n"></property>	
	</bean>
	
4.作用4:配置直接轉發的頁面:
	<!-- 配置直接轉發的頁面 -->
	<!-- 可以直接相應轉發的頁面, 而無需再經過 Handler 的方法.  -->
	<mvc:view-controller path="/success" view-name="success"/>
<!-- 在實際開發中通常都需配置 mvc:annotation-driven 標籤 -->
<mvc:annotation-driven></mvc:annotation-driven>

5.作用5:配置檢視  BeanNameViewResolver 解析器: 使用檢視的名字來解析檢視
	<!-- 通過 order 屬性來定義檢視解析器的優先順序, order 值越小優先順序越高 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="100"></property>
	</bean>

還有很多,日後學習到再作總結分享。