日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用 Spring 2.5 基于注解驱动的 Spring MVC--转

發布時間:2025/4/5 javascript 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Spring 2.5 基于注解驱动的 Spring MVC--转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

繼 Spring 2.0 對 Spring MVC 進行重大升級后,Spring 2.5 又為 Spring MVC 引入了注解驅動功能。現在你無須讓 Controller 繼承任何接口,無需在 XML 配置文件中定義請求和 Controller 的映射關系,僅僅使用注解就可以讓一個 POJO 具有 Controller 的絕大部分功能 —— Spring MVC 框架的易用性得到了進一步的增強.在框架靈活性、易用性和擴展性上,Spring MVC 已經全面超越了其它的 MVC 框架,伴隨著 Spring 一路高唱猛進,可以預見 Spring MVC 在 MVC 市場上的吸引力將越來越不可抗拒。

本文將介紹 Spring 2.5 新增的 Sping MVC 注解功能,講述如何使用注解配置替換傳統的基于 XML 的 Spring MVC 配置。

一個簡單的基于注解的 Controller

使用過低版本 Spring MVC 的讀者都知道:當創建一個 Controller 時,我們需要直接或間接地實現 org.springframework.web.servlet.mvc.Controller 接口。一般情況下,我們是通過繼承 SimpleFormController 或 MultiActionController 來定義自己的 Controller 的。在定義 Controller 后,一個重要的事件是在 Spring MVC 的配置文件中通過 HandlerMapping 定義請求和控制器的映射關系,以便將兩者關聯起來。

來看一下基于注解的 Controller 是如何定義做到這一點的,下面是使用注解的 BbtForumController:

清單 1. BbtForumController.java
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;import java.util.Collection;@Controller //<——① @RequestMapping("/forum.do") public class BbtForumController {@Autowiredprivate BbtForumService bbtForumService;@RequestMapping //<——②public String listAllBoard() {bbtForumService.getAllBoard();System.out.println("call listAllBoard method.");return "listBoard";} }

從上面代碼中,我們可以看出 BbtForumController 和一般的類并沒有區別,它沒有實現任何特殊的接口,因而是一個地道的 POJO。讓這個 POJO 與眾不同的魔棒就是 Spring MVC 的注解!

在 ① 處使用了兩個注解,分別是 @Controller 和 @RequestMapping。在“使用 Spring 2.5 基于注解驅動的 IoC”這篇文章里,筆者曾經指出過 @Controller、@Service 以及 @Repository 和 @Component 注解的作用是等價的:將一個類成為 Spring 容器的 Bean。由于 Spring MVC 的 Controller 必須事先是一個 Bean,所以 @Controller 注解是不可缺少的。

真正讓 BbtForumController 具備 Spring MVC Controller 功能的是 @RequestMapping 這個注解。@RequestMapping 可以標注在類定義處,將 Controller 和特定請求關聯起來;還可以標注在方法簽名處,以便進一步對請求進行分流。在 ① 處,我們讓 BbtForumController 關聯“/forum.do”的請求,而 ② 處,我們具體地指定 listAllBoard() 方法來處理請求。所以在類聲明處標注的 @RequestMapping 相當于讓 POJO 實現了 Controller 接口,而在方法定義處的 @RequestMapping 相當于讓 POJO 擴展 Spring 預定義的 Controller(如 SimpleFormController 等)。

為了讓基于注解的 Spring MVC 真正工作起來,需要在 Spring MVC 對應的 xxx-servlet.xml 配置文件中做一些手腳。在此之前,還是先來看一下 web.xml 的配置吧:

清單 2. web.xml:啟用 Spring 容器和 Spring MVC 框架
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><display-name>Spring Annotation MVC Sample</display-name><!-- Spring 服務層的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- Spring 容器啟動監聽器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring MVC 的Servlet,它將加載WEB-INF/annomvc-servlet.xml 的配置文件,以啟動Spring MVC模塊--><servlet><servlet-name>annomvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>annomvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping> </web-app>

web.xml 中定義了一個名為 annomvc 的 Spring MVC 模塊,按照 Spring MVC 的契約,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定義 Spring MVC 模塊的具體配置。annomvc-servlet.xml 的配置內容如下所示:

清單 3. annomvc-servlet.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"><!-- ①:對web包中的所有類進行掃描,以完成Bean創建和自動依賴注入的功能 --><context:component-scan base-package="com.baobaotao.web"/><!-- ②:啟動Spring MVC的注解功能,完成請求和注解POJO的映射 --><bean class="org.springframework.web.servlet.mvc.annotation. AnnotationMethodHandlerAdapter"/><!-- ③:對模型視圖名稱的解析,即在模型視圖名稱添加前后綴 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> </beans>

因為 Spring 所有功能都在 Bean 的基礎上演化而來,所以必須事先將 Controller 變成 Bean,這是通過在類中標注 @Controller 并在 annomvc-servlet.xml 中啟用組件掃描機制來完成的,如 ① 所示。

在 ② 處,配置了一個 AnnotationMethodHandlerAdapter,它負責根據 Bean 中的 Spring MVC 注解對 Bean 進行加工處理,使這些 Bean 變成控制器并映射特定的 URL 請求。

而 ③ 處的工作是定義模型視圖名稱的解析規則,這里我們使用了 Spring 2.5 的特殊命名空間,即 p 命名空間,它將原先需要通過 <property> 元素配置的內容轉化為 <bean> 屬性配置,在一定程度上簡化了 <bean> 的配置。

啟動 Tomcat,發送 http://localhost/forum.do URL 請求,BbtForumController 的 listAllBoard() 方法將響應這個請求,并轉向 WEB-INF/jsp/listBoard.jsp 的視圖頁面。

讓一個 Controller 處理多個 URL 請求

在低版本的 Spring MVC 中,我們可以通過繼承 MultiActionController 讓一個 Controller 處理多個 URL 請求。使用 @RequestMapping 注解后,這個功能更加容易實現了。請看下面的代碼:

清單 3. 每個請求處理參數對應一個 URL
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller public class BbtForumController {@Autowiredprivate BbtForumService bbtForumService;@RequestMapping("/listAllBoard.do") // <—— ①public String listAllBoard() {bbtForumService.getAllBoard();System.out.println("call listAllBoard method.");return "listBoard";}@RequestMapping("/listBoardTopic.do") // <—— ②public String listBoardTopic(int topicId) {bbtForumService.getBoardTopics(topicId);System.out.println("call listBoardTopic method.");return "listTopic";} }

在這里,我們分別在 ① 和 ② 處為 listAllBoard() 和 listBoardTopic() 方法標注了 @RequestMapping 注解,分別指定這兩個方法處理的 URL 請求,這相當于將 BbtForumController 改造為 MultiActionController。這樣 /listAllBoard.do 的 URL 請求將由 listAllBoard() 負責處理,而 /listBoardTopic.do?topicId=1 的 URL 請求則由 listBoardTopic() 方法處理。

對于處理多個 URL 請求的 Controller 來說,我們傾向于通過一個 URL 參數指定 Controller 處理方法的名稱(如 method=listAllBoard),而非直接通過不同的 URL 指定 Controller 的處理方法。使用 @RequestMapping 注解很容易實現這個常用的需求。來看下面的代碼:

清單 4. 一個 Controller 對應一個 URL,由請求參數決定請求處理方法
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller @RequestMapping("/bbtForum.do") // <—— ① 指定控制器對應URL請求 public class BbtForumController {@Autowiredprivate BbtForumService bbtForumService;// <—— ② 如果URL請求中包括"method=listAllBoard"的參數,由本方法進行處理@RequestMapping(params = "method=listAllBoard") public String listAllBoard() {bbtForumService.getAllBoard();System.out.println("call listAllBoard method.");return "listBoard";}// <—— ③ 如果URL請求中包括"method=listBoardTopic"的參數,由本方法進行處理@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(int topicId) {bbtForumService.getBoardTopics(topicId);System.out.println("call listBoardTopic method.");return "listTopic";} }

在類定義處標注的 @RequestMapping 讓 BbtForumController 處理所有包含 /bbtForum.do 的 URL 請求,而 BbtForumController 中的請求處理方法對 URL 請求的分流規則在 ② 和 ③ 處定義分流規則按照 URL 的 method 請求參數確定。所以分別在類定義處和方法定義處使用 @RequestMapping 注解,就可以很容易通過 URL 參數指定 Controller 的處理方法了。

@RequestMapping 注解中除了 params 屬性外,還有一個常用的屬性是 method,它可以讓 Controller 方法處理特定 HTTP 請求方式的請求,如讓一個方法處理 HTTP GET 請求,而另一個方法處理 HTTP POST 請求,如下所示:

清單 4. 讓請求處理方法處理特定的 HTTP 請求方法
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;@Controller @RequestMapping("/bbtForum.do") public class BbtForumController {@RequestMapping(params = "method=createTopic",method = RequestMethod.POST)public String createTopic(){System.out.println("call createTopic method.");return "createTopic";} }

這樣只有當 /bbtForum.do?method=createTopic 請求以 HTTP POST 方式提交時,createTopic() 方法才會進行處理。

處理方法入參如何綁定 URL 參數

按契約綁定

Controller 的方法標注了 @RequestMapping 注解后,它就能處理特定的 URL 請求。我們不禁要問:請求處理方法入參是如何綁定 URL 參數的呢?在回答這個問題之前先來看下面的代碼:

清單 5. 按參數名匹配進行綁定
@RequestMapping(params = "method=listBoardTopic")//<—— ① topicId入參是如何綁定URL請求參數的?public String listBoardTopic(int topicId) { bbtForumService.getBoardTopics(topicId);System.out.println("call listBoardTopic method.");return "listTopic";}

當我們發送 http://localhost//bbtForum.do?method=listBoardTopic&topicId=10 的 URL 請求時,Spring 不但讓 listBoardTopic() 方法處理這個請求,而且還將 topicId 請求參數在類型轉換后綁定到 listBoardTopic() 方法的 topicId 入參上。而 listBoardTopic() 方法的返回類型是 String,它將被解析為邏輯視圖的名稱。也就是說 Spring 在如何給處理方法入參自動賦值以及如何將處理方法返回值轉化為 ModelAndView 中的過程中存在一套潛在的規則,不熟悉這個規則就不可能很好地開發基于注解的請求處理方法,因此了解這個潛在規則無疑成為理解 Spring MVC 框架基于注解功能的核心問題。

我們不妨從最常見的開始說起:請求處理方法入參的類型可以是 Java 基本數據類型或 String 類型,這時方法入參按參數名匹配的原則綁定到 URL 請求參數,同時還自動完成 String 類型的 URL 請求參數到請求處理方法參數類型的轉換。下面給出幾個例子:

  • listBoardTopic(int topicId):和 topicId URL 請求參數綁定;
  • listBoardTopic(int topicId,String boardName):分別和 topicId、boardName URL 請求參數綁定;

?

特別的,如果入參是基本數據類型(如 int、long、float 等),URL 請求參數中一定要有對應的參數,否則將拋出 TypeMismatchException 異常,提示無法將 null 轉換為基本數據類型。

另外,請求處理方法的入參也可以一個 JavaBean,如下面的 User 對象就可以作為一個入參:

清單 6. User.java:一個 JavaBean
package com.baobaotao.web;public class User {private int userId;private String userName;//省略get/setter方法public String toString(){return this.userName +","+this.userId;} }

下面是將 User 作為 listBoardTopic() 請求處理方法的入參:

清單 7. 使用 JavaBean 作為請求處理方法的入參
@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(int topicId,User user) {bbtForumService.getBoardTopics(topicId);System.out.println("topicId:"+topicId);System.out.println("user:"+user);System.out.println("call listBoardTopic method.");return "listTopic";}

這時,如果我們使用以下的 URL 請求:http://localhost/bbtForum.do?method=listBoardTopic&topicId=1&userId=10&userName=tom

topicId URL 參數將綁定到 topicId 入參上,而 userId 和 userName URL 參數將綁定到 user 對象的 userId 和 userName 屬性中。和 URL 請求中不允許沒有 topicId 參數不同,雖然 User 的 userId 屬性的類型是基本數據類型,但如果 URL 中不存在 userId 參數,Spring 也不會報錯,此時 user.userId 值為 0。如果 User 對象擁有一個 dept.deptId 的級聯屬性,那么它將和 dept.deptId URL 參數綁定。

通過注解指定綁定的 URL 參數

如果我們想改變這種默認的按名稱匹配的策略,比如讓 listBoardTopic(int topicId,User user) 中的 topicId 綁定到 id 這個 URL 參數,那么可以通過對入參使用 @RequestParam 注解來達到目的:

清單 8. 通過 @RequestParam 注解指定
package com.baobaotao.web;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;…@Controller @RequestMapping("/bbtForum.do") public class BbtForumController {@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(@RequestParam("id") int topicId,User user) {bbtForumService.getBoardTopics(topicId);System.out.println("topicId:"+topicId);System.out.println("user:"+user);System.out.println("call listBoardTopic method.");return "listTopic";} … }

這里,對 listBoardTopic() 請求處理方法的 topicId 入參標注了 @RequestParam("id") 注解,所以它將和 id 的 URL 參數綁定。

綁定模型對象中某個屬性

Spring 2.0 定義了一個 org.springframework.ui.ModelMap 類,它作為通用的模型數據承載對象,傳遞數據供視圖所用。我們可以在請求處理方法中聲明一個 ModelMap 類型的入參,Spring 會將本次請求模型對象引用通過該入參傳遞進來,這樣就可以在請求處理方法內部訪問模型對象了。來看下面的例子:

清單 9. 使用 ModelMap 訪問請示對應的隱含模型對象
@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(@RequestParam("id")int topicId,User user,ModelMap model) {bbtForumService.getBoardTopics(topicId);System.out.println("topicId:" + topicId);System.out.println("user:" + user);//① 將user對象以currUser為鍵放入到model中model.addAttribute("currUser",user); return "listTopic";}

對于當次請求所對應的模型對象來說,其所有屬性都將存放到 request 的屬性列表中。象上面的例子,ModelMap 中的 currUser 屬性將放到 request 的屬性列表中,所以可以在 JSP 視圖頁面中通過 request.getAttribute(“currUser”) 或者通過 ${currUser} EL 表達式訪問模型對象中的 user 對象。從這個角度上看, ModelMap 相當于是一個向 request 屬性列表中添加對象的一條管道,借由 ModelMap 對象的支持,我們可以在一個不依賴 Servlet API 的 Controller 中向 request 中添加屬性。

在默認情況下,ModelMap 中的屬性作用域是 request 級別是,也就是說,當本次請求結束后,ModelMap 中的屬性將銷毀。如果希望在多個請求中共享 ModelMap 中的屬性,必須將其屬性轉存到 session 中,這樣 ModelMap 的屬性才可以被跨請求訪問。

Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。這一功能是通過類定義處標注 @SessionAttributes 注解來實現的。請看下面的代碼:

清單 10. 使模型對象的特定屬性具有 Session 范圍的作用域
package com.baobaotao.web;… import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.SessionAttributes;@Controller @RequestMapping("/bbtForum.do") @SessionAttributes("currUser") //①將ModelMap中屬性名為currUser的屬性 //放到Session屬性列表中,以便這個屬性可以跨請求訪問 public class BbtForumController { …@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(@RequestParam("id")int topicId, User user, ModelMap model) {bbtForumService.getBoardTopics(topicId);System.out.println("topicId:" + topicId);System.out.println("user:" + user);model.addAttribute("currUser",user); //②向ModelMap中添加一個屬性return "listTopic";}}

我們在 ② 處添加了一個 ModelMap 屬性,其屬性名為 currUser,而 ① 處通過 @SessionAttributes 注解將 ModelMap 中名為 currUser 的屬性放置到 Session 中,所以我們不但可以在 listBoardTopic() 請求所對應的 JSP 視圖頁面中通過 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 獲取 user 對象,還可以在下一個請求所對應的 JSP 視圖頁面中通過 session.getAttribute(“currUser”) 或 ModelMap#get(“currUser”) 訪問到這個屬性。

這里我們僅將一個 ModelMap 的屬性放入 Session 中,其實 @SessionAttributes 允許指定多個屬性。你可以通過字符串數組的方式指定多個屬性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 還可以通過屬性類型指定要 session 化的 ModelMap 屬性,如 @SessionAttributes(types = User.class),當然也可以指定多個類,如 @SessionAttributes(types = {User.class,Dept.class}),還可以聯合使用屬性名和屬性類型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。

上面講述了如何往ModelMap中放置屬性以及如何使ModelMap中的屬性擁有Session域的作用范圍。除了在JSP視圖頁面中通過傳統的方法訪問ModelMap中的屬性外,讀者朋友可能會問:是否可以將ModelMap中的屬性綁定到請求處理方法的入參中呢?答案是肯定的。Spring為此提供了一個@ModelAttribute的注解,下面是使用@ModelAttribute注解的例子:

清單 11. 使模型對象的特定屬性具有 Session 范圍的作用域
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.annotation.ModelAttribute;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession;@Controller @RequestMapping("/bbtForum.do") @SessionAttributes("currUser") //①讓ModelMap的currUser屬性擁有session級作用域 public class BbtForumController {@Autowired private BbtForumService bbtForumService;@RequestMapping(params = "method=listBoardTopic")public String listBoardTopic(@RequestParam("id")int topicId, User user, ModelMap model) {bbtForumService.getBoardTopics(topicId);System.out.println("topicId:" + topicId);System.out.println("user:" + user);model.addAttribute("currUser",user); //②向ModelMap中添加一個屬性return "listTopic";}@RequestMapping(params = "method=listAllBoard")//③將ModelMap中的 public String listAllBoard(@ModelAttribute("currUser") User user) { //currUser屬性綁定到user入參中。bbtForumService.getAllBoard();System.out.println("user:"+user);return "listBoard";} }

在 ② 處,我們向 ModelMap 中添加一個名為 currUser 的屬性,而 ① 外的注解使這個 currUser 屬性擁有了 session 級的作用域。所以,我們可以在 ③ 處通過 @ModelAttribute 注解將 ModelMap 中的 currUser 屬性綁定以請求處理方法的 user 入參中。

所以當我們先調用以下 URL 請求: http://localhost/bbtForum.do?method=listBoardTopic&id=1&userName=tom&dept.deptId=12

以執行listBoardTopic()請求處理方法,然后再訪問以下URL: http://localhost/sample/bbtForum.do?method=listAllBoard

你將可以看到 listAllBoard() 的 user 入參已經成功綁定到 listBoardTopic() 中注冊的 session 級的 currUser 屬性上了。

請求處理方法的簽名規約

方法入參

我們知道標注了 @RequestMapping 注解的 Controller 方法就成為了請求處理方法,Spring MVC 允許極其靈活的請求處理方法簽名方式。對于方法入參來說,它允許多種類型的入參,通過下表進行說明:

請求處理方法入參的可選類型說明
Java 基本數據類型和 String默認情況下將按名稱匹配的方式綁定到 URL 參數上,可以通過 @RequestParam 注解改變默認的綁定規則
request/response/session既可以是 Servlet API 的也可以是 Portlet API 對應的對象,Spring 會將它們綁定到 Servlet 和 Portlet 容器的相應對象上
org.springframework.web.context.request.WebRequest內部包含了 request 對象
java.util.Locale綁定到 request 對應的 Locale 對象上
java.io.InputStream/java.io.Reader可以借此訪問 request 的內容
java.io.OutputStream / java.io.Writer可以借此操作 response 的內容
任何標注了 @RequestParam 注解的入參被標注 @RequestParam 注解的入參將綁定到特定的 request 參數上。
java.util.Map / org.springframework.ui.ModelMap它綁定 Spring MVC 框架中每個請求所創建的潛在的模型對象,它們可以被 Web 視圖對象訪問(如 JSP)
命令/表單對象(注:一般稱綁定使用 HTTP GET 發送的 URL 參數的對象為命令對象,而稱綁定使用 HTTP POST 發送的 URL 參數的對象為表單對象)它們的屬性將以名稱匹配的規則綁定到 URL 參數上,同時完成類型的轉換。而類型轉換的規則可以通過 @InitBinder 注解或通過 HandlerAdapter 的配置進行調整
org.springframework.validation.Errors / org.springframework.validation.BindingResult為屬性列表中的命令/表單對象的校驗結果,注意檢驗結果參數必須緊跟在命令/表單對象的后面
rg.springframework.web.bind.support.SessionStatus可以通過該類型 status 對象顯式結束表單的處理,這相當于觸發 session 清除其中的通過 @SessionAttributes 定義的屬性

Spring MVC 框架的易用之處在于,你可以按任意順序定義請求處理方法的入參(除了 Errors 和 BindingResult 必須緊跟在命令對象/表單參數后面以外),Spring MVC 會根據反射機制自動將對應的對象通過入參傳遞給請求處理方法。這種機制讓開發者完全可以不依賴 Servlet API 開發控制層的程序,當請求處理方法需要特定的對象時,僅僅需要在參數列表中聲明入參即可,不需要考慮如何獲取這些對象,Spring MVC 框架就象一個大管家一樣“不辭辛苦”地為我們準備好了所需的一切。下面演示一下使用 SessionStatus 的例子:

清單 12. 使用 SessionStatus 控制 Session 級別的模型屬性
@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute Owner owner, BindingResult result, SessionStatus status) {//<——①new OwnerValidator().validate(owner, result);if (result.hasErrors()) {return "ownerForm";}else {this.clinic.storeOwner(owner);status.setComplete();//<——②return "redirect:owner.do?ownerId=" + owner.getId();} }

processSubmit() 方法中的 owner 表單對象將綁定到 ModelMap 的“owner”屬性中,result 參數用于存放檢驗 owner 結果的對象,而 status 用于控制表單處理的狀態。在 ② 處,我們通過調用 status.setComplete() 方法,該 Controller 所有放在 session 級別的模型屬性數據將從 session 中清空。

方法返回參數

在低版本的 Spring MVC 中,請求處理方法的返回值類型都必須是 ModelAndView。而在 Spring 2.5 中,你擁有多種靈活的選擇。通過下表進行說明:

請求處理方法入參的可選類型說明
void

此時邏輯視圖名由請求處理方法對應的 URL 確定,如以下的方法:

@RequestMapping("/welcome.do") public void welcomeHandler() { }

對應的邏輯視圖名為“welcome”

String

此時邏輯視圖名為返回的字符,如以下的方法:

@RequestMapping(method = RequestMethod.GET) public String setupForm(@RequestParam("ownerId") int ownerId, ModelMap model) {Owner owner = this.clinic.loadOwner(ownerId);model.addAttribute(owner);return "ownerForm"; }

對應的邏輯視圖名為“ownerForm”

org.springframework.ui.ModelMap

和返回類型為 void 一樣,邏輯視圖名取決于對應請求的 URL,如下面的例子:

@RequestMapping("/vets.do") public ModelMap vetsHandler() {return new ModelMap(this.clinic.getVets()); }

對應的邏輯視圖名為“vets”,返回的 ModelMap 將被作為請求對應的模型對象,可以在 JSP 視圖頁面中訪問到。

ModelAndView當然還可以是傳統的 ModelAndView。

應該說使用 String 作為請求處理方法的返回值類型是比較通用的方法,這樣返回的邏輯視圖名不會和請求 URL 綁定,具有很大的靈活性,而模型數據又可以通過 ModelMap 控制。當然直接使用傳統的 ModelAndView 也不失為一個好的選擇。

注冊自己的屬性編輯器

Spring MVC 有一套常用的屬性編輯器,這包括基本數據類型及其包裹類的屬性編輯器、String 屬性編輯器、JavaBean 的屬性編輯器等。但有時我們還需要向 Spring MVC 框架注冊一些自定義的屬性編輯器,如特定時間格式的屬性編輯器就是其中一例。

Spring MVC 允許向整個 Spring 框架注冊屬性編輯器,它們對所有 Controller 都有影響。當然 Spring MVC 也允許僅向某個 Controller 注冊屬性編輯器,對其它的 Controller 沒有影響。前者可以通過 AnnotationMethodHandlerAdapter 的配置做到,而后者則可以通過 @InitBinder 注解實現。

下面先看向整個 Spring MVC 框架注冊的自定義編輯器:

清單 13. 注冊框架級的自定義屬性編輯器
>bean class="org.springframework.web.servlet.mvc.annotation. AnnotationMethodHandlerAdapter"<>property name="webBindingInitializer"<>bean class="com.baobaotao.web.MyBindingInitializer"/<>/property< >/bean<

MyBindingInitializer 實現了 WebBindingInitializer 接口,在接口方法中通過 binder 注冊多個自定義的屬性編輯器,其代碼如下所示:

清單 14.自定義屬性編輯器
package org.springframework.samples.petclinic.web;import java.text.SimpleDateFormat; import java.util.Date;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.samples.petclinic.Clinic; import org.springframework.samples.petclinic.PetType; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.context.request.WebRequest;public class MyBindingInitializer implements WebBindingInitializer {public void initBinder(WebDataBinder binder, WebRequest request) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");dateFormat.setLenient(false);binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));} }

如果希望某個屬性編輯器僅作用于特定的 Controller,可以在 Controller 中定義一個標注 @InitBinder 注解的方法,可以在該方法中向 Controller 了注冊若干個屬性編輯器,來看下面的代碼:

清單 15. 注冊 Controller 級的自定義屬性編輯器
@Controller public class MyFormController {@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");dateFormat.setLenient(false);binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));}… }

注意被標注 @InitBinder 注解的方法必須擁有一個 WebDataBinder 類型的入參,以便 Spring MVC 框架將注冊屬性編輯器的 WebDataBinder 對象傳遞進來。

如何準備數據

在編寫 Controller 時,常常需要在真正進入請求處理方法前準備一些數據,以便請求處理或視圖渲染時使用。在傳統的 SimpleFormController 里,是通過復寫其 referenceData() 方法來準備引用數據的。在 Spring 2.5 時,可以將任何一個擁有返回值的方法標注上 @ModelAttribute,使其返回值將會進入到模型對象的屬性列表中。來看下面的例子:

清單 16. 定義為處理請求準備數據的方法
package com.baobaotao.web;import com.baobaotao.service.BbtForumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.SessionAttributes;import java.util.ArrayList; import java.util.List; import java.util.Set;@Controller @RequestMapping("/bbtForum.do") public class BbtForumController {@Autowiredprivate BbtForumService bbtForumService;@ModelAttribute("items")//<——①向模型對象中添加一個名為items的屬性public List<String> populateItems() {List<String> lists = new ArrayList<String>();lists.add("item1");lists.add("item2");return lists;}@RequestMapping(params = "method=listAllBoard")public String listAllBoard(@ModelAttribute("currUser")User user, ModelMap model) {bbtForumService.getAllBoard();//<——②在此訪問模型中的items屬性System.out.println("model.items:" + ((List<String>)model.get("items")).size());return "listBoard";} }

在 ① 處,通過使用 @ModelAttribute 注解,populateItem() 方法將在任何請求處理方法執行前調用,Spring MVC 會將該方法返回值以“items”為名放入到隱含的模型對象屬性列表中。

所以在 ② 處,我們就可以通過 ModelMap 入參訪問到 items 屬性,當執行 listAllBoard() 請求處理方法時,② 處將在控制臺打印出“model.items:2”的信息。當然我們也可以在請求的視圖中訪問到模型對象中的 items 屬性。

小結

Spring 2.5 對 Spring MVC 進行了很大增強,現在我們幾乎完全可以使用基于注解的 Spring MVC 完全替換掉原來基于接口 Spring MVC 程序。基于注解的 Spring MVC 比之于基于接口的 Spring MVC 擁有以下幾點好處:

  • 方便請求和控制器的映射;
  • 方便請求處理方法入參綁定URL參數;
  • Controller 不必繼承任何接口,它僅是一個簡單的 POJO。

但是基于注解的 Spring MVC 并不完美,還存在優化的空間,因為在某些配置上它比基于 XML 的配置更繁瑣。比如對于處理多個請求的 Controller 來說,假設我們使用一個 URL 參數指定調用的處理方法(如 xxx.do?method=listBoardTopic),當使用注解時,每個請求處理方法都必須使用 @RequestMapping() 注解指定對應的 URL 參數(如 @RequestMapping(params = "method=listBoardTopic")),而在 XML 配置中我們僅需要配置一個 ParameterMethodNameResolver 就可以了。

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/

轉載于:https://www.cnblogs.com/davidwang456/p/3966555.html

總結

以上是生活随笔為你收集整理的使用 Spring 2.5 基于注解驱动的 Spring MVC--转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久精品成人热国产成 | 四虎成人网 | 99高清视频有精品视频 | 99久久婷婷国产综合精品 | 一区中文字幕在线观看 | 成人小视频在线 | 成人久久影院 | 午夜久久久久久久 | 国产精品一区二区三区免费看 | 亚洲成人av在线 | 青青草在久久免费久久免费 | 99久久久久成人国产免费 | 国产精品久久视频 | 国产对白av | 在线日韩| 久久不卡国产精品一区二区 | 亚洲香蕉在线观看 | 欧美一区二区三区在线播放 | 999久久久久久久久6666 | 成人性生交大片免费看中文网站 | 综合网五月天 | 国产成人黄色 | 日韩黄色大片在线观看 | 精品国产免费av | 天天爱天天操 | 欧美成a人片在线观看久 | 欧美做受高潮1 | 国产日韩精品一区二区 | 久久午夜免费视频 | 亚洲日韩中文字幕 | 日韩中文字 | 夜色资源站wwwcom | 成人免费 在线播放 | 91亚洲精品国偷拍自产在线观看 | 亚洲成人中文在线 | 成人黄色在线观看视频 | 精品久久久久久亚洲综合网站 | 狠狠色噜噜狠狠狠狠 | www.黄色网.com| 男女视频91| 国产精品区免费视频 | 国产三级久久久 | 精品国产成人av在线免 | 久久久国产一区 | 国内精品久久天天躁人人爽 | 国产超碰97 | 色综合久久久久综合 | 亚洲精品国偷拍自产在线观看蜜桃 | 精品久久久一区二区 | 成年人黄色免费看 | 91天堂影院 | 久久只精品99品免费久23小说 | 在线电影中文字幕 | 91网在线看 | 久久人人爽人人片 | 日韩欧美一区二区三区免费观看 | 狠狠狠狠狠狠干 | 国产精品69久久久久 | 亚洲精品毛片一级91精品 | 精品影院一区二区久久久 | 国产免费国产 | 日韩欧美高清视频在线观看 | 美女免费视频网站 | 国产精品情侣视频 | 亚洲精品资源在线观看 | 亚洲精品久久久久999中文字幕 | 久久免费视频3 | 精品主播网红福利资源观看 | 五月婷婷视频在线 | 中文字幕一区二区三区四区久久 | 成年人黄色在线观看 | 国产成人av在线影院 | 超碰97免费在线 | 中文字幕在线观看一区 | 最新一区二区三区 | 美女福利视频在线 | 在线看小早川怜子av | 日韩欧美高清免费 | 日韩成人不卡 | 99久久精品国| 国产精品美女久久久久久2018 | 久久福利小视频 | 日韩视 | 亚洲一区二区天堂 | 久久精品一级片 | 久久久久久久久久久网 | 天天色天天操天天爽 | 在线不卡中文字幕播放 | 久久久久久久久精 | 久久字幕精品一区 | 黄网站色视频免费观看 | 又长又大又黑又粗欧美 | 99国产精品视频免费观看一公开 | 日韩在线观看小视频 | 啪啪免费观看网站 | 激情欧美在线观看 | 日韩欧美一区视频 | 色婷婷 亚洲 | 天天操·夜夜操 | 免费亚洲黄色 | 国产黄色一级片在线 | av成人在线观看 | 亚洲精品久久久久中文字幕m男 | 69久久99精品久久久久婷婷 | 色婷婷www | 黄色av观看 | 国产免费久久av | 欧美日韩中| 色综合天天视频在线观看 | 国产精品视频久久 | 午夜影院一级 | 国产少妇在线观看 | 韩国av一区二区三区在线观看 | 久草网在线视频 | 四季av综合网站 | 超碰夜夜 | 久久久久久久久久伊人 | www.天天综合 | 在线涩涩| 天天干天天操天天干 | 日韩在线观看 | 九草视频在线观看 | 伊人热 | 不卡av免费在线观看 | 日韩午夜视频在线观看 | 亚洲精品乱码久久久久v最新版 | 国产精品一区二区三区在线播放 | 日韩av一区二区在线播放 | 在线看成人 | 免费看成人片 | 久久视频这里只有精品 | 色播五月激情五月 | 欧美影院久久 | 五月婷婷在线视频观看 | 久久艹精品 | 91污污视频在线观看 | 精品一区二区三区久久 | 国产在线精品国自产拍影院 | 一区 在线 影院 | 久久精品国产亚洲精品2020 | 黄色小网站免费看 | 日一日干一干 | 涩涩资源网 | 成年人视频在线免费观看 | 久操中文字幕在线观看 | 一区二区三区在线电影 | 亚洲黄色a| 国产精品久久网站 | 人人澡澡人人 | 亚洲精品国产精品国自产在线 | 午夜在线观看 | 黄色片免费电影 | 毛片一区二区 | 午夜精品一区二区三区在线观看 | 国产成人中文字幕 | 国产日韩欧美在线观看视频 | 精品国产精品久久 | 91视频免费播放 | 久久久精品国产免费观看一区二区 | 欧美精品久久久久久久亚洲调教 | 日韩午夜视频在线观看 | 一区二区三区动漫 | 国产精品电影一区 | 69精品在线观看 | 国产一区黄色 | 成人毛片一区 | 激情五月网站 | 天天色综合天天 | 黄色软件视频大全免费下载 | 欧美日韩一区三区 | 久久男人中文字幕资源站 | 国产精品一区二区三区久久 | 亚洲精品免费看 | 午夜av免费在线观看 | 日韩久久精品 | 亚洲综合成人婷婷小说 | 色综合狠狠干 | 亚洲成人频道 | 天天操福利视频 | 亚洲成人高清在线 | 国产一级片观看 | 国产尤物在线视频 | 91av手机在线观看 | 黄色毛片视频免费观看中文 | 91精品日韩 | 久久综合激情 | 开心激情婷婷 | 日韩天堂在线观看 | av 一区 二区 久久 | 欧美一区在线观看视频 | 97超碰人人网 | 国产高清在线免费视频 | 精品亚洲成a人在线观看 | 国产精品夜夜夜一区二区三区尤 | 国产91av视频在线观看 | 久久国产网 | 久久国内视频 | 91在线国产观看 | av免费电影网站 | 久久理伦片 | 国产麻豆视频免费观看 | 中文字幕视频三区 | av免费播放 | 精品福利片 | 99久久99久久免费精品蜜臀 | 国产日韩中文在线 | 亚洲区精品 | 一区二区视频在线观看免费 | 99re国产 | 中文字幕人成乱码在线观看 | 日日日日 | 国产精品成人久久久久久久 | 国产精品久久久久久一区二区 | 91视频免费播放 | 亚洲最新在线视频 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久99精品国产麻豆宅宅 | 国产一级视频在线 | 午夜久久美女 | 久久综合射 | 九七视频在线观看 | 成人av免费| 91丨九色丨丝袜 | 中文字幕一区三区 | www.伊人色.com| zzijzzij亚洲成熟少妇 | 久久久久久久久网站 | 欧美日韩不卡在线观看 | 中文字幕在线观看亚洲 | 国产免费又爽又刺激在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 成人av中文字幕在线观看 | 欧美日韩三级在线观看 | 久久6精品| 天天干天天搞天天射 | 最新国产精品视频 | 狠狠色噜噜狠狠 | 欧美一级淫片videoshd | 国产第一页精品 | 亚洲欧美国产精品va在线观看 | 中文字幕中文字幕 | 国产欧美中文字幕 | 日韩亚洲国产中文字幕 | 国产91电影在线观看 | 日韩精品一区二区三区不卡 | 在线观看深夜福利 | 久久久久久久免费看 | 国产精品成人av久久 | 国产专区在线播放 | 免费看黄色毛片 | 69av在线播放| 九九精品久久 | 久久成人高清视频 | 日韩高清免费无专码区 | 91在线精品秘密一区二区 | 超碰人人乐 | 国产黄a三级三级三级三级三级 | 久久不卡国产精品一区二区 | 在线观看香蕉视频 | 中文字幕日韩免费视频 | 天干啦夜天干天干在线线 | 狠狠色丁香婷婷综合橹88 | 人人澡人摸人人添学生av | 国产福利一区二区三区视频 | 亚洲精品99久久久久中文字幕 | 精品亚洲一区二区 | 黄网站免费看 | 日韩高清不卡一区二区三区 | 免费黄在线观看 | 在线精品视频免费观看 | 国产精品视频区 | 色偷偷网站视频 | 四虎在线免费观看 | 国产一级免费播放 | 国产成人久久精品亚洲 | 久草青青在线观看 | 六月激情久久 | 国产男女无遮挡猛进猛出在线观看 | 免费在线观看中文字幕 | 日本中文在线播放 | 亚洲第一中文字幕 | 日韩久久在线 | 国产不卡在线观看 | 网址你懂的在线观看 | 精品视频不卡 | 国产精品婷婷午夜在线观看 | 成人免费视频网站 | 五月婷婷毛片 | 狠狠色噜噜狠狠狠合久 | 91久久影院| 人人狠 | 天天射天天舔天天干 | 正在播放国产91 | 国产伦精品一区二区三区免费 | 在线观看成人毛片 | 成人精品999 | 狠狠色丁香婷婷综合最新地址 | 日韩av不卡在线播放 | 久久综合婷婷国产二区高清 | 成人免费网站在线观看 | 精品国产乱码久久久久久天美 | 免费看国产黄色 | 久草在线视频资源 | 亚洲午夜大片 | 国产精品久久久999 国产91九色视频 | 成人综合免费 | 黄免费在线观看 | 五月天激情视频 | 91亚洲在线观看 | 久久夜色精品国产欧美乱 | 国产精品完整版 | 日韩有码专区 | 97精品国产97久久久久久粉红 | 激情综合色播五月 | 91精品国产麻豆国产自产影视 | 亚洲精品在线国产 | 97免费在线观看视频 | 亚洲va欧美| 成人免费视频网址 | av在线激情 | 久久污视频 | 狠狠干天天射 | 天天操夜 | 人人舔人人射 | 中文字幕在线看视频国产中文版 | 字幕网av | 久久综合网色—综合色88 | 97视频在线观看播放 | 五月婷婷色综合 | 亚洲国产免费看 | 国产一区成人在线 | www.婷婷色 | av韩国在线| 国产精品九九视频 | 久久成人在线视频 | 久久人人爽爽 | 深爱激情久久 | 久久99国产精品久久99 | 五月婷婷六月综合 | 国产精品成久久久久三级 | 亚洲精品午夜视频 | 日韩精品大片 | 久艹视频免费观看 | 高清不卡一区二区三区 | 日日摸日日添夜夜爽97 | 久久不见久久见免费影院 | 国产精品久久久久久久99 | 东方av免费在线观看 | 日韩在线影视 | 美腿丝袜一区二区三区 | 婷婷精品视频 | 91精品老司机久久一区啪 | 国产精品欧美久久久久天天影视 | 奇米网在线观看 | 97色综合| 最新色站 | 国产精品久久久久久久午夜片 | a级国产乱理伦片在线观看 亚洲3级 | 亚洲精品视频一二三 | 男女免费av | 欧美日韩三区二区 | 亚洲成av人片 | 国内精品视频一区二区三区八戒 | 黄色影院在线观看 | 欧美热久久 | 高清免费在线视频 | 国产一区二区不卡在线 | 最新国产中文字幕 | 国产手机在线 | 懂色av一区二区在线播放 | 91亚洲精品乱码久久久久久蜜桃 | 一区二区三区在线免费播放 | 在线观看国产日韩欧美 | 中文字幕二区在线观看 | 久久婷婷国产色一区二区三区 | 色av男人的天堂免费在线 | 欧美a级成人淫片免费看 | www.五月激情.com | 欧美夫妻生活视频 | 久久综合久久综合九色 | 一区二区三区高清在线 | 色播六月天 | 欧美少妇18p | 在线观看国产福利片 | 探花视频在线版播放免费观看 | 成人av资源在线 | 丁香五婷 | 99热这里只有精品在线观看 | 91看片在线观看 | 男女激情片在线观看 | 精品美女国产在线 | 久久成人麻豆午夜电影 | 国产精品久久久视频 | 免费观看91 | 日韩欧美高清一区二区三区 | 久久久黄色 | 国产丝袜 | 国产精品免费一区二区 | 久久视频这里只有精品 | 最新日韩视频在线观看 | 日本久久久久久久久久久 | 久久久久久久久久免费 | 在线观看国产高清视频 | 亚洲精品国产拍在线 | 亚洲在线成人精品 | 国产精品毛片久久久久久久 | 在线国产中文字幕 | 97在线看| 91资源在线 | 伊人国产视频 | 中文字幕在线视频精品 | 精品亚洲一区二区 | 国产精品九色 | 久久免费视频2 | av黄色免费在线观看 | 国产综合激情 | 国产亚洲精品久久久久久移动网络 | 91九色蝌蚪视频在线 | 欧美国产视频在线 | 日本中文乱码卡一卡二新区 | 日韩一级电影在线 | 国产成人精品久久亚洲高清不卡 | 久久se视频 | 久久国产亚洲精品 | 中文字幕 第二区 | 五月婷激情 | 国产成人精品亚洲 | a视频在线| 亚洲资源| 99色免费视频 | 91色影院| 日本99精品 | 欧美精品久久人人躁人人爽 | 蜜臀av免费一区二区三区 | 中文字幕第一页av | 久久久久女人精品毛片 | 天天操天天玩 | 欧美视频在线观看免费网址 | 免费在线观看日韩 | 欧美日韩网站 | 久久人人97超碰com | 午夜精品久久久久久久久久 | 国产一区二区中文字幕 | www.久草视频 | 久久试看 | 国产成人精品一区二区在线 | 中文字幕乱视频 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产区在线看 | 二区三区视频 | 日韩电影精品一区 | 超碰免费在线公开 | 日韩高清在线观看 | 亚洲午夜精品福利 | 天天做天天爱夜夜爽 | 久久综合色天天久久综合图片 | 欧美巨大荫蒂茸毛毛人妖 | 欧美日韩精品在线一区二区 | 中文在线a√在线 | 欧美电影黄色 | 99久久国产免费免费 | 久久精品香蕉视频 | 91在线视频免费播放 | 国产视频中文字幕在线观看 | 黄色免费网站下载 | 日韩网站在线看片你懂的 | 成人黄色电影免费观看 | 免费看黄在线 | 99久久99久久免费精品蜜臀 | 亚洲精品一区中文字幕乱码 | 九九久久久久久久久激情 | 免费在线黄色av | 久久这里只有精品23 | 国产999视频在线观看 | 色综合久久天天 | 久久久污| 2019中文字幕网站 | 在线小视频你懂得 | 亚洲无在线 | 亚洲视频播放 | 黄色毛片在线看 | av免费在线观看1 | 久久久精品国产一区二区 | 丝袜av一区 | 91视频久久久 | 国产麻豆果冻传媒在线观看 | 日韩精品亚洲专区在线观看 | 欧美午夜理伦三级在线观看 | 日韩69视频 | 亚洲乱码精品久久久久 | 久久久国产精品网站 | 久久久久网站 | 日韩欧美一区视频 | 日韩视频免费 | 日韩欧美国产成人 | 日韩av不卡播放 | 久青草视频 | 干 操 插 | 天天天天射 | 久久久久久国产精品免费 | 成人手机在线视频 | 色在线高清 | 亚洲国产wwwccc36天堂 | 97热视频 | 久久精品精品电影网 | 日韩av资源在线观看 | 亚洲精品99| 日韩av资源在线观看 | 亚洲一二区精品 | 国产一区二区在线免费播放 | 在线观看亚洲视频 | 亚洲成 人精品 | 午夜在线看 | 91精品啪啪 | 精品免费一区二区三区 | 亚洲激情国产精品 | 91成人免费看片 | 日韩欧美高清视频在线观看 | 激情影音先锋 | 探花视频在线观看+在线播放 | 欧美成年网站 | 国产伦精品一区二区三区照片91 | 欧美日韩国产精品一区二区亚洲 | 99一区二区三区 | 国色综合| 一性一交视频 | 九九有精品 | 91爱在线 | 国产精品6999成人免费视频 | 久久久亚洲国产精品麻豆综合天堂 | 日本最新高清不卡中文字幕 | 国产成人精品在线 | 亚洲精品国产第一综合99久久 | 九九激情视频 | 丁香婷婷综合五月 | 色婷婷狠狠五月综合天色拍 | 午夜18视频在线观看 | 亚洲精品成人av在线 | 人人爱人人射 | 国产97视频在线 | 亚洲色图色 | 国产精在线 | 亚洲永久精品一区 | 亚洲自拍偷拍色图 | 色综合天天天天做夜夜夜夜做 | 91av视频观看 | 国产不卡在线观看视频 | 亚洲免费a | 美女网站视频久久 | 全黄色一级片 | 成人综合婷婷国产精品久久免费 | 成人三级网站在线观看 | 最近日本韩国中文字幕 | 免费网站v | 国内精品视频免费 | 久久久久五月天 | 中文字幕乱码在线播放 | 2021国产视频 | a级国产片 | 日色在线视频 | 五月婷婷天堂 | 婷婷色综| 国产高清精品在线 | 欧美另类高潮 | 四虎影视成人永久免费观看亚洲欧美 | 国产婷婷视频在线 | 人人干狠狠干 | 中文字幕在线视频精品 | 国产精品免费一区二区三区在线观看 | 欧美日韩午夜爽爽 | 欧美激情精品一区 | 99热手机在线 | 麻豆视频免费入口 | 一区二区三区在线观看 | 久久精品视频在线 | 91喷水 | 深夜国产福利 | 91片黄在线观 | av不卡网站| 青草草在线 | 日韩精品欧美专区 | 综合色在线观看 | 久久精品视频日本 | 欧美成人免费在线 | 国产黑丝一区二区三区 | 六月久久婷婷 | 精品国产一区二区三区久久久 | 国产精品视频永久免费播放 | 人人爽人人澡人人添人人人人 | 国产成人精品一区二区三区在线 | 日韩精品在线观看视频 | 免费日韩三级 | 久久视频网址 | 日韩1页 | 国产91精品久久久久久 | 狠狠干狠狠操 | 亚洲国产精品99久久久久久久久 | 色停停五月天 | 久久精品欧美一 | 国产精品白浆视频 | 日韩视频三区 | 911香蕉视频 | 成人久久久精品国产乱码一区二区 | 亚洲国产欧洲综合997久久, | 日韩一二三区不卡 | 青青草国产免费 | 午夜精品av| 综合久久网站 | 精品国产123 | 色网站在线免费观看 | 四虎成人免费影院 | 国产精品欧美精品 | 亚洲1级片| 中文字幕在线视频一区 | 又大又硬又黄又爽视频在线观看 | 在线观看你懂的网址 | 亚洲精品成人免费 | 国产老太婆免费交性大片 | 丝袜av网站 | 在线亚洲午夜片av大片 | 国产一区二区三区高清播放 | 天天干天天天 | 婷婷精品国产一区二区三区日韩 | 在线观看日韩一区 | 国产精品美女在线观看 | 99精品欧美一区二区 | 婷婷 综合 色 | 国产理论在线 | 日韩电影在线一区 | 免费99精品国产自在在线 | 热99在线视频 | 日韩欧美视频免费观看 | 国产又粗又硬又长又爽的视频 | 日本乱视频 | 综合色影院 | 国产成人精品一区二区三区网站观看 | 国产福利91精品一区 | 人人爽人人射 | 精品在线一区二区三区 | 久久视频免费 | 成年人视频在线观看免费 | 国产高清久久久久 | 香蕉影视在线观看 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 啪一啪在线 | 亚洲天堂精品视频 | 伊人干综合 | 一区二区亚洲精品 | 三级黄色大片在线观看 | 中文字幕中文字幕在线中文字幕三区 | a电影在线观看 | 在线成人免费av | 久草在线视频在线观看 | 久久精品一区二区三区四区 | 欧美日韩国产一区 | 午夜在线国产 | 在线黄色av| 嫩小bbbb摸bbb摸bbb| 午夜精品福利在线 | 亚洲狠狠操 | 夜夜操网站 | 欧美日韩一区二区三区免费视频 | 亚洲女欲精品久久久久久久18 | 97国产精品免费 | 国产中文字幕精品 | 黄色成年片 | 日韩高清成人 | 亚洲精品国产精品国自产观看浪潮 | 精品久久精品 | 99精品99| 99精品视频免费 | 国产91免费在线 | 精品欧美一区二区在线观看 | 超碰在线97国产 | 国产精品18久久久久久首页狼 | 成人av网站在线观看 | 成人免费视频a | 国产在线va| 久久草草影视免费网 | 亚洲综合网站在线观看 | 日韩精品一区二区久久 | 午夜电影一区 | 国产精品一区在线观看你懂的 | 久久er99热精品一区二区 | 福利视频一二区 | 久久久影院官网 | 在线中文字幕观看 | 久久国产a | 操操操综合| 性色va| 久久精品这里精品 | 中文字幕一区二 | 国产亚洲精品综合一区91 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 亚洲天天干| 天堂av在线中文在线 | 在线欧美中文字幕 | 中文字幕在线播出 | 91成人精品一区在线播放 | 91人网站| 成人免费亚洲 | 一区二区三区影院 | 国产区在线看 | 久久免费视频这里只有精品 | 91tv国产成人福利 | 久久精品视频在线观看 | 日韩高清在线一区 | 91网免费观看 | 一级黄色片毛片 | av三级在线播放 | 欧美日韩精品在线免费观看 | av先锋中文字幕 | 亚洲一区二区三区四区精品 | 色www精品视频在线观看 | 国产精品18久久久久久久久久久久 | 亚洲精品综合一二三区在线观看 | 国产福利午夜 | av三级av | 99精品久久久久久久久久综合 | 欧美性粗大hdvideo | 亚洲天堂va | 超碰在线免费97 | 99久久婷婷国产综合精品 | 男女激情片在线观看 | 国产视频亚洲精品 | 国产又黄又硬又爽 | 日韩精品免费一区二区 | 91麻豆精品国产91久久久无需广告 | 一区二区三区免费在线观看 | 国产视频一区二区三区在线 | 欧美成人精品三级在线观看播放 | 黄在线免费观看 | 久久这里只有精品首页 | 免费看在线看www777 | 视频在线一区二区三区 | 国产精品美女久久久久久免费 | 日韩有码中文字幕在线 | 欧美韩日精品 | 日韩欧美视频二区 | 丝袜av一区| av免费看电影| 在线探花 | 久久久片 | 久久久影院一区二区三区 | 久久综合之合合综合久久 | 一区二区电影在线观看 | 中国老女人日b | 九九久久免费视频 | 欧美色888 | 日本夜夜草视频网站 | 国产不卡网站 | 亚洲精品国产综合99久久夜夜嗨 | 五月婷婷激情五月 | 日韩免费中文 | 久久综合色8888 | 国产99久久九九精品免费 | 91av在线不卡 | 亚洲精品国产成人av在线 | 一区国产精品 | 精品视频9999 | 成人影片在线免费观看 | 91一区二区在线 | 久久视频在线观看 | 精品在线视频播放 | 成人免费xxxxxx视频 | 91在线视频观看免费 | 欧美亚洲国产日韩 | 在线看片视频 | 国产又粗又硬又长又爽的视频 | 日韩在线视频免费观看 | 一级黄色大片 | 免费在线日韩 | av性在线| 久久黄网站 | 在线观看视频色 | 中文字幕免费一区 | 国产又粗又猛又黄视频 | 日韩一级成人av | 久久福利综合 | 黄色www | 国产麻豆电影 | av片子在线观看 | 丁香婷婷激情啪啪 | 欧美激情视频在线免费观看 | 国产精品岛国久久久久久久久红粉 | 一本到视频在线观看 | 国产精品久久精品国产 | 国产精品亚洲综合久久 | 国产精品久久电影观看 | 日韩欧美高清一区二区 | 一区二区精品在线 | 国产中文欧美日韩在线 | av电影在线免费观看 | 中文字幕一区二区三区久久蜜桃 | 婷婷九月激情 | 欧美一级xxxx | 欧美激情h| 久操中文字幕在线观看 | 视频一区视频二区在线观看 | 91精品久久久久久 | 久久精品在线 | 九九国产精品视频 | 久久久久亚洲国产精品 | 亚洲理论片在线观看 | 一级黄色在线免费观看 | 91在线国产观看 | 一级黄色片在线观看 | 99热这里只有精品国产首页 | 国产精品一区二区三区久久久 | 丝袜网站在线观看 | 久久久www | 成人免费在线电影 | 婷色在线 | 草在线视频 | 日本在线免费看 | 99久久婷婷国产一区二区三区 | 国产在线日韩 | 国产成人精品免高潮在线观看 | 亚洲精品美女久久17c | 国产999久久久| 在线看中文字幕 | 人人爽人人av | 超碰大片 | 日韩精品国产一区 | 成人全视频免费观看在线看 | 国产美女精品人人做人人爽 | 日本精品久久久久久 | 日韩黄色中文字幕 | 999国内精品永久免费视频 | 午夜久久成人 | 毛片精品免费在线观看 | 人人干狠狠操 | 黄在线免费看 | 五月婷婷视频 | 免费视频99 | 91精品黄色 | 天天操天天操天天操天天操 | 天天干天天干天天干天天干天天干天天干 | 久久韩国免费视频 | 91视频91自拍 | 91高清一区 | 亚洲视频观看 | 色婷婷综合在线 | 欧美激情视频一区二区三区免费 | 久久久久久久久久久久亚洲 | 久久久久久久久久久久国产精品 | 黄色毛片视频免费观看中文 | 色婷婷激情电影 | 麻豆传媒视频在线播放 | 91精品国产福利在线观看 | 欧美国产一区在线 | 视频三区 | 日本黄色免费播放 | 91精品国产福利在线观看 | 91精品国产99久久久久久久 | 天天激情在线 | 亚洲黄色影院 | 国产免费观看久久黄 | 国产精品69久久久久 | 人人玩人人添人人 | 午夜久久久精品 | 国内精品毛片 | 国产大片黄色 | 日韩高清无线码2023 | www.久久色.com | 中文字幕在线有码 | 天天操天天干天天综合网 | 五月天综合婷婷 | 日韩欧美视频一区二区 | 99综合久久 | 国产精品久久久久一区二区国产 | 久久天 | 91亚洲免费| 日韩电影一区二区在线观看 | 一级欧美黄 | www.黄色片网站 | 亚洲伊人网在线观看 | av综合av| 超碰97在线人人 | 国产一级大片在线观看 | 8x成人在线| 欧美午夜激情网 | 97视频免费看 | 婷婷激情影院 | 国产一级三级 | 999视频精品 | 最近日本字幕mv免费观看在线 | 中文字幕婷婷 | 91麻豆精品国产 | 国产成人精品日本亚洲999 | 中文字幕一区二区三区在线视频 | 日韩欧美一区二区三区黑寡妇 | 婷婷精品视频 | 精品国产乱码一区二 | 国产精品自产拍在线观看桃花 | 日韩av电影中文字幕 | 精品福利网站 | 国产精品1区2区3区在线观看 | www.狠狠色 | 国产精品视频免费 | 亚洲黄色在线观看 | 午夜在线观看影院 | 中文久草 | 日本二区三区在线 | www.五月天 | 91久久人澡人人添人人爽欧美 | 久草精品视频在线观看 | 91视频在线看 | av免费网站在线观看 | 午夜国产一区二区 | 婷婷开心久久网 | 亚洲综合视频在线 | av天天澡天天爽天天av | 婷婷网五月天 | 精品一区二三区 | 中文av不卡 | 亚州精品国产 | 狠狠干天天射 | 成人一区二区在线观看 | 啪啪肉肉污av国网站 | 国产精品久久久999 国产91九色视频 | 日韩中文三级 | 欧美一区二区三区在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美另类xxx | 91一区啪爱嗯打偷拍欧美 | 999久久a精品合区久久久 | a√天堂中文在线 | 久久夜色电影 | 精品国产aⅴ一区二区三区 在线直播av | 成人免费看片98欧美 | 久久久精品国产一区二区三区 | 久久久久久国产精品久久 | 视频在线99 | 亚洲精品在线一区二区三区 | 天天射狠狠干 | 国产明星视频三级a三级点| 久久成人国产精品免费软件 | 精品影院 | 久久久久麻豆v国产 | 免费在线观看国产精品 | 中文字幕资源在线 | 色婷婷在线观看视频 | 成人免费在线电影 | 黄色成人av在线 | 午夜丁香视频在线观看 | 综合影视 | 国产精品久久久久久久久久久久午夜片 | 国产精品成人av在线 | 久久99精品一区二区三区三区 | 91aaa在线观看 | 97人人爽人人 | 国产精品久久久久久久久久直播 | 五月婷婷激情五月 | 成人av在线播放网站 | 一二三区高清 | 国产成人一区三区 | 日日久视频 | 视频一区视频二区在线观看 | 国产视频2| 久久国产精品影视 | 麻豆视频免费入口 | 四虎免费av | 久久久久久国产精品亚洲78 | 免费在线一区二区 | 久久免费a| 国产人成看黄久久久久久久久 | 91看片一区二区三区 | 亚洲精品视频在线免费 | 久久超碰免费 | 欧美精品久久久久久久久免 | 日本中文字幕系列 | 久久免费a | 亚洲 欧洲 国产 精品 | 最近能播放的中文字幕 | 久久网页 | 精品视频在线观看 | 激情视频网页 | 草久久精品 | 四虎影视4hu4虎成人 | 欧美91在线| 免费男女羞羞的视频网站中文字幕 | 欧洲一区二区三区精品 | 久久精视频 | 亚洲成人资源网 | 日韩在线播放欧美字幕 | 欧美资源在线观看 | 国产高清一级 | 一区二区三区www | 亚洲v欧美v国产v在线观看 | 久久色中文字幕 | 国产欧美精品xxxx另类 | 精品国产伦一区二区三区免费 | av免费播放 | 超碰在线天天 | 国产精品永久免费 | 久久一区二区三区四区 | 久久久 精品 |