二、SpringMVC的案例分析
文章目錄
1、入門程序
1.1創建web工程,引入開發的jar包
- 在pom文件中引入座標
<dependencies>
<!--創建的是web工程-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入事務-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入上下文,IOC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入mvc框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入servlet,在編譯期間有效,運行期間無效-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--引入jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
1.2配置核心控制器(DispatcherServlet)
<!--配置servlet的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置servlet的初始化參數,讀取springMVC的配置文件,創建spring容器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置springMVC啓動時加載對象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--“/”代表任何路徑均可-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置過濾器,解決中文亂碼問題-->
<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>
1.3編寫SpringMVC.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置spring容器掃描時要創建的包-->
<context:component-scan base-package="com.simon"></context:component-scan>
<!--配置視圖解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置spring開啓註解mvc的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
1.4編寫index.jsp和HelloController
-
index.jsp
<html> <body> <h2>Hello World!</h2><br> <!--查找路徑--> <a href="user/hello">Simon,你將會成功</a> </body> </html>
-
HelloController
@Controller @RequestMapping(path = "/user")//一級路徑 public class HelloController { @RequestMapping(path = "/hello")//二級路徑 public String sayHello(){ System.out.println("Hello,SpringMVC"); return "success";//根據視圖解析器查找succes.jsp } }
-
success.jsp(在WEB-INF目錄下創建pages文件夾,在文件下創建jsp文件)
<html> <body> <h2>Hello Simon!</h2><br> <h2>success</h2> </body> </html>
-
啓動tonmcat進行測試
2、執行過程分析
- 入門案例執行流程
- 當啓動Tomcat服務器的時候,讀取到 web.xml 中的配置創建 spring 容器並且初始化容器中的對象。 從入門案例中可以看到的是:HelloController 和 InternalResourceViewResolver,但是遠不 止這些
- 瀏覽器發送請求(案例中的index.jsp),被 DispatherServlet 捕獲,該 Servlet 並不處理請求,而是把請求轉發出去。轉發 的路徑是根據請求 URL,匹配@RequestMapping 中的內容。
- 匹配到了後,執行對應方法。該方法有一個返回值(案例中的success)。
- 根據方法的返回值,藉助 InternalResourceViewResolver (視圖解析器)找到對應的結果視圖
- 渲染結果視圖,響應瀏覽器。
- 組件分析
DispatcherServlet:前端(核心)控制器
用戶請求到達前端控制器,它就相當於 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由 它調用其它組件處理用戶的請求,dispatcherServlet 的存在降低了組件之間的耦合性
HandlerMapping:處理器映射器
HandlerMapping 負責根據用戶請求找到 Handler 即處理器,SpringMVC 提供了不同的映射器實現不同的 映射方式,例如:配置文件方式,實現接口方式,註解方式等。
Handler:處理器
它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把用戶請求轉發到 Handler。由 Handler 對具體的用戶請求進行處理。 (如Contoller進行具體的處理)
HandlAdapter:處理適配器
通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理 器進行執行。
View Resolver:視圖解析器
View Resolver 負責將處理結果生成 View 視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名 即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果通過頁面展示給用戶
View:視圖
如常見的.jsp,一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱爲 SpringMVC 的三大組件。使用mvc:annotation-driven 可以自動加載 RequestMappingHandlerMapping (處理映射器)和 RequestMappingHandlerAdapter ( 處 理 適 配 器 )
3、RequestMapping註解
- RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係
- RequestMapping註解可以作用在方法和類上
作用在類上:第一級的訪問目錄
作用在方法上:第二級的訪問目錄
路徑可以不編寫 / 表示應用的根目錄開始
- RequestMapping的屬性
path:指定請求路徑的url
value:value屬性和path屬性是一樣的
method:指定該方法的請求方式
method=RequestMethod.POST/GET/PUT等
params:指定限制請求參數的條件
@RequestMapping(value="/removeAccount",params= {“accountName”,“money>100”})
NOTE:jsp中的參數必須在url路徑上,若是方法上需要有參數,需要在視圖的表單內,必須用POST來發送請求體。
headers:發送的請求中必須包含請求頭
三、請求參數綁定
1、請求參數的綁定說明
1.1綁定機制
- 表單提交的數據都是k=v格式的 username=haha&password=123
- SpringMVC的參數綁定過程是把表單提交的請求參數,作爲控制器中方法的參數進行綁定的
- 要求:提交表單的name和參數的名稱是相同
1.2支持的數據類型
基本數據類型和字符串類型
實體類型(javaBean)
集合數據類型(List、map集合等)
2、基本數據類型和字符串類型
- 提交表單的name和參數的名稱是相同的
- 區分大小寫
<!-- 基本類型示例 --> <a href="account/findAccount?accountId=10&accountName=zhangsan">查詢賬戶</a>
@RequestMapping("/findAccount") public String findAccount(Integer accountId,String accountName) { }
3、實體類型(JavaBean)
- 提交表單的name和JavaBean中的屬性名稱需要一致
- 如果一個JavaBean類中包含其他的引用類型,那麼表單的name屬性需要編寫成:對象.屬性 例如: address.name
<form action="account/saveAccount" method="post"> 賬戶名稱:<input type="text" name="name" ><br/> 賬戶金額:<input type="text" name="money" ><br/> <!--address是引用類型,包含了provinceName和CityName屬性--> 賬戶省份:<input type="text" name="address.provinceName" ><br/> 賬戶城市:<input type="text" name="address.cityName" ><br/> <input type="submit" value=" 保存 "> </form>
@RequestMapping("/saveAccount") public String saveAccount(Account account) { }
4、集合屬性數據封裝
<form action="account/updateAccount" method="post">
用戶名稱:<input type="text" name="username" ><br/>
用戶密碼:<input type="password" name="password" ><br/>
用戶年齡:<input type="text" name="age" ><br/>
賬戶 1 名稱:<input type="text" name="accounts[0].name" ><br/>
賬戶 1 金額:<input type="text" name="accounts[0].money" ><br/>
賬戶 2 名稱:<input type="text" name="accounts[1].name" ><br/>
賬戶 2 金額:<input type="text" name="accounts[1].money" ><br/>
賬戶 3 名稱:<input type="text" name="accountMap['one'].name" ><br/>
賬戶 3 金額:<input type="text" name="accountMap['one'].money" ><br/>
賬戶 4 名稱:<input type="text" name="accountMap['two'].name" ><br/>
賬戶 4 金額:<input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value=" 保存 "> </form>
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
}
5、使用ServletAPI對象作爲方法參數
SpringMVC 還支持使用原始 ServletAPI 對象作爲控制器方法的參數。支持原始 ServletAPI 對象有:
HttpServletRequest
HttpServletResponse
HttpSession