SpringMvc架構的理解

   

  1. SpringMVC架構

  1. 1 Spring web mvc介紹

Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來: 

   1.2 Springmvc的優點

(1)可以支持各種視圖技術,而不僅僅侷限於JSP;

(2)與Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) , 請求到處理器映射(handlerMapping), 處理器適配器(HandlerAdapter), 視圖解析器(ViewResolver)。

(4)支持各種請求資源的映射策略。 

   1.3 web mvc

      mvc設計模式在b/s系統下應用:

工作流程:

    1.用戶發起request請求至控制器(Controller)控制接收用戶請求的數據,委託給模型進行處理

    2.控制器通過模型(Model)處理數據並得到處理結果模型通常是指業務邏輯

    3.模型處理結果返回給控制器

    4.控制器將模型數據在視圖(View)中展示web中模型無法將數據直接在視圖上顯示,需要通過控制器完成。如果在C/S應用中模型是可以將數據在視圖中展示的。

    5.控制器將視圖response響應給用戶通過視圖展示給用戶要的數據或處理結果。

1.3 Spring web mvc 架構

 1.3.1 spring web mvc 架構圖

 1.3.2 請求流程

   1. 用戶發送請求至前端控制器DispatcherServlet.

   2.DispatcherServlet收到請求調用HandlerMapping處理器映射器。

 3.處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。

 4.DispatcherServlet通過HandlerAdapter處理器適配器調用處理器

 5.執行處理器(Controller,也叫後端控制器)。

 6.Controller執行完成返回ModelAndView

 7.HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet

 8.ViewReslover視圖解析器解析後返回具體View

 9.DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。

 10.DispatcherServlet響應用戶

 1.3.3 spring web mvc 組件說明

   1.DispatcherServlet:前端控制器

    用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求, dispatcherServlet的存在降低了組件之間的耦合性。

   2.HandlerMapping:處理器映射器

    HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式, 例如:配置文件方式,實現接口方式,註解方式等。

   3.HandlAdapter:處理器適配器

    通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。

   4.Handler:處理器

   Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。

   5.ViewResolver:視圖解析器

   ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。 springmvc框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等。

2.SpringMVC入門

2.1創建一個 web項目

 1.File---New---Project

2.選擇Java Enterprise版本,然後配置tomcat

3.選擇使用模板創建項目

4.創建web項目名配置tomcat

5.項目目錄創建完成

2.2導入spring的jar包

2.3配置前端控制器

 2.3.1在WEB-INF\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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>springmvc</display-name>
  <!-- 配置Spring -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 配置SpringMVC的編碼格式 -->
  <filter>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
  </filter>
  <filter-mapping>  
     	<filter-name>CharacterEncodingFilter</filter-name>  
     	<url-pattern>/*</url-pattern>  
  </filter-mapping> 
   <!-- 加載其他的配置文件 --> 
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-servlet.xml</param-value>
  </context-param>  
   <!-- 配置Spring的前置控制器DispatcherServlet --> 
  <servlet>
        <servlet-name>spring</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
        <load-on-startup>1</load-on-startup>
   </servlet>
<!--加入前端控制器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
   <!-- 配置Spring的url後綴 --> 
   <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
   </servlet-mapping>
</web-app>

load-on-startup:表示servlet隨服務啓動;

url-pattern*.action的請交給DispatcherServlet處理。

contextConfigLocation:指定springmvc配置的加載位置,如果不指定則默認加

WEB-INF/[DispatcherServlet Servlet 名字]-servlet.xml

2.3.2前端配置器servlet如何攔截

  1.攔截固定後綴的url,比如設置爲 *.do、*.action, 例如:/user/add.action 此方法最簡單,不會導致靜態資源(jpg,js,css)被攔截。

  2.攔截所有,設置爲/,例如:/user/add  /user/add.action此方法可以實現REST風格的url,很多互聯網類型的應用使用這種方式。但是此方法會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。需要特殊處理。

  3.攔截所有,設置爲/*,此設置方法錯誤,因爲請求到Action,當action轉到jsp時再次被攔截,提示不能根據jsp路徑mapping成功。

2.4.springMVC配置文件的配置

 2.4.1Springmvc默認加載WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定義處指定加載的配置文件,如下:

<!--加入前端控制器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

如上代碼,通過contextConfigLocation加載classpath下的springmvc.xml配置文件

2.4.2 配置處理器映射器

springmvc.xml文件配置如下:

<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-4.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.1.xsd 
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    
   <!-- controller方法調用規則:通過url中的method參數指定要執行的controller方法-->  
    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
   	 	<property name="paramName" value="action" />  
    	<property name="defaultMethodName" value="view" />
	</bean>
	<!-- 配置MVC的前綴(prefix)和後綴(suffix) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
       <!--  <property name="prefix" value="/WEB-INF/" /> -->
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- 以下是 控制器的配置 -->
    	<!-- 處理器映射器 -->
	<!-- 根據bean的name進行查找Handler 將action的url配置在bean的name中 -->
	<bean
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
  		<property name="order" value="1" />
  		<property name="mappings">
   			<props>
   				<prop key="user.do">userController</prop>
   				<prop key="index.do">indexController</prop>
   			</props>
  		</property>
  	</bean>  	
	<bean name="userController"  class="cn.raffaello.controller.UserController">
		<property name="userIService" ref="userIService"></property>
	</bean>
	<bean name="indexController"  class="cn.raffaello.controller.IndexController" />
	<!-- ServiceBean的配置 -->
	<bean name="userIService" class="cn.raffaello.service.impl.UserServiceImpl" />
</beans>

注:BeanNameUrlHandlerMapping:表示將定義的Bean名字作爲請求的url,需要將編寫的controller在spring容器中進行配置,且指定bean的name爲請求的url,且必須以.action結尾。

2.4.3 配置適配器處理器

在springmvc.xml文件配置如下:

<bean		
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

SimpleControllerHandlerAdapter:即簡單控制器處理適配器,所有實現了org.springframework.web.servlet.mvc.Controller 接口的Bean作爲Springmvc的後端控制器。

2.4.4 配置視圖解析器

<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver:支持JSP視圖解析

viewClassJstlView表示JSP模板頁面需要使用JSTL標籤庫,所以classpath中必須包含jstl的相關jar 包;

prefix suffix:查找視圖頁面的前綴和後綴,最終視圖的址爲:

前綴+邏輯視圖名+後綴,邏輯視圖名需要在controller中返回ModelAndView指定,比如邏輯視圖名爲hello,則最終返回的jsp視圖地址 “WEB-INF/jsp/hello.jsp

2.4.5配置後端控制器

springmvc.xml文件配置如下:

<!-- controller配置 -->

<bean name="/items1.action" id="itemList1"

class="com.test.springmvc.controller.first.ItemList1"/>

name="/items1.action"前邊配置的處理器映射器爲BeanNameUrlHandlerMapping,如果請求的URL 爲“上下文/items1.action”將會成功映射到ItemList1控制器。

此時此刻web的相關項目配置已經基本完成,需要仔細配置,稍有差錯都會出現錯誤,大傢俱體情況具體配置

3.springmvc用到的相關注解

1. @ResponseBody:註解實現將conreoller方法返回對象轉化爲json對象響應給客戶。

2.@component : 創建類對象 相當於配置<bean>

3.@service : 作用於業務邏輯層

4.@Repository : 作用於持久層

5.@controller :作用於表現層(spring-mvc的註解)

6.@RequestMapping :定義請求url到處理器功能方法的映射,可用於類或方法上。用於類上,則表示類中的所有響應請求的方法都是以該地址作爲父路徑。

7. @RequestBody: 註解實現接收http請求的json數據,將json轉換爲java對象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章