簡介
先看它多厲害,不然沒興趣學
- Spring 爲展現層提供的基於 MVC 設計理念的優秀的 Web 框架,是目前最主流的MVC 框架之一
- Spring3.0 後全面超越 Struts2,成爲最優秀的 MVC 框架。
- Spring MVC 通過一套 MVC 註解,讓 POJO 成爲處理請求的控制器,而無須實現任何接口。
- 支持 REST 風格的 URL 請求。 Restful
- 採用了鬆散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性。
結構
- 一種輕量級的、基於MVC的Web層應用框架。偏前端而不是基於業務邏輯層。Spring框架的一個後續產品。
- Spring框架結構圖(新版本):
作用
- 天生與Spring框架集成,如:(IOC,AOP)
- 支持Restful風格
- 進行更簡潔的Web層開發
- 支持靈活的URL到頁面控制器的映射
- 非常容易與其他視圖技術集成,如:Velocity、FreeMarker等等
- 因爲模型數據不存放在特定的API裏,而是放在一個Model裏(Map數據結構實現,因此很容易被其他框架使用)
- 非常靈活的數據驗證、格式化和數據綁定機制、能使用任何對象進行數據綁定,不必實現特定框架的API
- 更加簡單、強大的異常處理
- 對靜態資源的支持
- 支持靈活的本地化、主題等解析
常用的組件
- 將Web層進行了職責解耦,基於請求-響應模型
- 常用主要組件
① DispatcherServlet:前端控制器
② Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉移到前端控制器了,用於對請求進行處理
③ HandlerMapping :請求映射到處理器,找誰來處理,如果映射成功返回一個HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器對象)
④ View Resolver : 視圖解析器,找誰來處理返回的頁面。把邏輯視圖解析爲具體的View,進行這種策略模式,很容易更換其他視圖技術;
如InternalResourceViewResolver將邏輯視圖名映射爲JSP視圖
⑤ LocalResolver:本地化、國際化
⑥ MultipartResolver:文件上傳解析器
⑦ HandlerExceptionResolver:異常處理器
永恆的HelloWord
導入的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
commons-logging-1.1.3.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
配置
<?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">
<display-name>SpringMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- 這裏的url模型就寫一個/,代表的是處理請求,而將訪問頁面的過濾掉
如果你寫了/*,代表這個工程下的所有的內容都要被這個核心控制器來處理
但是訪問靜態頁面的不需要核心控制器來處理,所以就要寫成/*
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 掃描組件,將加上了@Controller註解的類作爲springMVC的控制層 -->
<context:component-scan base-package="test"></context:component-scan>
<!-- 配置視圖解析器
作用:將prefix+視圖名稱+suffix確定爲最終要跳轉的頁面
視圖名稱就是POJO調用的方法返回的string
/WEB-INF/view/success.jsp
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="test?username=admin&password=1234">test</a>
</body>
</html>
package test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/*
* 在web.xml中配置SpringMVC的核心(前端控制器)DispatcherServlet
* 作用是:加載springMVC的配置文件,在下方的配置方式下,
* DispatcherServlet自動加載配置文件,此時的配置文件有默認的位置和名稱
* 默認位置:WEB-INF下,默認的名稱是<servlet-name>-servlet.xml
* 例如下面配置就是springMVC-servlet.xml
* 當加載了配置文件,SpringMVC就會根據它掃描組件找到控制層
* <servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
寫上SpringMVC的配置文件
* 創建一個POJO,在此類上加上@Controller註解,springMVC就會將此類作爲控制層加載
* 讓它來處理請求響應
*
* 在控制層需要在方法寫上@RequestMapping(value="")
* springMVC就是通過此註解將請求路徑與控制層中的方法進行匹配
* 此時對應的的請求路徑是localhost:8080/projectName/xxx
*
* 處理請求的方法會返回一個字符串,就是視圖名稱,
* 最終會通過配置文件中配置的視圖解析器實現頁面跳轉
* 方式:prefix+視圖名稱+suffix,此爲最終跳轉的頁面路徑
*/
@Controller
//@RequestMapping("test")
public class Test
{
/*
* 現在假設請求是:localhost:8080/SpringMVC/test
* return "success";返回的是視圖名稱
* test(String name,String password)裏面的參數還可以根據請求是的參數進行自動設置
* 就是據變量的名字進行自動封裝的
*/
/*
* @RequestMapping:設置請求映射,把請求和控制層中的方法設置映射關係
* 當請求路徑和@RequestMapping的value屬性一致的時候,
* 該註解所標記的方法就是處理請求的方法
*
* method:用來設置請求方式,只有客戶端發送請求的方式和method的值一樣的時候蔡處理請求
* 常用的請求方式有:get(查詢) post(添加) put(修改) delete(刪除)
*
* params:設置客戶端傳到服務器的數據,支持表達式的,比如
* username :只處理參數中有username參數的
* !username:沒有username參數的
* username!=admin:username不等於admin的
*
* headers:設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性所設置的一致
*
* @RequestMapping可以加在類上,也可以在加方法上
* 加在類上的時候,瀏覽器訪問的路徑url就得寫多一層,就是多了類上的@RequestMapping的value值
* 所以是一層一層地訪問,先訪問類再訪問方法上
*/
@RequestMapping(value = "test1",method = RequestMethod.GET,params = {"!age"},headers = {"Accept-Language=zh-CN,zh;q=0.9"})
public String test1(String name,String password)
{
System.out.println(name+"==="+password);
return "success";
}
/*
* springMVC支持Ant方式的請求路徑
* Ant的三種匹配符:*(任意字符) ?任意一個字符 **任意多層目錄
*/
@RequestMapping(value = "/*/abc??/**/test")
public String test2(String name,String password)
{
System.out.println(name+"==="+password);
return "success";
}
/*
* springMVC支持佔位符方式的路徑
* 以前:localhost:8080/SpringMVC/test?id=100&username=admin
* 現在使用REST的風格
* 現在:localhost:8080/SpringMVC/test/100/admin
* 請求路徑裏面有id和username的佔位符,
* @PathVariable註解就是取出裏面的值賦值給參數的
*/
@RequestMapping(value = "test/{id}/{username}")
public String test3(@PathVariable("id")Integer id,@PathVariable("username")String username)
{
System.out.println(id+"==="+username);
return "success";
}
}