第一篇:struts2知識(shí)總結(jié)
struts2知識(shí)總結(jié)
1.全局的邏輯控制器為一個(gè)過(guò)濾器,負(fù)責(zé)過(guò)濾所有的請(qǐng)求。該過(guò)濾器引用的API類為
org.apache.struts2.disapatcher.FilterDispatcher
2.MVC:頁(yè)面請(qǐng)求(jsp)——>邏輯控制器(Filter)——>業(yè)務(wù)控制器(Action)——>業(yè)務(wù)邏輯組件——>業(yè)務(wù)處理/DAO
3.struts2的配置文件放在classpath下。
4.struts2的類型轉(zhuǎn)換:
a.繼承DefaultTypeConverter,覆蓋父類的public Object convertValue(Map context, Object value, Class toType)方法
b.繼承StrutsTypeConverter, 覆蓋父類的public Object convertFromString(Map context, String[] values, Class toClass)該方法負(fù)責(zé)轉(zhuǎn)換從頁(yè)面?zhèn)鬟f過(guò)來(lái)的數(shù)據(jù)。
覆蓋父類的public String convertToString(Map context, Object o)
該方法負(fù)責(zé)將Action中處理好的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)格式的字符串。
5.struts2的數(shù)據(jù)驗(yàn)證:
a.使用編碼方式進(jìn)行驗(yàn)證。業(yè)務(wù)控制器Action繼承ActionSupport類,重寫public void validate()方法。
在該方法中進(jìn)行數(shù)據(jù)驗(yàn)證。若Action中處理業(yè)務(wù)的方法為test,則可以編寫public void validateTest()方法,來(lái)對(duì)test方法的數(shù)據(jù)進(jìn)行驗(yàn)證。(系統(tǒng)在進(jìn)行validateTest方法后,會(huì)接著執(zhí)行validate方法,然后
才執(zhí)行相應(yīng)的業(yè)務(wù)代碼。)
若嚴(yán)重出錯(cuò),則可以調(diào)用addFieldError或者調(diào)用addActionError方法,增加相應(yīng)的錯(cuò)誤提示信息。
b.使用配置xml文件進(jìn)行驗(yàn)證。驗(yàn)證文件的名字為:×××Action-validation.xml。驗(yàn)證的方式包含字段驗(yàn)證和非字段驗(yàn)證。
其中字段驗(yàn)證表示對(duì)某個(gè)字段進(jìn)行某些類型的驗(yàn)證。非字段驗(yàn)證表示用某個(gè)類型的驗(yàn)證來(lái)驗(yàn)證,某個(gè)字段。兩種方式
底層實(shí)現(xiàn)一樣,只是表現(xiàn)方式不同,字段驗(yàn)證方式比較直觀。
驗(yàn)證的類型有一下幾種:required,requiredstring,int,date,double,expression,fieldexpression email,url,visitor,conversion,stringLength,regex(正則表達(dá)式)。
對(duì)驗(yàn)證類型可以指定shourt-circuit參數(shù)為true,來(lái)執(zhí)行短路驗(yàn)證。
如果Action中執(zhí)行業(yè)務(wù)的方法為test,則可以通過(guò)編寫×××Action-test-validation.xml方法來(lái)對(duì)test方法的數(shù)據(jù)進(jìn)行 驗(yàn)證。且執(zhí)行完test方法的私有驗(yàn)證文件后,還會(huì)執(zhí)行默認(rèn)的驗(yàn)證文件×××Action-test-validation.xml的驗(yàn)證。
c.struts2進(jìn)行客戶端的驗(yàn)證。首先需要使用struts2的標(biāo)簽庫(kù),且標(biāo)簽庫(kù)的theme屬性不能為simple,然后設(shè)置標(biāo)簽的validate屬性為true。
注意:struts2的客戶端驗(yàn)證依賴于服務(wù)器的驗(yàn)證配置文件。
6.struts2的攔截器。struts2的攔截器是struts2的核心,其底層實(shí)現(xiàn)使用了Java的反射機(jī)制與動(dòng)態(tài)代理。在struts2的配置文件中
為一個(gè)Action引入了一個(gè)攔截器,則配置的默認(rèn)攔截器不會(huì)被調(diào)用,需要手工配置到該Action中。
實(shí)現(xiàn)struts2攔截器的方法:
a.實(shí)現(xiàn)Interceptor接口,并實(shí)現(xiàn)init,destrory以及intercept方法。
b.繼承AbstractInterceptor類,覆蓋intercept方法。
c.繼承MethodFilterInterceptor類,覆蓋intercept方法。該類可以對(duì)特定的方法進(jìn)行攔截。
攔截器棧可以包含攔截器和攔截器棧。
7.文件的上傳和下載:
a.使用apache組織開發(fā)的commons-fileupload和commons-io包,并且按需要配置fileUpload攔截器和相應(yīng)的上傳參數(shù),比如上傳文件的類型,上傳文件的大小。多文件的上傳可以使用js代碼來(lái)在頁(yè)面修改上傳文件的列表,在Action中
則用三個(gè)列表分別來(lái)保存文件對(duì)象(file),文件名(fileName),以及文件類型(fileContentType)。
b.文件下載使用流進(jìn)行讀?。簉eturn ServletActionContext.getServletContext.getResourceAsStream(“文件名”)并將Action的結(jié)果返回類設(shè)定為stream,即流。按需要配置相應(yīng)的參數(shù)。
8.struts2的國(guó)際化。struts2國(guó)際化的底層實(shí)現(xiàn)用到了Java基礎(chǔ)類庫(kù)中的Locale(地區(qū))和ResourceBundle(消息資源)兩個(gè)類。
struts2的國(guó)際化主要用在一下幾個(gè)地方:
a.jsp頁(yè)面:使用struts2的標(biāo)簽時(shí),指定標(biāo)簽的key屬性(對(duì)應(yīng)消息資源文件中的key)。
使用
還可以用
b.Action中:調(diào)用getText(key)或者getText(key,args)方法取得消息資源文件中的消息資源。
c.xml驗(yàn)證文件中:指定message元素的key屬性(對(duì)應(yīng)消息資源文件中的key)。(怎么傳參數(shù)?)d.類型轉(zhuǎn)換過(guò)程中:通過(guò)查看xwork包的源代碼可以找到:ge.properties文件中可以找到如下的鍵值對(duì):
xwork.default.invalid.fieldvalue=Invalid field value for field “{0}”.在消息資源文件中重新指定該鍵值對(duì)即可。
另外在struts.properties中設(shè)定鍵值對(duì)struts.i18n.encoding=GBK,可以解決中文亂碼問(wèn)題。
9.struts2的異常處理。在Action中,我們的業(yè)務(wù)邏輯處理方法都對(duì)拋出異常進(jìn)行了聲明。具體的異常對(duì)應(yīng)具體的處理結(jié)果。
在action配置中:
還可以配置全局的異常處理:
struts2的其他東西:
1.對(duì)于struts.xml中的package:
a.設(shè)置
,則表明該包中沒有action的配置,只定義一個(gè)基礎(chǔ)公共的組件。
b.package的namespace可以將不同的請(qǐng)求路徑分隔開,在多人合作項(xiàng)目中用到比較多。當(dāng)接收到一個(gè)請(qǐng)求,若在當(dāng)前的namespace中沒有相應(yīng)的請(qǐng)求地址,則會(huì)到默認(rèn)的namespace中去尋找匹配的地址。
2.模型驅(qū)動(dòng)機(jī)制(ModelDriven),將一個(gè)Action中的各個(gè)參數(shù)封裝成為一個(gè)JavaBean(類似struts1.x中的
ActionForm)。需要實(shí)現(xiàn)ModelDriven
3.防止表單的重復(fù)提交:在jsp的表單中設(shè)置
配置該key,來(lái)實(shí)現(xiàn)國(guó)際化。
4.struts2中Action與Servlet容器的耦合。主要有三種方式: a.實(shí)現(xiàn)ServletRequestAware或ServletResponseAware接口。并提供對(duì)request或者response熟悉的設(shè)置方法。
b.使用ActionContext(但不能獲得response對(duì)象)。改方法方便單元測(cè)試。
c.使用ServletActionContext。ServletActionContext是ActionContext的子類。
首選使用ActionContext,其次ServletActionContext。
5.整合多個(gè)struts配置文件,在struts2的配置文件中使用include元素包含其他的配置文件。用于多模塊開發(fā)。
6.可以在web.xml中對(duì)struts2的核心過(guò)濾器FilterDispatcher設(shè)置初始化參數(shù)(不推薦使用)。
7.動(dòng)態(tài)方法調(diào)用(DynamicMethodInvocation).a.action配置中指定:
b.在客戶端即頁(yè)面指定:
c.使用通配符:
使得程序不明了,不提倡使用該方法。
8.struts2的結(jié)果類型。在struts2-core包中,有幾種struts2已經(jīng)配置好的結(jié)果類型。
其中默認(rèn)的類型為dispatcher,此外還有:redirectAction,chain,freemaker,httpheader,redirect, redirectAction,stream,velocity,xslt,plainText。
9.struts2與spring的整合。導(dǎo)入struts2-spring-plugin包,在web.xml中設(shè)置spring的監(jiān)聽器, spring監(jiān)聽器對(duì)應(yīng)的API類為:org.springframework.web.context.ContextLoaderListener。
struts2-spring-plugin包為我們將struts2的對(duì)象工廠設(shè)置為spring的IoC容器,其代碼為:
很明顯,將struts.objectFactory定位為org.apache.struts2.spring.StrutsSpringObjectFactory 其余的工作就交給spring的IoC容器去做了。
另外:當(dāng)我們需要增加spring的配置文件時(shí),需要在web.xml中設(shè)定contextConfigLocation參數(shù)。代碼如下:
contextConfigLocation 其他的spring配置文件名,用逗號(hào)隔開
需要注意的一些地方
1.存儲(chǔ)fieldError的是一個(gè)LinkedHashMap
ActionSupport中的getFieldError方法返回的是一個(gè)新的集合。該集合是原fieldError集合的一個(gè)副本。
在struts2的源代碼中返回的是:new LinkedHashMap(internalGetFieldError),即一個(gè)新的集合對(duì)象。
所以執(zhí)行代碼:this.getFieldErrors.put(”username“,”ErrorMsg");不會(huì)影響原fieldError集合的數(shù)據(jù)。
2.若一個(gè)Action注冊(cè)了PreResultListner,則會(huì)在該Action返回的時(shí)候調(diào)用相應(yīng)結(jié)果驗(yàn)證的邏輯代碼。
3.struts2-core包中的default.properties和struts-default.xml文件保存了一些struts2默認(rèn)的配置。
可以在自己的struts配置文件中對(duì)相應(yīng)的配置進(jìn)行覆蓋或重新設(shè)值。比如修改請(qǐng)求的后綴名:在struts.properties 中加入:
struts.action.extension = do 則將struts2請(qǐng)求的后綴名修改成了struts1中的do后綴名的形式。
4.在配置文件中配置struts.multipart.saveDir來(lái)設(shè)定上傳文件時(shí)的臨時(shí)文件的存儲(chǔ)位置。需要定期清理該路徑下的文件。
第二篇:struts2面試題(自己總結(jié))
Struts2面試題
1、struts2工作流程
Struts 2框架本身大致可以分為3個(gè)部分:
核心控制器FilterDispatcher、業(yè)務(wù)控制器Action和用戶實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。
核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。
業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來(lái)自己實(shí)現(xiàn)的。
用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來(lái)使用。
Struts 2的工作流程相對(duì)于Struts 1要簡(jiǎn)單,與WebWork框架基本相同,所以說(shuō)Struts 2是WebWork的升級(jí)版本?;竞?jiǎn)要流程如下: 1、客戶端初始化一個(gè)指向Servlet容器的請(qǐng)求;
2、這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)
(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)是否需要調(diào)用某個(gè)Action
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy
5、ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper
9、響應(yīng)的返回是通過(guò)我們?cè)趙eb.xml中配置的過(guò)濾器
10、如果ActionContextCleanUp是當(dāng)前使用的,則FilterDispatecher將不會(huì)清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會(huì)去清理sreadlocals。
2、說(shuō)下Struts的設(shè)計(jì)模式
MVC模式: web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServler。用戶提交表單時(shí),一個(gè)配置好的ActionForm對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的Validate()驗(yàn)證后選擇將請(qǐng)求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)對(duì)象,然后調(diào)用Action的execute()方法。Execute()從ActionForm對(duì)象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對(duì)象,ActionServlet再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指定的jsp組件,ActionForward對(duì)象指定的jsp生 成動(dòng)態(tài)的網(wǎng)頁(yè),返回給客戶。
3、攔截器和過(guò)濾器的區(qū)別
1、攔截器是基于java反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)的。
2、過(guò)濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對(duì)Action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有請(qǐng)求起作用。
4、攔截器可以訪問(wèn)Action上下文、值棧里的對(duì)象,而過(guò)濾器不能。
5、在Action的生命周期中,攔截器可以多次調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
4、struts1于struts2的比較
1、Action 類: Struts1要求Action類繼承一個(gè)抽象基類。Struts1的一個(gè)普遍問(wèn)題是使用抽象類編程而不是接口。
Struts 2 Action類可以實(shí)現(xiàn)一個(gè)Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。Struts2提供一個(gè)ActionSupport基類去 實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對(duì)象都可以用作Struts2的Action對(duì)象。
2、線程模式: Struts1 Action是單例模式并且必須是線程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來(lái)處理所有的請(qǐng)求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時(shí)特別小心。Action資源必須是線程安全的或同步的。
Struts2 Action對(duì)象為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,因此沒有線程安全問(wèn)題。(實(shí)際上,servlet容器給每個(gè)請(qǐng)求產(chǎn)生許多可丟棄的對(duì)象,并且不會(huì)導(dǎo)致性能和垃圾回收問(wèn)題)
3、Servlet 依賴: Struts1 Action 依賴于Servlet API ,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí)HttpServletRequest 和
HttpServletResponse 被傳遞給execute方法。
Struts 2 Action不依賴于容器,允許Action脫離容器單獨(dú)被測(cè)試。如果需要,Struts2 Action仍然可以訪問(wèn)初始的request和response。但是,其他的元素減少或者消除了直接訪問(wèn)HttpServetRequest 和
HttpServletResponse的必要性。
4、可測(cè)性:
測(cè)試Struts1 Action的一個(gè)主要問(wèn)題是execute方法暴露了servlet API(這使得測(cè)試要依賴于容器)。一個(gè)第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對(duì)象(來(lái)進(jìn)行測(cè)試)。
Struts 2 Action可以通過(guò)初始化、設(shè)置屬性、調(diào)用方法來(lái)測(cè)試,“依賴注入”支持也使測(cè)試更容易。
5、捕獲輸入:
Struts1 使用ActionForm對(duì)象捕獲輸入。所有的ActionForm必須繼承一個(gè)基類。因?yàn)槠渌鸍avaBean不能用作ActionForm,開發(fā)者經(jīng) 常創(chuàng)建多余的類捕獲輸入。動(dòng)態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存 在的JavaBean(仍然會(huì)導(dǎo)致有冗余的javabean)。
Struts 2直接使用Action屬性作為輸入屬性,消除了對(duì)第二個(gè)輸入對(duì)象的需求。輸入屬性可能是有自己(子)屬性的rich對(duì)象類型。Action屬性能夠通過(guò)
web頁(yè)面上的taglibs訪問(wèn)。Struts2也支持ActionForm模式。rich對(duì)象類型,包括業(yè)務(wù)對(duì)象,能夠用作輸入/輸出對(duì)象。這種
ModelDriven 特性簡(jiǎn)化了taglib對(duì)POJO輸入對(duì)象的引用。
6、表達(dá)式語(yǔ)言:
Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對(duì)象圖遍歷,但是對(duì)集合和索引屬性的支持很弱。
Struts2可以使用JSTL,但是也支持一個(gè)更強(qiáng)大和靈活的表達(dá)式語(yǔ)言-- “Object Graph Notation Language ”(OGNL).7、綁定值到頁(yè)面(view): Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對(duì)象綁定到頁(yè)面中來(lái)訪問(wèn)。
Struts 2 使用
“ValueStack ”技術(shù),使taglib能夠訪問(wèn)值而不需要把你的頁(yè)面(view)和對(duì)象綁定起來(lái)。ValueStack策略允許通過(guò)一系列名稱相同但類型不同的屬性重用頁(yè)面(view)。
8、類型轉(zhuǎn)換:
Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換。每個(gè)類一個(gè)轉(zhuǎn)換器,對(duì)每一個(gè)實(shí)例來(lái)說(shuō)是不可配置的。
Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對(duì)象的轉(zhuǎn)換器。
9、校驗(yàn):
Struts 1支持在ActionForm的validate方法中手動(dòng)校驗(yàn),或者通過(guò)Commons Validator的擴(kuò)展來(lái)校驗(yàn)。同一個(gè)類可以有不同的校驗(yàn)內(nèi)容,但不能校驗(yàn)子對(duì)象。
Struts2支持通過(guò)validate方法和XWork校驗(yàn)框架來(lái)進(jìn)行校驗(yàn)。XWork校驗(yàn)框架使用為屬性類類型定義的校驗(yàn)和內(nèi)容校驗(yàn),來(lái)支持chain校驗(yàn)子屬性
10、Action執(zhí)行的控制:
Struts1支持每一個(gè)模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。
Struts2支持通過(guò)攔截器堆棧(Interceptor Stacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。
為什么要使用Struts2 Struts2 是一個(gè)相當(dāng)強(qiáng)大的Java Web開源框架,是一個(gè)基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。
1.Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過(guò)程。
2使用OGNL進(jìn)行參數(shù)傳遞。
OGNL提供了在Struts2里訪問(wèn)各種作用域中的數(shù)據(jù)的簡(jiǎn)單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡(jiǎn)化了開發(fā)人員在獲取這些數(shù)據(jù)時(shí)的代碼量。3強(qiáng)大的攔截器
Struts2 的攔截器是一個(gè)Action級(jí)別的AOP,Struts2中的許多特性都是通過(guò)攔截器來(lái)實(shí)現(xiàn)的,例如異常處理,文件上傳,驗(yàn)證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證,權(quán)限驗(yàn)證等置于攔截器中以完成一些Java Web項(xiàng)目中比較通用的功能。在我實(shí)現(xiàn)的的一Web項(xiàng)目中,就是使用Struts2的攔截器來(lái)完成了系統(tǒng)中的權(quán)限驗(yàn)證功能。4易于測(cè)試
Struts2的Action都是簡(jiǎn)單的POJO,這樣可以方便的對(duì)Struts2的Action編寫測(cè)試用例,大大方便了5Java Web項(xiàng)目的測(cè)試。
易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡(jiǎn)單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展。6模塊化管理
Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過(guò)三種方法來(lái)將應(yīng)用程序模塊化:將配置信息拆分成多個(gè)文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無(wú)關(guān)的新功能組織成插件,以添加到多個(gè)應(yīng)用中去。
7全局結(jié)果與聲明式異常
為應(yīng)用程序添加全局的Result,和在配置文件中對(duì)異常進(jìn)行處理,這樣當(dāng)處理過(guò)程中出現(xiàn)指定異常時(shí),可以跳轉(zhuǎn)到特定頁(yè)面。
他的如此之多的優(yōu)點(diǎn),是很多人比較的青睞,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架,當(dāng)然每個(gè)公司都要自己的框架,也是ssh變異的產(chǎn)品。
struts2有哪些優(yōu)點(diǎn)?
1)在軟件設(shè)計(jì)上Struts2的應(yīng)用可以不依賴于Servlet API和struts API。Struts2的這種設(shè)計(jì)屬于無(wú)侵入式設(shè)計(jì); 2)攔截器,實(shí)現(xiàn)如參數(shù)攔截注入等功能;
3)類型轉(zhuǎn)換器,可以把特殊的請(qǐng)求參數(shù)轉(zhuǎn)換成需要的類型; 4)多種表現(xiàn)層技術(shù),如:JSP、freeMarker、Velocity等; 5)Struts2的輸入校驗(yàn)可以對(duì)指定某個(gè)方法進(jìn)行校驗(yàn);
6)提供了全局范圍、包范圍和Action范圍的國(guó)際化資源文件管理實(shí)現(xiàn)
struts2是如何啟動(dòng)的?
struts2框架是通過(guò)Filter啟動(dòng)的,即StrutsPrepareAndExecuteFilter,此過(guò)濾器為struts2的核心過(guò)濾器; StrutsPrepareAndExecuteFilter的init()方法中將會(huì)讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作。struts2讀取到struts.xml的內(nèi)容后,是將內(nèi)容封裝進(jìn)javabean對(duì)象然后存放在內(nèi)存中,以后用戶的每次請(qǐng)求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次請(qǐng)求都讀取struts.xml文件。
struts2框架的核心控制器是什么?它有什么作用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:
負(fù)責(zé)攔截由
可以通過(guò)常量“struts.action.extension”修改action的后綴,如:
如果用戶需要指定多個(gè)請(qǐng)求后綴,則多個(gè)后綴之間以英文逗號(hào)(,)隔開。
struts2配置文件的加載順序?
struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多個(gè)文件中配置了同一個(gè)常量,則后一個(gè)文件中配置的常量值會(huì)覆蓋前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加載對(duì)應(yīng)的Action資源
struts2常量的修改方式?
常量可以在struts.xml或struts.properties中配置,兩種配置方式如下: 1)在struts.xml文件中配置常量
struts.action.extension=do struts2如何訪問(wèn)HttpServletRequest、HttpSession、ServletContext三個(gè)域?qū)ο螅?/p>
方案一:
HttpServletRequest request =ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session= request.getSession();ServletContext servletContext=ServletActionContext.getServletContext();
方案二:
類 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自動(dòng)傳入對(duì)應(yīng)的域?qū)ο?/p>
struts2是如何管理action的?這種管理方式有什么好處?
struts2框架中使用包來(lái)管理Action,包的作用和java中的類包是非常類似的。
主要用于管理一組業(yè)務(wù)功能相關(guān)的action。在實(shí)際應(yīng)用中,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個(gè)包下。
struts2中的默認(rèn)包struts-default有什么作用?
1)struts-default包是由struts內(nèi)置的,它定義了struts2內(nèi)部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過(guò)這些內(nèi)置的攔截器實(shí)現(xiàn),如:從請(qǐng)求中
把請(qǐng)求參數(shù)封裝到action、文件上傳和數(shù)據(jù)驗(yàn)證等等都是通過(guò)攔截器實(shí)現(xiàn)的。當(dāng)包繼承了struts-default包才能使用struts2為我們提供的這些功能。2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認(rèn)配置文件。Struts2每次都會(huì)自動(dòng)加載 struts-default.xml文件。
3)通常每個(gè)包都應(yīng)該繼承struts-default包。
struts2如何對(duì)指定的方法進(jìn)行驗(yàn)證?
1)validate()方法會(huì)校驗(yàn)action中所有與execute方法簽名相同的方法; 2)要校驗(yàn)指定的方法通過(guò)重寫validateXxx()方法實(shí)現(xiàn),validateXxx()只會(huì)校驗(yàn)action中方法名為Xxx的方法。其中Xxx的第一個(gè)字母要大寫; 3)當(dāng)某個(gè)數(shù)據(jù)校驗(yàn)失敗時(shí),調(diào)用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport),如果系統(tǒng) 的fieldErrors包含失敗信息,struts2會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到名為input的result;
4)在input視圖中可以通過(guò)
struts2默認(rèn)能解決get和post提交方式的亂碼問(wèn)題嗎?
不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問(wèn)題。
請(qǐng)你寫出struts2中至少5個(gè)的默認(rèn)攔截器?
fileUpload 提供文件上傳功能
i18n 記錄用戶選擇的locale cookies 使用配置的name,value來(lái)是指cookies checkbox 添加了checkbox自動(dòng)處理代碼,將沒有選中的checkbox的內(nèi)容設(shè)定為false,而html默認(rèn)情況下不提交沒有選中的checkbox。
chain 讓前一個(gè)Action的屬性可以被后一個(gè)Action訪問(wèn),現(xiàn)在和chain類型的result()結(jié)合使用。
alias 在不同請(qǐng)求之間將請(qǐng)求參數(shù)在不同名字件轉(zhuǎn)換,請(qǐng)求內(nèi)容不變
值棧ValueStack的原理與生命周期?
1)ValueStack貫穿整個(gè) Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當(dāng)Struts2接受一個(gè)請(qǐng)求時(shí),會(huì)迅速創(chuàng)建ActionContext,ValueStack,action。然后把a(bǔ)ction存放進(jìn)ValueStack,所以action的實(shí)例變量可以被OGNL訪問(wèn)。請(qǐng)求來(lái)的時(shí)候,action、ValueStack的生命開始,請(qǐng)求結(jié)束,action、ValueStack的生命結(jié)束;
2)action是多例的,和Servlet不一樣,Servelt是單例的;
3)每個(gè)action的都有一個(gè)對(duì)應(yīng)的值棧,值棧存放的數(shù)據(jù)類型是該action的實(shí)例,以及該action中的實(shí)例變量,Action對(duì)象默認(rèn)保存在棧頂; 4)ValueStack本質(zhì)上就是一個(gè)ArrayList;
5)關(guān)于ContextMap,Struts 會(huì)把下面這些映射壓入 ContextMap 中: parameters : 該 Map 中包含當(dāng)前請(qǐng)求的請(qǐng)求參數(shù)
request : 該 Map 中包含當(dāng)前 request 對(duì)象中的所有屬性 session :該 Map 中包含當(dāng)前 session 對(duì)象中的所有屬性
application :該 Map 中包含當(dāng)前 application 對(duì)象中的所有屬性 attr:該 Map 按如下順序來(lái)檢索某個(gè)屬性: request, session, application 6)使用OGNL訪問(wèn)值棧的內(nèi)容時(shí),不需要#號(hào),而訪問(wèn)request、session、application、attr時(shí),需要加#號(hào);
7)注意: Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用。如:
ActionContext、ServletContext、pageContext的區(qū)別?
1)ActionContext是當(dāng)前的Action的上下文環(huán)境,通過(guò)ActionContext可以獲取到request、session、ServletContext等與Action有關(guān)的對(duì)象的引用; 2)ServletContext是域?qū)ο?,一個(gè)web應(yīng)用中只有一個(gè)ServletContext,生命周期伴隨整個(gè)web應(yīng)用;
3)pageContext是JSP中的最重要的一個(gè)內(nèi)置對(duì)象,可以通過(guò)pageContext獲取其他域?qū)ο蟮膽?yīng)用,同時(shí)它是一個(gè)域?qū)ο?,作用范圍只針?duì)當(dāng)前頁(yè)面,當(dāng)前頁(yè)面結(jié)束時(shí),pageContext銷毀,生命周期是JSP四個(gè)域?qū)ο笾凶钚〉摹?/p>
result的type屬性中有哪幾種結(jié)果類型?
一共10種:
dispatcher struts默認(rèn)的結(jié)果類型,把控制權(quán)轉(zhuǎn)發(fā)給應(yīng)用程序里的某個(gè)資源不能把控制權(quán)轉(zhuǎn)發(fā)給一個(gè)外部資源,若需要把控制權(quán)重定向到一個(gè)外部資源, 應(yīng)該使用 redirect結(jié)果類型
redirect 把響應(yīng)重定向到另一個(gè)資源(包括一個(gè)外部資源)redirectAction 把響應(yīng)重定向到另一個(gè) Action freemarker、velocity、chain、httpheader、xslt、plainText、stream
攔截器的生命周期與工作過(guò)程?
1)每個(gè)攔截器都是實(shí)現(xiàn)了Interceptor接口的 Java 類;
2)init(): 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次.可以在該方法中對(duì)相關(guān)資源進(jìn)行必要的初始化;
3)intercept(ActionInvocation invocation): 每攔截一個(gè)動(dòng)作請(qǐng)求, 該方法就會(huì)被調(diào)用一次; 4)destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次;
5)struts2中有內(nèi)置了18個(gè)攔截器。
struts2如何完成文件的上傳?
1、JSP頁(yè)面:
1)JSP頁(yè)面的上傳文件的組件:
name=“xxx”的值必須一樣;
2)必須把表單的enctype屬性設(shè)置為:multipart/form-data; 3)表單的方法必須為post,因?yàn)閜ost提交的數(shù)據(jù)在消息體中,而無(wú)大小限制。
2、對(duì)應(yīng)的action:
1)在 Action 中新添加 3 個(gè)和文件上傳相關(guān)的屬性;
2)如果是上傳單個(gè)文件, uploadImage屬性的類型就是 java.io.File, 它代表被上傳的文件, 第二個(gè)和第三個(gè)屬性的類型是 String, 它們分別代表上傳文 件的文件名和文件類型,定義方式是分別是:
jsp頁(yè)面file組件的名稱+ContentType, jsp頁(yè)面file組件的名稱+FileName 3)如果上上傳多個(gè)文件, 可以使用數(shù)組或 List
第三篇:easyui結(jié)合struts2總結(jié)
easyui 結(jié)合Struts2 總結(jié) 在把struts2框架搭好以后,由于easyui和后臺(tái)交互主要是靠ajax來(lái)進(jìn)行的并且返回的數(shù)據(jù)格式是json形式的。所以我們必須在項(xiàng)目中引入struts2-json-plugin 來(lái)方便的把數(shù)據(jù)轉(zhuǎn)換為json格式。需要的jar包如下圖:
下面是我寫的一個(gè)小例子,來(lái)更好的說(shuō)明之間數(shù)據(jù)是如何傳遞的。(為了節(jié)省篇幅,數(shù)據(jù)庫(kù)表就省略了)jsp頁(yè)面主要代碼如下:
當(dāng)我們把頁(yè)面寫好以后就要寫action類了。主要代碼如下:
get、set方法這里就省略了。
接下來(lái)就是在struts.xml 中進(jìn)行配置了。代碼如下
這里要特別注意了,繼承的是json-default, result 中德type是json。這里的配置是關(guān)鍵,起初由于配置問(wèn)題,花了我很多時(shí)間。然后就是寫EmpService類和getAll方法了。代碼如下
這里我是把對(duì)象先放到map集合中,讓和放到list集合中,這樣就自動(dòng)轉(zhuǎn)為json格式(感覺有些麻煩,誰(shuí)有好的方法,請(qǐng)發(fā)送到zl673170035@163.com,謝謝哈)然后在瀏覽器上運(yùn)行。
在js 中加入了工具條。
剩下的修改、刪除、增加,我是仿照easyui官網(wǎng)的demo中的一個(gè)例子做的。我遇到的主要問(wèn)題就是,ajax 如何把參數(shù)傳給action和ajax如何接收action傳回的參數(shù)。
首先說(shuō)說(shuō)第一個(gè)問(wèn)題,ajax 如何把參數(shù)傳給action.。
只要action 中有相對(duì)應(yīng)的get和set 方法。我們發(fā)起ajax請(qǐng)求時(shí)struts就自動(dòng)的把參數(shù)加到action中了。
這里把參數(shù)名都變?yōu)閑mp.XX 然后在action 中加入成員變量emp和get、set方法。這樣action就能接收值了。
接下來(lái)需要從action中給ajax中傳遞參數(shù)了。我們?cè)趕truts.xml中如下配置
在action中設(shè)置result 的get、set 方法。這樣ajax就能接收到action傳回的參數(shù)了。
好了這是我的一點(diǎn)心得,希望對(duì)你有用。
第四篇:Struts2介紹
Struts2集成指南
關(guān)于Struts2 Struts是Apache軟件基金會(huì)(ASF)贊助的一個(gè)開源項(xiàng)目。它最初是Jakarta項(xiàng)目中的一個(gè)子項(xiàng)目,并在2004年3月成為ASF的頂級(jí)項(xiàng)目。它通過(guò)采用Java Servlet/JSP技術(shù),實(shí)現(xiàn)了基于Java EE Web應(yīng)用的Model-View-Controller〔MVC〕設(shè)計(jì)模式的應(yīng)用框架〔Web Framework〕,是MVC經(jīng)典設(shè)計(jì)模式中的一個(gè)經(jīng)典產(chǎn)品。
Struts,a history 在Java EE的Web應(yīng)用發(fā)展的初期,除了使用Servlet技術(shù)以外,普遍是在JavaServer Pages(JSP)的源代碼中,采用HTML與Java代碼混合的方式進(jìn)行開發(fā)。因?yàn)檫@兩種方式不可避免的要把表現(xiàn)與業(yè)務(wù)邏輯代碼混合在一起,都給前期開發(fā)與后期維護(hù)帶來(lái)巨大的復(fù)雜度。為了擺脫上述的約束與局限,把業(yè)務(wù)邏輯代碼從表現(xiàn)層中清晰的分離出來(lái),2000年,Craig McClanahan采用了MVC的設(shè)計(jì)模式開發(fā)Struts。后來(lái)該框架產(chǎn)品一度被認(rèn)為是最廣泛、最流行JAVA的WEB應(yīng)用框架。
Craig McClanahan 2006年,WebWork與Struts這兩個(gè)優(yōu)秀的Java EE Web框架(Web Framework〕的團(tuán)體,決定合作共同開發(fā)一個(gè)新的,整合了WebWork與Struts優(yōu)點(diǎn),并且更加優(yōu)雅、擴(kuò)展性更強(qiáng)的框架,命名為“Struts 2”,原Struts的1.x版本產(chǎn)品稱為“Struts 1”。
至此,Struts項(xiàng)目并行提供與維護(hù)兩個(gè)主要版本的框架產(chǎn)品——Struts 1與Struts 2。Struts1 vs.Struts2 侵入性
Struts 1 在編程方面是面向抽象類編程,而不是面向接口編程。Struts 1要求自定義Action 類繼承一個(gè)特定的抽象基類Action。另一方面,Struts 1的 Action 依賴于 Servlet API,因?yàn)镾truts 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 類可以實(shí)現(xiàn)一個(gè)Action接口,也可以實(shí)現(xiàn)其他接口,甚至不實(shí)現(xiàn)任何接口。這使得可選的和定制的服務(wù)成為可能。e.g.public class ExampleAction {
public String doSomething(){
return “success”;} }
線程模式
Struts 1 Action類 是單例模式并且必須是線程安全的,因?yàn)樵趙eb容器中,僅有Action類 的一個(gè)實(shí)例來(lái)處理所有的請(qǐng)求。
Struts2 Web容器為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)Action類實(shí)例,因此沒有線程安全問(wèn)題。可測(cè)試性
Struts1 由于對(duì)Servlet API的依賴,使得針對(duì)于自定義Action類的測(cè)試變得復(fù)雜。
Struts2 由于自定義Action可以為POJO,所以可以向測(cè)試一個(gè)POJO一樣來(lái)測(cè)試Action類。
請(qǐng)求參數(shù)封裝
Struts1 使用ActionForm 對(duì)象封裝用戶的請(qǐng)求參數(shù),所有的 ActionForm 必須繼承一個(gè)基類:ActionForm。普通的JavaBean 不能用作ActionForm,并且需要在配置文件中定義ActionForm。e.g.public class LogonForm extends ActionForm {
private String userpassword;
private String username;}
Struts2 直接使用Action屬性來(lái)封裝用戶請(qǐng)求屬性,避免了開發(fā)者需要大量開發(fā)ActionForm類的煩瑣,實(shí)際上,這些屬性還可以是包含子屬性的 Rich對(duì)象類型。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 表達(dá)式語(yǔ)言。JSTL有基本對(duì)象圖遍歷,但在對(duì)集合和索引屬性的支持上則功能不強(qiáng)。在向視圖綁定值時(shí),Struts1 使用標(biāo)準(zhǔn)JSP 機(jī)制把對(duì)象綁定到視圖頁(yè)面。
Struts2 Struts 2 可以使用JSTL,但它整合了一種更強(qiáng)大和靈活的表達(dá)式語(yǔ)言:OGNL(Object Graph Notation Language),因此,Struts 2 下的表達(dá)式語(yǔ)言功能更加強(qiáng)大。在向視圖綁定值時(shí),Struts2 使用“ValueStack ”技術(shù),使標(biāo)簽庫(kù)能夠訪問(wèn)值,而不需要把對(duì)象和視圖頁(yè)面綁定在一起。
校驗(yàn)框架
Struts1 Struts1 支持在 ActionForm 重寫validate 方法中手動(dòng)校驗(yàn),或者通過(guò)整合 Commons-validator 框架來(lái)完成數(shù)據(jù)校驗(yàn)。
Struts2 Struts 2 支持通過(guò)重寫validate方法進(jìn)行校驗(yàn),也支持整合XWork 校驗(yàn)框架進(jìn)行校驗(yàn)。Struts2 architacture
名詞約定
凡是代碼、配置文件、IDE中出現(xiàn)的名詞,均采用英文原稱。
Roadmap 本文檔的目標(biāo)是,幫助讀者在Eclipse中將Struts2集成至一個(gè)嶄新的Dynamic Web Project。集成步驟大致如下:配置Struts2的代碼環(huán)境-> 在web.xml中加入Struts2功能-> 測(cè)試Struts2。文檔目標(biāo)達(dá)成的標(biāo)志是:頁(yè)面請(qǐng)求能夠通過(guò)Struts2的Action Mapping成功轉(zhuǎn)發(fā),并且基于Java的Struts2驗(yàn)證框架能夠生效。
集成步驟
引入Struts2相關(guān)的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個(gè)jar文件,拷貝至WebContent/WEB-INF/lib下:
對(duì)于Web Dynamic Project,一般情況下,當(dāng)你向lib目錄下copy了jar文件,eclipse會(huì)自動(dòng)將jar文件加入build path下的名為Web App Libraries的Library。請(qǐng)確認(rèn)在工程下出現(xiàn)了名為Web App Libraries的Library。如果有,說(shuō)明這些jar文件已經(jīng)被添加至build path了:
如果在工程目錄下找不到名為Web App Libraries的Library,說(shuō)明jar文件沒有被添加至build path,需要進(jìn)行手動(dòng)添加。首先進(jìn)入build path設(shè)置界面,選中Libraries 頁(yè),并點(diǎn)擊Add JARs:
在JAR Selection窗口中,選中l(wèi)ib下所有的jar文件。選中后點(diǎn)擊OK:
你將看到被選中的jar文件已經(jīng)被添加至build path:
在工程中會(huì)出現(xiàn)一個(gè)名為Referenced Libraries的Libraries。這說(shuō)明jar文件已經(jīng)被添加至build path:
以上兩種方法都可以將jar文件添加至build path,它們的效果是一樣的。
配置web.xml 添加filter 在web.xml中添加一個(gè)filter:
filter-name表示filter的名字,你可以任意決定這個(gè)名字。filter-class表示使用哪個(gè)類作為filter,從這個(gè)類的全稱來(lái)判斷,可以發(fā)現(xiàn)FilterDispatcher是Struts2提供的一個(gè)類。它是Struts2轉(zhuǎn)發(fā)請(qǐng)求的起點(diǎn)。在web.xml中添加一個(gè)filter-mapping:
filter-mapping用來(lái)映射url和filter的映射關(guān)系。filter-name表示filter的名字,這個(gè)名字必須和之前filter聲明中的filter-name一致。url-pattern表示哪些格式的url會(huì)被此filter濾中。/*表示在此web應(yīng)用域名下,所有的地址都會(huì)被filter濾中,換言之,所有的http請(qǐng)求都會(huì)通過(guò)Struts2進(jìn)行轉(zhuǎn)發(fā)。
filter的作用
通過(guò)以上的配置,F(xiàn)ilterDispatcher和url與filter-name聯(lián)系在了一起。
由于在web容器中注冊(cè)了FilterDispatcher這個(gè)filter,Struts2可以收到所有http://localhost:8080/tyland-b2b 的http請(qǐng)求。隨后,F(xiàn)ilterDispatcher會(huì)根據(jù)我們定義的action-mapping規(guī)則,將請(qǐng)求分發(fā)到指定的action類以及它的攔截器棧。最后,Struts2按照action-mapping規(guī)則,將后臺(tái)計(jì)算的結(jié)果返回給指定頁(yè)面?;\統(tǒng)地來(lái)說(shuō),Struts2就是這樣工作的,所以說(shuō),F(xiàn)ilterDispatcher是Struts2工作的入口。
編寫代碼,測(cè)試Struts2 Struts2的環(huán)境已經(jīng)配置好了,基于action-mapping的轉(zhuǎn)發(fā)機(jī)制已經(jīng)可以運(yùn)行了。為了證明這一點(diǎn),請(qǐng)編寫一些測(cè)試jsp頁(yè)面和java代碼。
在編寫代碼的過(guò)程中,請(qǐng)確保代碼文件的位置如下圖所示:
代碼清單如下:
Java代碼
UserVO.java package com.tyland.b2b.vo;
// 一個(gè)Value Object(Data Model),用來(lái)存放用戶名、密碼 public class UserVO {
private String username;private String password;
// 成員變量password的getter方法。
// 在Strtus2中,用來(lái)在頁(yè)面和服務(wù)器間傳值的Value Object必須有g(shù)etter方法
public String getPassword(){
return password;
} } // 成員變量password的setter方法。
// 在Strtus2中,用來(lái)在頁(yè)面和服務(wù)器間傳值的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;
// 為了代碼的靈活性和可擴(kuò)展性,請(qǐng)聲明一個(gè)BaseAction基類
// BaseAction繼承Struts2的ActionSupport,因?yàn)槲覀兿胧褂肧truts2的一些額外幫助。// 對(duì)于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默認(rèn)的action方法execute()// 由于繼承了ActionSupport,我們可以使用Struts2默認(rèn)的校驗(yàn)方法validate()public class UserAction extends BaseAction {
private static final long serialVersionUID =-7***3684190L;
// 用來(lái)在頁(yè)面和服務(wù)器之間傳遞用戶名、密碼的Value Object。變量名任意。
private UserVO userVO;
執(zhí)行。// 用來(lái)在頁(yè)面和服務(wù)器之間傳遞message變量。名稱任意。private String message;//用來(lái)在頁(yè)面和服務(wù)器之間傳遞sayHiTo變量。名稱任意。private String sayHiTo;// 用來(lái)傳值的變量必須有g(shù)etter方法 public UserVO getUserVO(){ return userVO;}
//用來(lái)傳值的變量必須有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聲明說(shuō)明這個(gè)方法復(fù)寫或?qū)崿F(xiàn)了父類或接口方法。
// 如action-mapping中不顯示指定別的方法,struts2會(huì)將execute()作為默認(rèn)的action方法// 返回的SUCCESS常量,來(lái)自ActionSupport,值為“success”。
// action-mapping會(huì)根據(jù)不同的返回值采取不同的轉(zhuǎn)發(fā)或頁(yè)面跳轉(zhuǎn)動(dòng)作。@Override
public String execute()throws Exception {
} System.out.println(“******execute******”);System.out.println(userVO.getUsername()+ “ logins”);return SUCCESS;
// 在Struts2執(zhí)行execute()之前,會(huì)先執(zhí)行validateExecute()進(jìn)行用戶輸入驗(yàn)證 // 這個(gè)方法名必須符合Struts2驗(yàn)證框架所規(guī)定的命名規(guī)范 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”);} // 一個(gè)自定義方法。通過(guò)在action-mapping中的設(shè)置,可以實(shí)現(xiàn)使用POJO的自定義服務(wù)配置 public String sayHi()throws Exception {
} System.out.println(“say hi to ” + getSayHiTo());return SUCCESS;// 符合驗(yàn)證框架命名規(guī)范的、真對(duì)于sayHi()的驗(yàn)證方法 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” %>
第五篇:Struts2試題
Struts2 試題
1.struts2的執(zhí)行流程?
客戶端提交一個(gè)HttpServletRequest請(qǐng)求(action或JSP頁(yè)面)
請(qǐng)求被提交到一系列Filter過(guò)濾器,如ActionCleanUp和FiterDispatcher等
FilterDispatcher是Struts2控制器的核心,它通常是過(guò)濾器鏈中的最后一個(gè)過(guò)濾器 詢問(wèn)ActionMapper是否需要調(diào)用某個(gè)action來(lái)處理
如果ActonMapper據(jù)誒的那個(gè)需要調(diào)用某個(gè)A傳統(tǒng),F(xiàn)ilterDispatcher則把請(qǐng)求教到ActionProxy,由其進(jìn)行處理
ActionProxy通過(guò)Configuration Manager詢問(wèn)框架配置文件,找到需要調(diào)用的Action類 ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,而ActionInvocation通過(guò)代理模式調(diào)用action Action執(zhí)行完畢后,返回一個(gè)result字符串,此時(shí)再按相反的順序通過(guò)Interceptor攔截器 最后ActionInvocation負(fù)責(zé)根據(jù)struts配置文件中配置的result元素,找到與返回值對(duì)應(yīng)的result
2.struts2的web里需要配置什么?
1.
3.struts.xml文件哪個(gè)常量可以實(shí)現(xiàn)不用重新啟動(dòng)服務(wù)就可以得到反饋? ?
4.struts中的package的作用是什么?namespace可以為空嗎?如果namespace為空會(huì)意味著什么呢?
標(biāo)識(shí)
可以、Timmer
如果沒寫,說(shuō)明該包為默認(rèn)空間 只要敲index沒有精確對(duì)應(yīng)的package都交給namespackage 如果還沒有就崩潰
5.Action 的實(shí)現(xiàn)通集成常用那種方法? 一種是直接實(shí)現(xiàn)自己的Action 另一種是實(shí)現(xiàn)Action的接口 繼承ActionSupport
6.路徑設(shè)置用什么路徑,絕對(duì)還是相對(duì)? 都可以
7.通配符有幾種?要遵循什么原則? {1}
方法名
8.Action的屬性?
path屬性:指定請(qǐng)求訪問(wèn)Action的路徑
type屬性:指定Action的完整類名
name屬性:指定需要傳遞給Action的ActionForm Bean scope屬性:指定ActionForm Bean的存放范圍
validate屬性:指定是否執(zhí)行表單驗(yàn)證
input屬性:指定當(dāng)表單驗(yàn)證失敗時(shí)的轉(zhuǎn)發(fā)路徑。
9.用于讀取資源文件,實(shí)現(xiàn)國(guó)際化的Struts2的標(biāo)簽(
10.一下關(guān)于struts的描述中,不正確的是(D)struts 是一個(gè)基于JAVA EE的MVC struts2的框架配置文件是struts-configxml struts2的控制組建核心包括核心控制和業(yè)務(wù)控制器
在struts中解決中文亂碼可以通過(guò)修改struts。I18n。encoding的值為GBK來(lái)實(shí)現(xiàn) 11.不屬于Struts2的動(dòng)作類的常量返回值的是(C)
A.success
B.input
C.never
D.login 12.一下不屬于Struts2動(dòng)作執(zhí)行的結(jié)果類型是(A)a.a(chǎn)ction b.redirect c.redirectAction d.dispatcher 13.在struts.xml中。假如在一個(gè)package中沒有配置namespace,那么在其中配置一個(gè)Action名字叫做login,它的result是這樣配置的
14.正規(guī)開發(fā)中,在使用struts2時(shí)定義Action使用哪種方式。B A.直接定義Action類。B.從ActionSupport繼承。C.從Action繼承。D.實(shí)現(xiàn)Action接口。
15.不同的線程在調(diào)用Action時(shí)創(chuàng)建幾個(gè)Action實(shí)例。C A.1個(gè) B.2個(gè)
C.每個(gè)線程創(chuàng)建1個(gè)。D.可以自定義配置。
16.struts2的體系結(jié)構(gòu)主要包括那幾個(gè)部分(A)A.模型層
B.struts控制器組件 C。struts配置文件 D。struts標(biāo)簽庫(kù)
17.struts提供了Action接口定義了5個(gè)標(biāo)準(zhǔn)字符串常量,不包括的有(C)A SUCCESS
B NONE C REG D LOGIN 18.struts中數(shù)據(jù)驗(yàn)證失敗時(shí),通過(guò)(B)標(biāo)簽顯示錯(cuò)誤信息。A
默認(rèn)結(jié)果類型是dispatcher chain:Action鏈?zhǔn)教幚淼慕Y(jié)果類型,也就是將結(jié)果轉(zhuǎn)發(fā)到這個(gè)action中。dispatcher:用于整合JSP的結(jié)果類型
redirect:實(shí)際上dispatcher和redirect的區(qū)別就是在于轉(zhuǎn)發(fā)和重定向的區(qū)別。redirect-action:重定向action
20.簡(jiǎn)述struts2文件上傳的方法。
Commons FileUpload通過(guò)將HTTP的數(shù)據(jù)保存到臨時(shí)文件夾,然后Struts使用fileUpload攔截器將文件綁定到Action的實(shí)例中。從而我們就能夠以本地文件方式的操作瀏覽器上傳的文件。
21.在struts2標(biāo)簽內(nèi)部 能否使用el表達(dá)式?
不可
22.struts2中result-type的chain和redirectAction的區(qū)別
chain,它是一個(gè)璉式的,是從一個(gè)Action轉(zhuǎn)發(fā)另外一個(gè)Aciton redirectAction,是從新請(qǐng)求一個(gè)Action
23.
24.action的name里邊寫的名字是什么地方用的? From 表單action引用
25.action的class里面寫的是什么? Action相應(yīng)類的詳細(xì)路徑
26.action的extends里面調(diào)用的是什么?
從另外一個(gè)包繼承、相當(dāng)于擁有即承包的所有配置
27.如果不寫action的后面mothod,默認(rèn)的調(diào)用的方法是什么,如果寫的話,寫的時(shí)候有什么需要注意的?
不寫會(huì)默認(rèn)調(diào)用最上面的方法
28.輸出值的strtus標(biāo)簽是什么?
s:property
28.循環(huán)的struts標(biāo)簽是什么?
s:iterator
29.判斷的strtuts標(biāo)簽是什么?
s:if
30.顯示文本的strtuts標(biāo)簽是什么?
31.要調(diào)用struts標(biāo)簽需要導(dǎo)入什么? <%@taglib uri=“/struts-tags” prefix=“s”%>
32.如果需要調(diào)用sc:datetimepicker需要導(dǎo)入什么,sc代表的是什么意思?
33.
獲取前臺(tái)文本的值
34.請(qǐng)簡(jiǎn)述前臺(tái)提交后是如何到達(dá)后臺(tái)action的。
通過(guò)from表單action找到struts配置文件相應(yīng)action的類 再去找相應(yīng)action類里的方法