SpringMVC基本知識及配置,參數的傳遞
SpringMVC:
1.)SpringMVC和Spring的關系:
軟件開發的三層架構: web層【表示層、表現層】---->Service層---->Dao[DataBase Access Object]---->數據庫!
SpringMVC實際上是Spring的一個子模塊,我們用SpringMVC來代替這個JavaWEB部分!
MVC:也是一種設計模式:M:Model【模型】-->V[View]--->C[Controller]!
Model用來封裝數據的,View:用來顯示數據 Controller:用於接收前端頁面發送的請求,然後調用Service層處理,拿到處理結果,將該結果返回給前端頁面!
SpringMVC:相當於MVC架構中的C以及V!
JavaEE-->J2EE
2.)SpringMVC有什麽優勢?
Spring 為展現層提供的基於 MVC 設計理念的優秀的Web 框架,是目前最主流的 MVC 框架之一。
Spring3.0 後全面超越 Struts2,成為最優秀的 MVC 框架。
Spring MVC 通過一套 MVC 註解,讓 POJO 成為處理請求的控制器,而無須實現任何接口。
支持 REST 風格的 URL 請求。
GET POST PUT DELTE
采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性.
目前主流的開發軟件,說白了,大家都在用!
3.)SpingMVC是基於SpingMVC4.x
4.)SpringMVC的HelloWorld快速入門!
1.加入JAR包:
–commons-logging-1.1.3.jar
–spring-aop-4.0.0.RELEASE.jar
–spring-beans-4.0.0.RELEASE.jar
–spring-context-4.0.0.RELEASE.jar
–spring-core-4.0.0.RELEASE.jar
–spring-expression-4.0.0.RELEASE.jar
–spring-web-4.0.0.RELEASE.jar
–spring-webmvc-4.0.0.RELEASE.jar
2.配置前端控制器【DispatcherServlet】
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<!--向服務器註冊前端控制器! -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<!--DispatcherServlet指的是SpringMVC的前端控制器!,給服務器使用,創建servlet對象! -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化參數contextConfigLocation用於指定SpringMVC配置文件的路徑以及名稱 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 數字0或者大於0的數字表示的是:在服務器啟動的時候創建Servlet對象,而不是第一次訪問的時候創建
小於0的數字指的是:在第一次訪問的時候創建Servlet對象.
在數字大於O的情況下,數字越小,優先級越高!
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<!-- 用 servlet-mapping指定請求映射的路徑-->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- 用url-pattern指定攔截 的請求路徑! -->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.創建SpringMVC的配置文件並添加要掃描的包
註意:1.創建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
2.我們創建SpringMVC配置文件的時候使用的是Spring Bean Configuration File創建的,不是XML!
<!-- 配置SpingMVC容器要掃描的包! -->
<context:component-scan base-package="com.neuedu.controller"></context:component-scan>
4.在springMVC掃描的包下創建控制器類[Controller/Handler],註意要加入@Controller註解
/**
* 我們通過@RequestMapping做請求URL的映射!
* @return
*/
@RequestMapping("/sayHello")
public String sayHello(){
return "/WEB-INF/views/success.jsp";
}
註意:在類的方法上我們使用的是@RequestMapping,然後在括號裏指定請求url的請求路徑!
5.創建頁面!
註意:1.當我們不用init-param指定springMVC配置文件的路徑好位置的時候,SpringMVC默認會去
/WEB-INF/<servlet-name>-servlet.xml
2.配置視圖解析器
<!--InternalResourceViewResolvers 是視圖解析器 ,它會將邏輯視圖轉換成實際的物理視圖,做一個轉發操作!
也就是說具體步驟:prefix + 方法的返回值 + suffix-->
<!-- /WEB-INF/views/success.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
3.請求一個SpringMVC的流程!
5.)使用 @RequestMapping 映射請求
?Spring MVC 使用 @RequestMapping 註解為控制器指定可以處理哪些 URL 請求
?在控制器的類定義及方法定義處都可標註
@RequestMapping
– 類定義處:提供初步的請求映射信息。相當於當前 WEB 應用的根目錄
– 方法處:提供進一步的細分映射信息。相對於類定義處的 URL。
若 類定義處未標註 @RequestMapping,則方法處標記的 URL 相當於當前 WEB 應用的根目錄
若 類定義處標註 @RequestMapping,則方法處標記的 URL 相對於類定義處的@RequestMapping而言的!
DispatcherServlet 截獲請求後,就通過控制器上@RequestMapping 提供的映射信息確定請求所對應的處理方法。
映射請求參數、請求方法或請求頭
[email protected] 除了可以使用請求 URL 映射請求外,還可以使用請求方法、請求參數及請求頭映射請求
[email protected] 的 value、method、params 及 heads 分別表示請求 URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射 更加精確化。
params 和 headers支持簡單的表達式:
– param1: 表示請求必須包含名為 param1 的請求參數
– !param1: 表示請求不能包含名為 param1 的請求參數
– param1 != value1: 表示請求包含名為 param1 的請求參數,但其值 不能為 value1
–{“param1=value1”, “param2”}: 請求必須包含名為 param1 和param2 的兩個請求參數,且 param1 參數的值必須為 value1!
Method:GET / POST /PUT /DELETE
使用 @RequestMapping 支持Ant風格的請求URL!
? Ant 風格資源地址支持 3 種匹配符:
– ?:匹配文件名中的一個字符
– *:匹配文件名中的任意多個任意字符[0個字符除外!]
– **:** 匹配多層路徑
[email protected] 還支持 Ant 風格的 URL:
–/user/*/createUser: 匹配
/user/aaa/createUser、/user/bbb/createUser 等 URL
–/user/**/createUser: 匹配
/user/createUser、/user/aaa/bbb/createUser 等 URL
–/user/createUser??: 匹配
/user/createUseraa、/user/createUserbb 等 URL
@PathVariable 映射 URL 綁定的占位符
帶占位符的 URL 是 Spring3.0 新增的功能,該功能在 SpringMVC 向 REST 目標挺進發展過程中具有裏程碑的意義
通過 @PathVariable 可以將 URL 中占位符參數綁定到控制器處理方法的入參中:URL 中的 {xxx} 占位符可以通過
@PathVariable("xxx") 綁定到操作方法的入參中,需要註意的是:該註解的value屬性值要與占位符保持一致。
6.)REST:即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種互聯網軟件架構。
它結構清晰、符合標準、易於理解、擴展方便, 所以正得到越來越多網站的采用.
HTTP 協議裏面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。
它們分別對應四種基本操作:
GET 用來獲 取資源,
POST 用來新建資源,
PUT 用來更新資源,
DELETE 用來刪除資源。
示例:
–/order/1 HTTP GET :得到 id = 1 的 order
–/order/1 HTTP DELETE:刪除 id = 1的 order
–/order/1 HTTP PUT:更新id = 1的 order
–/order HTTP POST:新增 order
?HiddenHttpMethodFilter:瀏覽器 form 表單只支持 GET 與 POST 請求,而DELETE、PUT 等 method 並不支 持,Spring3.0 添加了一個過濾器,可以將這些請求轉換 為標準的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請求。
POST請求如何轉化為put請求和delele請求?
1.在web.xml文件中配置:
<!-- HiddenHttpMethodFilter過濾器可以將POST請求轉化為put請求和delete請求! -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.在表單域中需要攜帶一個name值為_method,value值為put或者delete的參數,如下所示:
<form action="${pageContext.request.contextPath }/order/1" method="post">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="Submit"/>
</form>
<form action="${pageContext.request.contextPath }/order/1" method="post">
<input type="hidden" name="_method" value="delete"/>
<input type="submit" value="Submit"/>
</form>
7.)@RequestParam可以接收請求的參數,相當於Servlet的getParameter()方法!
註意:要把@RequestParam和@PathVariable區分開:
三個默認屬性:
value:這個字段要與請求參數的name屬性值一致!
required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
8.)@RequestHeader:獲取請求頭信息,默認屬性:
value:這個字段要與請求參數的name屬性值一致!
required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
9.)針對POST請求亂碼的處理:
在web.xml文件中加上CharacterEncodingFilter
<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>
10. MVC 的 Handler 方法可以接受哪些 ServletAPI 類型的參數
HttpServletRequest
HttpServletResponse
HttpSession
11.使用 POJO 對象綁定請求參數值
Spring MVC 會按請求參數名和 POJO 屬性名進行自動匹 配,自動為該對象填充屬性值。支持級聯屬性。 如:dept.deptId、dept.address.tel 等
12.處理模型數據
Spring MVC 提供了以下幾種途徑輸出模型數據:
–ModelAndView: 處理方法返回值類型為 ModelAndView時, 方法體即可通過該對象添加模型數據
–Map 及 Model、ModelMap: 入參為 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時,處理
方法返回時,Map 中的數據會自動添加到模型中。
無論我們的返回值是String類型還是ModelAndView類型,SpringMVC框架執行目標Handler方法之後都會將返回值解析為ModelAndView;
我們放入到Map或者Model、ModelMap中的數據都會放入ModelAndView對象中,作為MOdel使用!
13.關於重定向
一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理
如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理:將 forward: 和 redirect: 當成指示符,其後的字符串作為 URL 來處理
–redirect:/success.jsp:會完成一個到 success.jsp 的重定向的操作
–forward:/success.jsp:會完成一個到 success.jsp 的轉發操作
可以在spingmvc配置文件中配置 <mvc:view-controller path="/j1sp" view-name="success"/>標簽,就可以讓我們的請求不經過Controller,直接進入另一個目標頁面!
<!-- 但是此時原來訪問正常的@RequestMapping URL現在卻不能正常訪問了,如果想正常訪問,需要加入<mvc:annotation-driven>該標簽-->
<mvc:annotation-driven></mvc:annotation-driven>
–@SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共享這個屬性
– @ModelAttribute: 方法入參標註該註解後, 入參的對象 就會放到數據模型中
SpringMVC基本知識及配置,參數的傳遞