久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

struts2知識總結

時間:2019-05-12 02:51:46下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《struts2知識總結》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《struts2知識總結》。

第一篇:struts2知識總結

struts2知識總結

1.全局的邏輯控制器為一個過濾器,負責過濾所有的請求。該過濾器引用的API類為

org.apache.struts2.disapatcher.FilterDispatcher

2.MVC:頁面請求(jsp)——>邏輯控制器(Filter)——>業務控制器(Action)——>業務邏輯組件——>業務處理/DAO

3.struts2的配置文件放在classpath下。

4.struts2的類型轉換:

a.繼承DefaultTypeConverter,覆蓋父類的public Object convertValue(Map context, Object value, Class toType)方法

b.繼承StrutsTypeConverter, 覆蓋父類的public Object convertFromString(Map context, String[] values, Class toClass)該方法負責轉換從頁面傳遞過來的數據。

覆蓋父類的public String convertToString(Map context, Object o)

該方法負責將Action中處理好的數據轉換成相應格式的字符串。

5.struts2的數據驗證:

a.使用編碼方式進行驗證。業務控制器Action繼承ActionSupport類,重寫public void validate()方法。

在該方法中進行數據驗證。若Action中處理業務的方法為test,則可以編寫public void validateTest()方法,來對test方法的數據進行驗證。(系統在進行validateTest方法后,會接著執行validate方法,然后

才執行相應的業務代碼。)

若嚴重出錯,則可以調用addFieldError或者調用addActionError方法,增加相應的錯誤提示信息。

b.使用配置xml文件進行驗證。驗證文件的名字為:×××Action-validation.xml。驗證的方式包含字段驗證和非字段驗證。

其中字段驗證表示對某個字段進行某些類型的驗證。非字段驗證表示用某個類型的驗證來驗證,某個字段。兩種方式

底層實現一樣,只是表現方式不同,字段驗證方式比較直觀。

驗證的類型有一下幾種:required,requiredstring,int,date,double,expression,fieldexpression email,url,visitor,conversion,stringLength,regex(正則表達式)。

對驗證類型可以指定shourt-circuit參數為true,來執行短路驗證。

如果Action中執行業務的方法為test,則可以通過編寫×××Action-test-validation.xml方法來對test方法的數據進行 驗證。且執行完test方法的私有驗證文件后,還會執行默認的驗證文件×××Action-test-validation.xml的驗證。

c.struts2進行客戶端的驗證。首先需要使用struts2的標簽庫,且標簽庫的theme屬性不能為simple,然后設置標簽的validate屬性為true。

注意:struts2的客戶端驗證依賴于服務器的驗證配置文件。

6.struts2的攔截器。struts2的攔截器是struts2的核心,其底層實現使用了Java的反射機制與動態代理。在struts2的配置文件中

為一個Action引入了一個攔截器,則配置的默認攔截器不會被調用,需要手工配置到該Action中。

實現struts2攔截器的方法:

a.實現Interceptor接口,并實現init,destrory以及intercept方法。

b.繼承AbstractInterceptor類,覆蓋intercept方法。

c.繼承MethodFilterInterceptor類,覆蓋intercept方法。該類可以對特定的方法進行攔截。

攔截器棧可以包含攔截器和攔截器棧。

7.文件的上傳和下載:

a.使用apache組織開發的commons-fileupload和commons-io包,并且按需要配置fileUpload攔截器和相應的上傳參數,比如上傳文件的類型,上傳文件的大小。多文件的上傳可以使用js代碼來在頁面修改上傳文件的列表,在Action中

則用三個列表分別來保存文件對象(file),文件名(fileName),以及文件類型(fileContentType)。

b.文件下載使用流進行讀取:return ServletActionContext.getServletContext.getResourceAsStream(“文件名”)并將Action的結果返回類設定為stream,即流。按需要配置相應的參數。

8.struts2的國際化。struts2國際化的底層實現用到了Java基礎類庫中的Locale(地區)和ResourceBundle(消息資源)兩個類。

struts2的國際化主要用在一下幾個地方:

a.jsp頁面:使用struts2的標簽時,指定標簽的key屬性(對應消息資源文件中的key)。

使用 標簽取得消息資源信息。

還可以用標簽來指定特定的消息資源文件。

b.Action中:調用getText(key)或者getText(key,args)方法取得消息資源文件中的消息資源。

c.xml驗證文件中:指定message元素的key屬性(對應消息資源文件中的key)。(怎么傳參數?)d.類型轉換過程中:通過查看xwork包的源代碼可以找到:ge.properties文件中可以找到如下的鍵值對:

xwork.default.invalid.fieldvalue=Invalid field value for field “{0}”.在消息資源文件中重新指定該鍵值對即可。

另外在struts.properties中設定鍵值對struts.i18n.encoding=GBK,可以解決中文亂碼問題。

9.struts2的異常處理。在Action中,我們的業務邏輯處理方法都對拋出異常進行了聲明。具體的異常對應具體的處理結果。

在action配置中:

還可以配置全局的異常處理:

struts2的其他東西:

1.對于struts.xml中的package:

a.設置

,則表明該包中沒有action的配置,只定義一個基礎公共的組件。

b.package的namespace可以將不同的請求路徑分隔開,在多人合作項目中用到比較多。當接收到一個請求,若在當前的namespace中沒有相應的請求地址,則會到默認的namespace中去尋找匹配的地址。

2.模型驅動機制(ModelDriven),將一個Action中的各個參數封裝成為一個JavaBean(類似struts1.x中的

ActionForm)。需要實現ModelDriven接口,并實現getModel方法。當一個Action實現ModenDriven接口后,該Action會被ModenDrivenInterceptor攔截,進行相應的參數設置。

3.防止表單的重復提交:在jsp的表單中設置標簽。并且在相應的Action 中設置token攔截器和名為invalid.token的返回結果。相應出錯信息的key為struts.message.invalid.token。

配置該key,來實現國際化。

4.struts2中Action與Servlet容器的耦合。主要有三種方式: a.實現ServletRequestAware或ServletResponseAware接口。并提供對request或者response熟悉的設置方法。

b.使用ActionContext(但不能獲得response對象)。改方法方便單元測試。

c.使用ServletActionContext。ServletActionContext是ActionContext的子類。

首選使用ActionContext,其次ServletActionContext。

5.整合多個struts配置文件,在struts2的配置文件中使用include元素包含其他的配置文件。用于多模塊開發。

6.可以在web.xml中對struts2的核心過濾器FilterDispatcher設置初始化參數(不推薦使用)。

7.動態方法調用(DynamicMethodInvocation).a.action配置中指定:

b.在客戶端即頁面指定:

c.使用通配符:,若Action的url為helloLogin,則調用LoginAction的hello來處理業務。此種方法簡化了配置,但是

使得程序不明了,不提倡使用該方法。

8.struts2的結果類型。在struts2-core包中,有幾種struts2已經配置好的結果類型。

其中默認的類型為dispatcher,此外還有:redirectAction,chain,freemaker,httpheader,redirect, redirectAction,stream,velocity,xslt,plainText。

9.struts2與spring的整合。導入struts2-spring-plugin包,在web.xml中設置spring的監聽器, spring監聽器對應的API類為:org.springframework.web.context.ContextLoaderListener。

struts2-spring-plugin包為我們將struts2的對象工廠設置為spring的IoC容器,其代碼為:

很明顯,將struts.objectFactory定位為org.apache.struts2.spring.StrutsSpringObjectFactory 其余的工作就交給spring的IoC容器去做了。

另外:當我們需要增加spring的配置文件時,需要在web.xml中設定contextConfigLocation參數。代碼如下:

contextConfigLocation

其他的spring配置文件名,用逗號隔開

需要注意的一些地方

1.存儲fieldError的是一個LinkedHashMap;而actionError則存儲在一個ArrayList中。

ActionSupport中的getFieldError方法返回的是一個新的集合。該集合是原fieldError集合的一個副本。

在struts2的源代碼中返回的是:new LinkedHashMap(internalGetFieldError),即一個新的集合對象。

所以執行代碼:this.getFieldErrors.put(”username“,”ErrorMsg");不會影響原fieldError集合的數據。

2.若一個Action注冊了PreResultListner,則會在該Action返回的時候調用相應結果驗證的邏輯代碼。

3.struts2-core包中的default.properties和struts-default.xml文件保存了一些struts2默認的配置。

可以在自己的struts配置文件中對相應的配置進行覆蓋或重新設值。比如修改請求的后綴名:在struts.properties 中加入:

struts.action.extension = do 則將struts2請求的后綴名修改成了struts1中的do后綴名的形式。

4.在配置文件中配置struts.multipart.saveDir來設定上傳文件時的臨時文件的存儲位置。需要定期清理該路徑下的文件。

第二篇:struts2面試題(自己總結)

Struts2面試題

1、struts2工作流程

Struts 2框架本身大致可以分為3個部分:

核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。

核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。

業務控制器Action和業務邏輯組件是需要用戶來自己實現的。

用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。

Struts 2的工作流程相對于Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下: 1、客戶端初始化一個指向Servlet容器的請求;

2、這個請求經過一系列的過濾器(Filter)

(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action

4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy

5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類

6、ActionProxy創建一個ActionInvocation的實例。

7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。

8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper

9、響應的返回是通過我們在web.xml中配置的過濾器

10、如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。

2、說下Struts的設計模式

MVC模式: web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,并被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證后選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然后調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生 成動態的網頁,返回給客戶。

3、攔截器和過濾器的區別

1、攔截器是基于java反射機制的,而過濾器是基于函數回調的。

2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。

3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。

4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。

5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

4、struts1于struts2的比較

1、Action 類: Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。

Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去 實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。

2、線程模式: Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。

Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)

3、Servlet 依賴: Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和

HttpServletResponse 被傳遞給execute方法。

Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和

HttpServletResponse的必要性。

4、可測性:

測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。

Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。

5、捕獲輸入:

Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經 常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存 在的JavaBean(仍然會導致有冗余的javabean)。

Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過

web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種

ModelDriven 特性簡化了taglib對POJO輸入對象的引用。

6、表達式語言:

Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。

Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言-- “Object Graph Notation Language ”(OGNL).7、綁定值到頁面(view): Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。

Struts 2 使用

“ValueStack ”技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。

8、類型轉換:

Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。

Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

9、校驗:

Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。

Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

10、Action執行的控制:

Struts1支持每一個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。

Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不同的生命周期。堆棧能夠根據需要和不同的Action一起使用。

為什么要使用Struts2 Struts2 是一個相當強大的Java Web開源框架,是一個基于POJO的Action的MVC Web框架。它基于當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。

1.Struts2基于MVC架構,框架結構清晰,開發流程一目了然,開發人員可以很好的掌控開發的過程。

2使用OGNL進行參數傳遞。

OGNL提供了在Struts2里訪問各種作用域中的數據的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數據。大大簡化了開發人員在獲取這些數據時的代碼量。3強大的攔截器

Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權限驗證等置于攔截器中以完成一些Java Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的權限驗證功能。4易于測試

Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5Java Web項目的測試。

易于擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設置就可以實現擴展。6模塊化管理

Struts2已經把模塊化作為了體系架構中的基本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創建為插件創建新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。

7全局結果與聲明式異常

為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。

他的如此之多的優點,是很多人比較的青睞,與spring ,Hibernate進行結合,組成了現在比較流行的ssh框架,當然每個公司都要自己的框架,也是ssh變異的產品。

struts2有哪些優點?

1)在軟件設計上Struts2的應用可以不依賴于Servlet API和struts API。Struts2的這種設計屬于無侵入式設計; 2)攔截器,實現如參數攔截注入等功能;

3)類型轉換器,可以把特殊的請求參數轉換成需要的類型; 4)多種表現層技術,如:JSP、freeMarker、Velocity等; 5)Struts2的輸入校驗可以對指定某個方法進行校驗;

6)提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現

struts2是如何啟動的?

struts2框架是通過Filter啟動的,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器; StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。struts2讀取到struts.xml的內容后,是將內容封裝進javabean對象然后存放在內存中,以后用戶的每次請求處理將使用內存中的數據,而不是每次請求都讀取struts.xml文件。

struts2框架的核心控制器是什么?它有什么作用?

1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:

負責攔截由/*指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。默認情況下,如果用戶請求的路徑 不帶后綴或者后綴以.action結尾,這時請求將被轉入struts2框架處理,否則struts2框架將略過該請求的處理。

可以通過常量“struts.action.extension”修改action的后綴,如:

如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。

struts2配置文件的加載順序?

struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多個文件中配置了同一個常量,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加載對應的Action資源

struts2常量的修改方式?

常量可以在struts.xml或struts.properties中配置,兩種配置方式如下: 1)在struts.xml文件中配置常量

2)在struts.properties中配置常量(struts.properties文件放置在src下):

struts.action.extension=do struts2如何訪問HttpServletRequest、HttpSession、ServletContext三個域對象?

方案一:

HttpServletRequest request =ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session= request.getSession();ServletContext servletContext=ServletActionContext.getServletContext();

方案二:

類 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自動傳入對應的域對象

struts2是如何管理action的?這種管理方式有什么好處?

struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的。

主要用于管理一組業務功能相關的action。在實際應用中,我們應該把一組業務功能相關的Action放在同一個包下。

struts2中的默認包struts-default有什么作用?

1)struts-default包是由struts內置的,它定義了struts2內部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過這些內置的攔截器實現,如:從請求中

把請求參數封裝到action、文件上傳和數據驗證等等都是通過攔截器實現的。當包繼承了struts-default包才能使用struts2為我們提供的這些功能。2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認配置文件。Struts2每次都會自動加載 struts-default.xml文件。

3)通常每個包都應該繼承struts-default包。

struts2如何對指定的方法進行驗證?

1)validate()方法會校驗action中所有與execute方法簽名相同的方法; 2)要校驗指定的方法通過重寫validateXxx()方法實現,validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫; 3)當某個數據校驗失敗時,調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport),如果系統 的fieldErrors包含失敗信息,struts2會將請求轉發到名為input的result;

4)在input視圖中可以通過顯示失敗信息。5)先執行validateXxxx()->validate()->如果出錯了,會轉發所指定的頁面,如果不出錯,會直接進行Action::execute()方法

struts2默認能解決get和post提交方式的亂碼問題嗎?

不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。

請你寫出struts2中至少5個的默認攔截器?

fileUpload 提供文件上傳功能

i18n 記錄用戶選擇的locale cookies 使用配置的name,value來是指cookies checkbox 添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox。

chain 讓前一個Action的屬性可以被后一個Action訪問,現在和chain類型的result()結合使用。

alias 在不同請求之間將請求參數在不同名字件轉換,請求內容不變

值棧ValueStack的原理與生命周期?

1)ValueStack貫穿整個 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當Struts2接受一個請求時,會迅速創建ActionContext,ValueStack,action。然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問。請求來的時候,action、ValueStack的生命開始,請求結束,action、ValueStack的生命結束;

2)action是多例的,和Servlet不一樣,Servelt是單例的;

3)每個action的都有一個對應的值棧,值棧存放的數據類型是該action的實例,以及該action中的實例變量,Action對象默認保存在棧頂; 4)ValueStack本質上就是一個ArrayList;

5)關于ContextMap,Struts 會把下面這些映射壓入 ContextMap 中: parameters : 該 Map 中包含當前請求的請求參數

request : 該 Map 中包含當前 request 對象中的所有屬性 session :該 Map 中包含當前 session 對象中的所有屬性

application :該 Map 中包含當前 application 對象中的所有屬性 attr:該 Map 按如下順序來檢索某個屬性: request, session, application 6)使用OGNL訪問值棧的內容時,不需要#號,而訪問request、session、application、attr時,需要加#號;

7)注意: Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如: 8)在struts2配置文件中引用ognl表達式 ,引用值棧的值,此時使用的“$”,而不是#或者%;

ActionContext、ServletContext、pageContext的區別?

1)ActionContext是當前的Action的上下文環境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關的對象的引用; 2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命周期伴隨整個web應用;

3)pageContext是JSP中的最重要的一個內置對象,可以通過pageContext獲取其他域對象的應用,同時它是一個域對象,作用范圍只針對當前頁面,當前頁面結束時,pageContext銷毀,生命周期是JSP四個域對象中最小的。

result的type屬性中有哪幾種結果類型?

一共10種:

dispatcher struts默認的結果類型,把控制權轉發給應用程序里的某個資源不能把控制權轉發給一個外部資源,若需要把控制權重定向到一個外部資源, 應該使用 redirect結果類型

redirect 把響應重定向到另一個資源(包括一個外部資源)redirectAction 把響應重定向到另一個 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream

攔截器的生命周期與工作過程?

1)每個攔截器都是實現了Interceptor接口的 Java 類;

2)init(): 該方法將在攔截器被創建后立即被調用, 它在攔截器的生命周期內只被調用一次.可以在該方法中對相關資源進行必要的初始化;

3)intercept(ActionInvocation invocation): 每攔截一個動作請求, 該方法就會被調用一次; 4)destroy: 該方法將在攔截器被銷毀之前被調用, 它在攔截器的生命周期內也只被調用一次;

5)struts2中有內置了18個攔截器。

struts2如何完成文件的上傳?

1、JSP頁面:

1)JSP頁面的上傳文件的組件:,如果需要一次上傳多個文件, 就必須使用多個 file 標簽, 但它們的名字必須是相同的,即:

name=“xxx”的值必須一樣;

2)必須把表單的enctype屬性設置為:multipart/form-data; 3)表單的方法必須為post,因為post提交的數據在消息體中,而無大小限制。

2、對應的action:

1)在 Action 中新添加 3 個和文件上傳相關的屬性;

2)如果是上傳單個文件, uploadImage屬性的類型就是 java.io.File, 它代表被上傳的文件, 第二個和第三個屬性的類型是 String, 它們分別代表上傳文 件的文件名和文件類型,定義方式是分別是:

jsp頁面file組件的名稱+ContentType, jsp頁面file組件的名稱+FileName 3)如果上上傳多個文件, 可以使用數組或 List

第三篇:easyui結合struts2總結

easyui 結合Struts2 總結 在把struts2框架搭好以后,由于easyui和后臺交互主要是靠ajax來進行的并且返回的數據格式是json形式的。所以我們必須在項目中引入struts2-json-plugin 來方便的把數據轉換為json格式。需要的jar包如下圖:

下面是我寫的一個小例子,來更好的說明之間數據是如何傳遞的。(為了節省篇幅,數據庫表就省略了)jsp頁面主要代碼如下:

當我們把頁面寫好以后就要寫action類了。主要代碼如下:

get、set方法這里就省略了。

接下來就是在struts.xml 中進行配置了。代碼如下

這里要特別注意了,繼承的是json-default, result 中德type是json。這里的配置是關鍵,起初由于配置問題,花了我很多時間。然后就是寫EmpService類和getAll方法了。代碼如下

這里我是把對象先放到map集合中,讓和放到list集合中,這樣就自動轉為json格式(感覺有些麻煩,誰有好的方法,請發送到zl673170035@163.com,謝謝哈)然后在瀏覽器上運行。

在js 中加入了工具條。

剩下的修改、刪除、增加,我是仿照easyui官網的demo中的一個例子做的。我遇到的主要問題就是,ajax 如何把參數傳給action和ajax如何接收action傳回的參數。

首先說說第一個問題,ajax 如何把參數傳給action.。

只要action 中有相對應的get和set 方法。我們發起ajax請求時struts就自動的把參數加到action中了。

這里把參數名都變為emp.XX 然后在action 中加入成員變量emp和get、set方法。這樣action就能接收值了。

接下來需要從action中給ajax中傳遞參數了。我們在struts.xml中如下配置

在action中設置result 的get、set 方法。這樣ajax就能接收到action傳回的參數了。

好了這是我的一點心得,希望對你有用。

第四篇:Struts2介紹

Struts2集成指南

關于Struts2 Struts是Apache軟件基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,并在2004年3月成為ASF的頂級項目。它通過采用Java Servlet/JSP技術,實現了基于Java EE Web應用的Model-View-Controller〔MVC〕設計模式的應用框架〔Web Framework〕,是MVC經典設計模式中的一個經典產品。

Struts,a history 在Java EE的Web應用發展的初期,除了使用Servlet技術以外,普遍是在JavaServer Pages(JSP)的源代碼中,采用HTML與Java代碼混合的方式進行開發。因為這兩種方式不可避免的要把表現與業務邏輯代碼混合在一起,都給前期開發與后期維護帶來巨大的復雜度。為了擺脫上述的約束與局限,把業務邏輯代碼從表現層中清晰的分離出來,2000年,Craig McClanahan采用了MVC的設計模式開發Struts。后來該框架產品一度被認為是最廣泛、最流行JAVA的WEB應用框架。

Craig McClanahan 2006年,WebWork與Struts這兩個優秀的Java EE Web框架(Web Framework〕的團體,決定合作共同開發一個新的,整合了WebWork與Struts優點,并且更加優雅、擴展性更強的框架,命名為“Struts 2”,原Struts的1.x版本產品稱為“Struts 1”。

至此,Struts項目并行提供與維護兩個主要版本的框架產品——Struts 1與Struts 2。Struts1 vs.Struts2 侵入性

Struts 1 在編程方面是面向抽象類編程,而不是面向接口編程。Struts 1要求自定義Action 類繼承一個特定的抽象基類Action。另一方面,Struts 1的 Action 依賴于 Servlet API,因為Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。例如 e.g.public class LogonAction extends Action {

public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){

} }

Struts 2 Action 類可以實現一個Action接口,也可以實現其他接口,甚至不實現任何接口。這使得可選的和定制的服務成為可能。e.g.public class ExampleAction {

public String doSomething(){

return “success”;} }

線程模式

Struts 1 Action類 是單例模式并且必須是線程安全的,因為在web容器中,僅有Action類 的一個實例來處理所有的請求。

Struts2 Web容器為每一個請求產生一個Action類實例,因此沒有線程安全問題。可測試性

Struts1 由于對Servlet API的依賴,使得針對于自定義Action類的測試變得復雜。

Struts2 由于自定義Action可以為POJO,所以可以向測試一個POJO一樣來測試Action類。

請求參數封裝

Struts1 使用ActionForm 對象封裝用戶的請求參數,所有的 ActionForm 必須繼承一個基類:ActionForm。普通的JavaBean 不能用作ActionForm,并且需要在配置文件中定義ActionForm。e.g.public class LogonForm extends ActionForm {

private String userpassword;

private String username;}

Struts2 直接使用Action屬性來封裝用戶請求屬性,避免了開發者需要大量開發ActionForm類的煩瑣,實際上,這些屬性還可以是包含子屬性的 Rich對象類型。e.g.public class ExampleAction {

private String responseMessage;private String requestMessage;

public String getResponseMessage(){

return responseMessage;}

public void setResponseMessage(String responseMessage){

this.responseMessage = responseMessage;}

public String getRequestMessage(){

return requestMessage;

} } public void setRequestMessage(String requestMessage){ } this.requestMessage = requestMessage;public String doSomething(){

} setMessage(“Hi, ” + getRequestMessage());return “success”;EL Struts1 整合了 JSTL,因此可以使用JSTL 表達式語言。JSTL有基本對象圖遍歷,但在對集合和索引屬性的支持上則功能不強。在向視圖綁定值時,Struts1 使用標準JSP 機制把對象綁定到視圖頁面。

Struts2 Struts 2 可以使用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation Language),因此,Struts 2 下的表達式語言功能更加強大。在向視圖綁定值時,Struts2 使用“ValueStack ”技術,使標簽庫能夠訪問值,而不需要把對象和視圖頁面綁定在一起。

校驗框架

Struts1 Struts1 支持在 ActionForm 重寫validate 方法中手動校驗,或者通過整合 Commons-validator 框架來完成數據校驗。

Struts2 Struts 2 支持通過重寫validate方法進行校驗,也支持整合XWork 校驗框架進行校驗。Struts2 architacture

名詞約定

凡是代碼、配置文件、IDE中出現的名詞,均采用英文原稱。

Roadmap 本文檔的目標是,幫助讀者在Eclipse中將Struts2集成至一個嶄新的Dynamic Web Project。集成步驟大致如下:配置Struts2的代碼環境-> 在web.xml中加入Struts2功能-> 測試Struts2。文檔目標達成的標志是:頁面請求能夠通過Struts2的Action Mapping成功轉發,并且基于Java的Struts2驗證框架能夠生效。

集成步驟

引入Struts2相關的jar文件

Struts2 jars ? ? ? ? ? ? ? ? ? ? commons-fileupload-1.2.2.jar commons-io-2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar freemarker-2.3.16.jar javassist.jar jstl-1.2.jar ognl-3.0.1.jar struts2-core-2.2.3.jar xwork-core-2.2.3.jar 加入build path 將以上10個jar文件,拷貝至WebContent/WEB-INF/lib下:

對于Web Dynamic Project,一般情況下,當你向lib目錄下copy了jar文件,eclipse會自動將jar文件加入build path下的名為Web App Libraries的Library。請確認在工程下出現了名為Web App Libraries的Library。如果有,說明這些jar文件已經被添加至build path了:

如果在工程目錄下找不到名為Web App Libraries的Library,說明jar文件沒有被添加至build path,需要進行手動添加。首先進入build path設置界面,選中Libraries 頁,并點擊Add JARs:

在JAR Selection窗口中,選中lib下所有的jar文件。選中后點擊OK:

你將看到被選中的jar文件已經被添加至build path:

在工程中會出現一個名為Referenced Libraries的Libraries。這說明jar文件已經被添加至build path:

以上兩種方法都可以將jar文件添加至build path,它們的效果是一樣的。

配置web.xml 添加filter 在web.xml中添加一個filter:

struts2

org.apache.struts2.dispatcher.FilterDispatcher

filter-name表示filter的名字,你可以任意決定這個名字。filter-class表示使用哪個類作為filter,從這個類的全稱來判斷,可以發現FilterDispatcher是Struts2提供的一個類。它是Struts2轉發請求的起點。在web.xml中添加一個filter-mapping:

struts2

/*

filter-mapping用來映射url和filter的映射關系。filter-name表示filter的名字,這個名字必須和之前filter聲明中的filter-name一致。url-pattern表示哪些格式的url會被此filter濾中。/*表示在此web應用域名下,所有的地址都會被filter濾中,換言之,所有的http請求都會通過Struts2進行轉發。

filter的作用

通過以上的配置,FilterDispatcher和url與filter-name聯系在了一起。

由于在web容器中注冊了FilterDispatcher這個filter,Struts2可以收到所有http://localhost:8080/tyland-b2b 的http請求。隨后,FilterDispatcher會根據我們定義的action-mapping規則,將請求分發到指定的action類以及它的攔截器棧。最后,Struts2按照action-mapping規則,將后臺計算的結果返回給指定頁面。籠統地來說,Struts2就是這樣工作的,所以說,FilterDispatcher是Struts2工作的入口。

編寫代碼,測試Struts2 Struts2的環境已經配置好了,基于action-mapping的轉發機制已經可以運行了。為了證明這一點,請編寫一些測試jsp頁面和java代碼。

在編寫代碼的過程中,請確保代碼文件的位置如下圖所示:

代碼清單如下:

Java代碼

UserVO.java package com.tyland.b2b.vo;

// 一個Value Object(Data Model),用來存放用戶名、密碼 public class UserVO {

private String username;private String password;

// 成員變量password的getter方法。

// 在Strtus2中,用來在頁面和服務器間傳值的Value Object必須有getter方法

public String getPassword(){

return password;

} } // 成員變量password的setter方法。

// 在Strtus2中,用來在頁面和服務器間傳值的Value Object必須有setter方法 public void setPassword(String password){ } this.password = password;// 同password

public String getUsername(){ } return username;// 同password

public void setUsername(String username){ } this.username = username;BaseAction.java package com.tyland.b2b.web.base;

import com.opensymphony.xwork2.ActionSupport;

// 為了代碼的靈活性和可擴展性,請聲明一個BaseAction基類

// BaseAction繼承Struts2的ActionSupport,因為我們想使用Struts2的一些額外幫助。// 對于ActionSupport的繼承不是必須的

public class BaseAction extends ActionSupport {

private static final long serialVersionUID = ***74952195L;} UserAction.java package com.tyland.b2b.web;

import com.tyland.b2b.vo.UserVO;import com.tyland.b2b.web.base.BaseAction;

// 自定義的Action類,繼承BaseAction // 由于繼承了ActionSupport,我們可以使用Struts2默認的action方法execute()// 由于繼承了ActionSupport,我們可以使用Struts2默認的校驗方法validate()public class UserAction extends BaseAction {

private static final long serialVersionUID =-7***3684190L;

// 用來在頁面和服務器之間傳遞用戶名、密碼的Value Object。變量名任意。

private UserVO userVO;

執行。// 用來在頁面和服務器之間傳遞message變量。名稱任意。private String message;//用來在頁面和服務器之間傳遞sayHiTo變量。名稱任意。private String sayHiTo;// 用來傳值的變量必須有getter方法 public UserVO getUserVO(){ return userVO;}

//用來傳值的變量必須有setter方法

public void setUserVO(UserVO userVO){ } this.userVO = userVO;public String getMessage(){ } return message;public void setMessage(String message){ } this.message = message;public String getSayHiTo(){ } return sayHiTo;public void setSayHiTo(String sayHiTo){ } this.sayHiTo = sayHiTo;// Override聲明說明這個方法復寫或實現了父類或接口方法。

// 如action-mapping中不顯示指定別的方法,struts2會將execute()作為默認的action方法// 返回的SUCCESS常量,來自ActionSupport,值為“success”。

// action-mapping會根據不同的返回值采取不同的轉發或頁面跳轉動作。@Override

public String execute()throws Exception {

} System.out.println(“******execute******”);System.out.println(userVO.getUsername()+ “ logins”);return SUCCESS;

// 在Struts2執行execute()之前,會先執行validateExecute()進行用戶輸入驗證 // 這個方法名必須符合Struts2驗證框架所規定的命名規范 public void validateExecute(){

}

} System.out.println(“******validateExecute******” + userVO.getUsername());if(null == userVO.getUsername()|| userVO.getUsername().length()< 5){ this.addFieldError(“username”, “USERNAME ERROR”);} if(null == userVO.getPassword()|| userVO.getPassword().length()< 5){ this.addFieldError(“password”, “PASSWORD ERROR”);} // 一個自定義方法。通過在action-mapping中的設置,可以實現使用POJO的自定義服務配置 public String sayHi()throws Exception {

} System.out.println(“say hi to ” + getSayHiTo());return SUCCESS;// 符合驗證框架命名規范的、真對于sayHi()的驗證方法 public void validateSayHi(){

} System.out.println(“******validateSayHi******” + getSayHiTo());if(null == getSayHiTo()|| getSayHiTo().length()< 5){ this.addFieldError(“sayHiTo”, “SAYHITO ERROR”);} ExampleAction.java package com.tyland.b2b.web;

import com.tyland.b2b.web.base.BaseAction;

public class ExampleAction extends BaseAction {

private static final long serialVersionUID =-***7281L;

private String message;private String sayHiTo;

public String getMessage(){

return message;}

public void setMessage(String message){

this.message = message;}

public String getSayHiTo(){

return sayHiTo;}

} public void setSayHiTo(String sayHiTo){ } this.sayHiTo = sayHiTo;public String finish(){

} System.out.println(“example finished”);setMessage(getSayHiTo());return SUCCESS;JSP代碼

index.jsp <%@ page language=“java” contentType=“text/html;charset=UTF-8”

pageEncoding=“UTF-8”%>

<%@ taglib uri = “http://java.sun.com/jsp/jstl/core” prefix = “c” %>

Hello World

第五篇:Struts2試題

Struts2 試題

1.struts2的執行流程?

客戶端提交一個HttpServletRequest請求(action或JSP頁面)

請求被提交到一系列Filter過濾器,如ActionCleanUp和FiterDispatcher等

FilterDispatcher是Struts2控制器的核心,它通常是過濾器鏈中的最后一個過濾器 詢問ActionMapper是否需要調用某個action來處理

如果ActonMapper據誒的那個需要調用某個A傳統,FilterDispatcher則把請求教到ActionProxy,由其進行處理

ActionProxy通過Configuration Manager詢問框架配置文件,找到需要調用的Action類 ActionProxy創建一個ActionInvocation實例,而ActionInvocation通過代理模式調用action Action執行完畢后,返回一個result字符串,此時再按相反的順序通過Interceptor攔截器 最后ActionInvocation負責根據struts配置文件中配置的result元素,找到與返回值對應的result

2.struts2的web里需要配置什么?

1. 2. 3.struts2 4. 5.org.apache.struts2.dispatcher.FilterDispatcher 6. 7. 8. 9. 10.struts2 11./* 12.

3.struts.xml文件哪個常量可以實現不用重新啟動服務就可以得到反饋? ?

4.struts中的package的作用是什么?namespace可以為空嗎?如果namespace為空會意味著什么呢?

標識

可以、Timmer

如果沒寫,說明該包為默認空間 只要敲index沒有精確對應的package都交給namespackage 如果還沒有就崩潰

5.Action 的實現通集成常用那種方法? 一種是直接實現自己的Action 另一種是實現Action的接口 繼承ActionSupport

6.路徑設置用什么路徑,絕對還是相對? 都可以

7.通配符有幾種?要遵循什么原則? {1}

方法名

8.Action的屬性?

path屬性:指定請求訪問Action的路徑

type屬性:指定Action的完整類名

name屬性:指定需要傳遞給Action的ActionForm Bean scope屬性:指定ActionForm Bean的存放范圍

validate屬性:指定是否執行表單驗證

input屬性:指定當表單驗證失敗時的轉發路徑。

元素還包含一個子元素,它定義了一個請求轉發路徑。

9.用于讀取資源文件,實現國際化的Struts2的標簽()。

10.一下關于struts的描述中,不正確的是(D)struts 是一個基于JAVA EE的MVC struts2的框架配置文件是struts-configxml struts2的控制組建核心包括核心控制和業務控制器

在struts中解決中文亂碼可以通過修改struts。I18n。encoding的值為GBK來實現 11.不屬于Struts2的動作類的常量返回值的是(C)

A.success

B.input

C.never

D.login 12.一下不屬于Struts2動作執行的結果類型是(A)a.action b.redirect c.redirectAction d.dispatcher 13.在struts.xml中。假如在一個package中沒有配置namespace,那么在其中配置一個Action名字叫做login,它的result是這樣配置的/login.jsp,已知在此配置文件中還有另一個name為user的package其中也有一個Action名字為login,它的result是這樣配置的/loginUser.jsp那么在以下什么情況下將能訪問到login.jsp A A.在根路徑后輸入/login B.在根路徑后輸入/user/login C.在根路徑后輸入/login/user D.在根路徑后輸入/abc/login

14.正規開發中,在使用struts2時定義Action使用哪種方式。B A.直接定義Action類。B.從ActionSupport繼承。C.從Action繼承。D.實現Action接口。

15.不同的線程在調用Action時創建幾個Action實例。C A.1個 B.2個

C.每個線程創建1個。D.可以自定義配置。

16.struts2的體系結構主要包括那幾個部分(A)A.模型層

B.struts控制器組件 C。struts配置文件 D。struts標簽庫

17.struts提供了Action接口定義了5個標準字符串常量,不包括的有(C)A SUCCESS

B NONE C REG D LOGIN 18.struts中數據驗證失敗時,通過(B)標簽顯示錯誤信息。A

B

C

D

19.列舉出action執行結果類型,并說明用途。

默認結果類型是dispatcher chain:Action鏈式處理的結果類型,也就是將結果轉發到這個action中。dispatcher:用于整合JSP的結果類型

redirect:實際上dispatcher和redirect的區別就是在于轉發和重定向的區別。redirect-action:重定向action

20.簡述struts2文件上傳的方法。

Commons FileUpload通過將HTTP的數據保存到臨時文件夾,然后Struts使用fileUpload攔截器將文件綁定到Action的實例中。從而我們就能夠以本地文件方式的操作瀏覽器上傳的文件。

21.在struts2標簽內部 能否使用el表達式?

不可

22.struts2中result-type的chain和redirectAction的區別

chain,它是一個璉式的,是從一個Action轉發另外一個Aciton redirectAction,是從新請求一個Action

23.能否取到Httpsession的值 不可

24.action的name里邊寫的名字是什么地方用的? From 表單action引用

25.action的class里面寫的是什么? Action相應類的詳細路徑

26.action的extends里面調用的是什么?

從另外一個包繼承、相當于擁有即承包的所有配置

27.如果不寫action的后面mothod,默認的調用的方法是什么,如果寫的話,寫的時候有什么需要注意的?

不寫會默認調用最上面的方法

28.輸出值的strtus標簽是什么?

s:property

28.循環的struts標簽是什么?

s:iterator

29.判斷的strtuts標簽是什么?

s:if

30.顯示文本的strtuts標簽是什么?

31.要調用struts標簽需要導入什么? <%@taglib uri=“/struts-tags” prefix=“s”%>

32.如果需要調用sc:datetimepicker需要導入什么,sc代表的是什么意思?

33.中的s代表的是什么,這個標簽是干什么用的?

獲取前臺文本的值

34.請簡述前臺提交后是如何到達后臺action的。

通過from表單action找到struts配置文件相應action的類 再去找相應action類里的方法

下載struts2知識總結word格式文檔
下載struts2知識總結.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    struts2課件

    —高級軟件人才實作培訓專家!Struts2的啟動配置在struts1.x中,struts框架是通過Servlet啟動的。在struts2中,struts框架是通過Filter啟動的。他在web.xml中的配置如下:struts2o......

    Struts2習題

    Struts2習題1 1.struts中的package的作用是什么?namespace可以為空嗎?如果namespace為空會意味著什么呢? 標識、 可以 、如果沒寫,說明該包為默認空間 2.Action 的實現通集成常......

    struts2復習題(含答案)

    Struts2復習題 1. 以下屬于struts2的控制器組件是: A.ActionB.ActionForm C.ActionServlet D.dispatchAction 2. 以下屬于struts2配置文件中的配置元素是:(多選) A. B. C. D......

    struts2綜合試卷范文合集

    Struts2學習增強練習課程名稱: Struts2學習增強練習考試時間 xx分鐘(閉卷■) 不定項選擇題 1. 開發struts2 web項目,需要導入哪些jar包 A 必須導入struts2 解壓lib下所有......

    struts2代碼分析

    1. Struts2架構圖和請求處理流程 請求首先通過Filter chain,Filter主要包括ActionContextCleanUp,它主要清理當前線程的ActionContext和Dispatcher;FilterDispatcher主要通過Ac......

    struts2根據struts2完全學習手冊 自己總結

    一、struts2簡介 1 struts2的配置文件: (1)struts.xml 配置示例: HelloWorld /example (2)struts.properties配置文件 # # $Id: struts.properties 722328 2008-......

    struts2復習題(含答案)5篇

    Struts2復習題 1. 以下屬于struts2的控制器組件是: A.ActionB.ActionForm C.ActionServlet D.dispatchAction 2. 以下屬于struts2的體系結構的是:(多選) A.struts2控制器組件......

    struts2理論考試題目

    1.MVC的各個部分都有那些技術來實現?如何實現? 答:MVC是Model-View-Controller的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), View 是應用的表示面(由JSP頁面......

主站蜘蛛池模板: 国产精品不卡无码av在线播放| 色欲αv一区二区三区天美传媒| 亚洲午夜爱爱香蕉片| 国产精品情侣呻吟对白视频| 欧美丰满大乳高跟鞋| 久久精品无码一区二区日韩av| 国产女厕偷窥系列在线视频| 亚洲成av人的天堂在线观看| 国产精品无码a∨精品影院app| 亚洲av无码乱码国产麻豆| 久久中文字幕人妻丝袜| 熟妇人妻不卡中文字幕| 色婷婷五月在线精品视频| 裸体美女无遮挡免费网站| 午夜精品一区二区三区的区别| 国内嫩模私拍精品视频| 18禁裸男晨勃露j毛免费观看| 久久综合精品国产丝袜长腿| 人人妻人人澡人人爽欧美二区| 欧美肥胖老太vidio在线视频| 欧美日韩精品一区二区三区在线| 天天躁人人躁人人躁狂躁| 乱码av麻豆丝袜熟女系列| 波多野42部无码喷潮在线| 午夜毛片不卡高清免费看| 国产精品久久久久久av福利| 国产中年熟女高潮大集合| 国产偷人妻精品一区| 无码吃奶揉捏奶头高潮视频| 国产成人午夜精华液| 欧美人善z0zo性伦交高清| 中文字幕日韩人妻不卡一区| 国产亚洲美女精品久久久久| 欧美成人aa久久狼窝五月丁香| 成人亚洲欧美一区二区三区| 国产乱子夫妻xx黑人xyx真爽| 久久精品欧美日韩精品| 51久久夜色精品国产水果派解说| 国产人成精品香港三级在线| 精品无人区麻豆乱码1区2区| 精品亚洲aⅴ在线观看|