SpringMVC--從基礎到...
1.SpringMVC基本概述
Spring 為展現層提供的基於 MVC 設計理念的優秀的Web 框架,是目前最主流的 MVC 框架之一
Spring3.0 後全面超越 Struts2,成為最優秀的 MVC 框架 Spring MVC 通過一套 MVC註解,讓 POJO 成為處理請求的控制器,而無須實現任何接口。 用SpringMVC代替web層 MVC是一種設計模式: M:model 模型:用來封裝數據,比如javabean V:view 視圖:用來顯示數據 C:controller:用於接收前端頁面發送的請求,然後調用servlet層處理,拿到處理結果並將結果返回給前端界面 SpringMVC相當於MVC中的C和V!采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性 2.建一個最基礎的SpringMVC項目 步驟: – 導 jar 包
– 在 web.xml 中配置 DispatcherServlet
– 加入 Spring MVC 的配置文件
– 編寫處理請求的處理器,並標識為處理器 – 編寫視圖 代碼實現: ① 導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
<!-- 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> <!-- 用於制定SpringMVC配置文件的路徑以及名稱 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml新建springmvc.xml文件</param-value> </init-param> <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>
點擊Next輸入文件名springmvc.xml,再點Next,在以下三項前打勾√
在Open Type中查找 InternalResourceViewResolver,獲得其全路徑
在springmvc.xml文件中添加
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
在web.xml文件中可以不設置初始化參數,也就是不寫<init-param>
但是要將spring.xml文件改名為 springDispatcherServlet-servlet.xml,並移動到WEB-INF目錄下
③ 編寫jsp頁面和controller類
@RequestMapping(value="/sayHello",method=RequestMethod.GET,params={"username","pwd!=123"})
public String SUCCESS(){
System.out.println("111");
return "success";
}
@RequestMapping()可以定義在類上,也可以定義在方法上
– 類定義處:提供初步的請求映射信息。相對於 WEB 應用的根目錄
– 方法處:提供進一步的細分映射信息。相對於類定義處的 URL
@RequestMapping 的 value、method、params 及 heads 分別表示請求URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射 更加精確化
params表示及含義
– param1: 表示請求必須包含名為 param1 的請求參數 – !param1: 表示請求不能包含名為 param1 的請求參數 – param1 != value1: 表示請求可以不包含名為 param1 的請求參數,若包含的話其值不能為 value1 如上例代碼中,必須要有’username‘參數,’pwd‘參數可有可無,若有的話不能為‘123’ 使用 @RequestMapping 映射請求,Ant 風格資源地址支持 3 種匹配符: – ?:匹配文件名中的一個字符– *:匹配文件名中的任意字符
– **:** 匹配多層路徑 @RequestMapping 還支持 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 ④ 運行 3.REST :Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種互聯網軟件架構。 它結構清晰、符合標準、易於理解、擴展方便, 所以正得到越來越多網站的采用.
HTTP 協議裏面,四個表示操作方式的動詞: GET 用來獲 取資源 POST 用來新建資源 PUT 用來更新資源 DELETE 用來刪除資源
<a href="${pageContext.request.contextPath }/getOrderById/1">okok</a> <form action="${pageContext.request.contextPath }/postOrderById/2" method="post"> <input type="submit" value="Submit"/> </form> <form action="${pageContext.request.contextPath }/putOrderById/3" method="post"> <input type="hidden" name="_method" value="put"/> <input type="submit" value="Submit"/> </form> <form action="${pageContext.request.contextPath }/deleteOrderById/4" method="post"> <input type="hidden" name="_method" value="delete"/> <input type="submit" value="Submit"/> </form>
超鏈接<a>是get請求,瀏覽器 form 表單只支持 GET 與 POST 請求,而DELETE、PUT 等 method 並不支持,Spring3.0 添加了一個過濾器,可以將這些請求轉換為標準的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請求。需要在form表單中添加隱藏域,name為‘method‘,value為’POST/DELETE‘
同時需要在web.xml文件中配置 HiddenHttpMethodFilter
<!-- 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>
@RequestMapping(value="/getOrderById/{id}",method=RequestMethod.GET) public String getOrderById(@PathVariable(value="id") Integer id){ //調用service層方法 System.out.println(id); return SUCCESS; } @RequestMapping(value="/postOrderById/{id}",method=RequestMethod.POST) public String postOrderById(@PathVariable(value="id") Integer id){ //調用service層方法 System.out.println(id); return SUCCESS; } @RequestMapping(value="/putOrderById/{id}",method=RequestMethod.PUT) @ResponseBody public String putOrderById(@PathVariable(value="id") Integer id){ //調用service層方法 System.out.println(id); return SUCCESS; } @RequestMapping(value="/deleteOrderById/{id}",method=RequestMethod.DELETE) @ResponseBody public String deleteOrderById(@PathVariable(value="id") Integer id){ //調用service層方法 System.out.println(id); return SUCCESS; }
因為在tomcat8.0中不支持PUT和DELETE方法,[email protected],否則405錯誤
[email protected]
@RequestMapping(value="/testRequestParam",method=RequestMethod.POST) public String testRequestParam(@RequestParam(value="username") String name,@RequestParam(value="password",required=false,defaultValue="123456789") String password){ System.out.println(name+"---"+password); return SUCCESS; }
在jsp頁面
<form action="${pageContext.request.contextPath }/testRequestParam" method="post"> Username:<input type="text" name="username"/> Password:<input type="password" name="password"/> <input type="submit" value="Submit"/> </form>
@RequestParam可以從jsp頁面獲取參數
– value:參數名,與請求參數的name屬性值一致 – required:是否必須輸入值,默認為 true, 表示請求參數中必須包含對應的參數,若不存在,將拋出異常 – defaultVault:不傳值時的默認值,傳值後將不再顯示默認值 5.POST請求亂碼問題 上個例子如果輸入中文的話,會出現亂碼問題 所以需要在web.xml文件中配置<filter><!-- 解決中文亂碼問題 --> <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>
SpringMVC--從基礎到...