nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用
《“愛讀書”--給你講技術(shù)》,我來看書,你來進(jìn)步,讓我們開始吧!
本書簡(jiǎn)介
書名為《輕量級(jí)JavaEE企業(yè)應(yīng)用實(shí)戰(zhàn)》,是本人在學(xué)習(xí)JavaEE框架的時(shí)候閱讀的第一本書,本書對(duì)于框架及相關(guān)基礎(chǔ)知識(shí)講述的比較詳細(xì)和淺顯,適合初學(xué)者和需要全面了解JavaEE知識(shí)的人群。
本文內(nèi)容為本書第四章
Struts2類型轉(zhuǎn)換
1.Struts2內(nèi)建的類型轉(zhuǎn)換器
Struts2內(nèi)建了字符串類型和如下類間的轉(zhuǎn)換器
boolean和Boolean轉(zhuǎn)換
char和Character轉(zhuǎn)換
int和Integer轉(zhuǎn)換
long和Long轉(zhuǎn)換
float和Float轉(zhuǎn)換
double和Double轉(zhuǎn)換
字符串和Date轉(zhuǎn)換
以上類型作為http請(qǐng)求參數(shù)時(shí),無須人為進(jìn)行類型轉(zhuǎn)換,struts2將自動(dòng)進(jìn)行類型轉(zhuǎn)換。
2.基于OGNL的類型轉(zhuǎn)換
struts2可以將普通請(qǐng)求參數(shù)轉(zhuǎn)換成復(fù)合類型的對(duì)象。
Action類中直接使用符合類型的對(duì)象即可
public class LoginAction{
private User user;
//setter,getter方法
public String execute() throws exception{
//todo
}
}
(1)因?yàn)镾truts2將通過反射創(chuàng)建一個(gè)復(fù)合類(User)的實(shí)例,因此系統(tǒng)必須為該復(fù)合類提供無參數(shù)構(gòu)造
(2)如果希望使用user.name請(qǐng)求參數(shù)的形式為Action實(shí)例的user屬性的name賦值,則必須為user復(fù)合類提供setName()方法,因?yàn)閟truts2是通過setter方法賦值的
Action中的符合類型也可以Map或者List,OGNL書寫如下:
Map形式:
List形式:
3.自定義類型轉(zhuǎn)換
再某些特殊情況下,框架不知道如何把一個(gè)字符串轉(zhuǎn)換成對(duì)應(yīng)的復(fù)合對(duì)象,比如:將字符串a(chǎn)bc,xyz轉(zhuǎn)換成一個(gè)User實(shí)例,其中abc為name,xyz為pass。這時(shí)就需要自定義類型轉(zhuǎn)換。
自定義類型轉(zhuǎn)換需要實(shí)現(xiàn)TypeConverter或者繼承DefaultTypeConverter、StrutsTypeConverter
(1)convertValue方法負(fù)責(zé)完成類型轉(zhuǎn)換,這個(gè)轉(zhuǎn)換是雙向的,通過判斷toType類型即可判斷轉(zhuǎn)換方向,toType類型是需要轉(zhuǎn)換的目標(biāo)類型
(2)convertValue方法參數(shù),第一個(gè)參數(shù):context是類型轉(zhuǎn)換環(huán)境的上下文;第二個(gè)參數(shù):value是需要轉(zhuǎn)換的參數(shù);第三個(gè)參數(shù):toType是轉(zhuǎn)換后的目標(biāo)類型
(3)convertValue的返回值就是類型轉(zhuǎn)換后的值,該值的類型也會(huì)隨著轉(zhuǎn)換方向的不同而不同
(4)當(dāng)把字符串轉(zhuǎn)換成復(fù)合類型時(shí),value是一個(gè)字符串?dāng)?shù)組
4.注冊(cè)類型轉(zhuǎn)換器
需要將類型轉(zhuǎn)換器注冊(cè)在應(yīng)用中,struts框架才可以正常使用。
注冊(cè)方式如下:
(1)注冊(cè)局部類型轉(zhuǎn)換器:局部類型轉(zhuǎn)換器僅對(duì)某個(gè)Action的屬性起作用
在文件Action-conversion.properties中加入
=
(2)注冊(cè)全局類型轉(zhuǎn)換器:全局類型轉(zhuǎn)換器對(duì)所有Action特定類型的屬性都會(huì)生效
在文件xwork-conversion.properties中加入(在應(yīng)用的類加載路徑下)
=
手動(dòng)實(shí)現(xiàn)輸入校驗(yàn)
1.重寫validate()方法
在validate方法中,一旦校驗(yàn)失敗通過addFieldError方法添加進(jìn)FieldError中。如果FieldError不為空,將自動(dòng)跳轉(zhuǎn)到input邏輯視圖。
2.重寫validateXxx()方法
如果我們的輸入校驗(yàn)只想驗(yàn)證某個(gè)處理邏輯,則需要提供一個(gè)validateXxx()方法,其中xxx是邏輯處理方法的方法名。其他內(nèi)容同上
下圖總結(jié)了類型轉(zhuǎn)換和輸入校驗(yàn)的整個(gè)處理流程:
使用struts2實(shí)現(xiàn)文件上傳
1.struts2的文件上傳
struts2默認(rèn)使用的是Jakarta的Common-FileUpload文件上傳框架,需要引入如下兩個(gè)jar包:commons-io.jar、commons-fileupload.jar
2.實(shí)現(xiàn)文件上傳的Action
(1)表單enctype屬性設(shè)置為multipart-form-data
(2)表單中增加file上傳組件
(3)Action中需要單個(gè)屬性來封裝文件域信息
類型File的xxx屬性封裝了該文件域?qū)?yīng)的文件內(nèi)容
類型String的xxxFileName屬性封裝了該文件的文件名
類型String的xxxContentType屬性封裝了該文件的文件類型
類型String的savePath屬性用來配置文件的存儲(chǔ)位置
3.配置文件上傳的Action
上面配置除了使用元素設(shè)置了savePath外,與其他action配置幾乎一樣
4.手動(dòng)實(shí)現(xiàn)文件過濾
(1)在Action中定義一個(gè)專門用于進(jìn)行文件過濾的方法,改方法的方法名任意
(2)在Action中增加一個(gè)驗(yàn)證文件的屬性,第一步中的方法判斷這個(gè)屬性的值
(3)利用struts2輸入校驗(yàn)來實(shí)現(xiàn)驗(yàn)證,如validate或validateXxx
5.攔截器實(shí)現(xiàn)文件過濾
struts2提供了一個(gè)文件上傳攔截器,通過配置該攔截器可實(shí)現(xiàn)文件過濾。攔截器名稱fileupload,驗(yàn)證失敗后會(huì)自動(dòng)轉(zhuǎn)入input邏輯視圖。如下:
allowedTypes:指定允許上傳的文件類型,多個(gè)文件類型用逗號(hào)隔開
maximunSize:制定允許上傳的文件大小,單位字節(jié)
PS:注意默認(rèn)攔截器defaultStack必須配置
6.輸出錯(cuò)誤提示
國際化資源文件配置:
struts.messages.error.content.type.not.allowed=您上傳的文件類型只能是圖片
struts.messages.error.file.too.large=您要上傳的文件太大
struts.messages.error.uploading=文件上傳錯(cuò)誤
使用Struts2控制文件下載
1.實(shí)現(xiàn)文件下載Action
(1)在頁面中寫入文件超鏈接
(2)在Action中定義一個(gè)返回值類型是InputStream的方法
2.配置Action
需要配置一個(gè)類型為stream的結(jié)果
屬性說明如下:
contentType:指定被下載文件的文件類型
inputName:指定被下載文件的入口輸入流
contentDisposition:指定下載的文件名
bufferSize:指定下載文件的緩沖大小
詳解Struts2的攔截器機(jī)制
1.攔截器在Struts2中的作用
可以把Struts2理解成一個(gè)空容器,大量的內(nèi)建攔截器完成了該框架的大部分操作。Struts2攔截器是可插拔式設(shè)計(jì),攔截器有配置文件進(jìn)行管理,容易擴(kuò)展和維護(hù)。Struts2框架的絕大部分功能都是通過攔截器來完成的,當(dāng)StrutsPrepareAndExecuteFilter攔截到用戶請(qǐng)求后,大量攔截器將會(huì)對(duì)用戶請(qǐng)求進(jìn)行處理,然后才會(huì)調(diào)用用戶開發(fā)的Action來處理用戶請(qǐng)求。
Struts2已經(jīng)默認(rèn)啟動(dòng)了大量通用功能的攔截器,只要我們配置Action的package繼承了struts-default包,攔截器就會(huì)起作用。
2.Struts內(nèi)建的攔截器
Struts2內(nèi)建了大量的攔截器,這些攔截器以name-class對(duì)的形式配置在struts-default.xml文件中,其中那么是攔截器的名字,class指定了攔截器的實(shí)現(xiàn)類。如果我們的package繼承了Struts2的默認(rèn)struts-default包,則可以自由使用如下攔截器。
alias:實(shí)現(xiàn)在不同請(qǐng)求中相似參數(shù)別名的轉(zhuǎn)換
autowiring:這是自動(dòng)裝配攔截器,用于struts2和spring整合時(shí),Struts2可以使用自動(dòng)裝配的方式在來訪問Spring容器中的Bean
chain:構(gòu)建一個(gè)Action鏈,使當(dāng)前的Action可以訪問前一個(gè)Action屬性
conversionError:負(fù)責(zé)處理類型轉(zhuǎn)換錯(cuò)誤的攔截器
createSession:負(fù)責(zé)創(chuàng)建一個(gè)HttpSession對(duì)象
debugging:當(dāng)使用開發(fā)模式時(shí),提供更多的調(diào)試信息
execAndWait:后臺(tái)執(zhí)行Action,負(fù)責(zé)將等待畫面發(fā)送給用戶
exception:負(fù)責(zé)處理異常,將異常映射為結(jié)果
fileUpload:用于文件上傳,負(fù)責(zé)解析表單中的文件域內(nèi)容
i18n:國際化攔截器,負(fù)責(zé)把所選語言區(qū)域放入用戶Session
logger:負(fù)責(zé)日志記錄的攔截器
model-driven:用于模型驅(qū)動(dòng)的攔截器,當(dāng)某個(gè)Action實(shí)現(xiàn)了ModelDriven接口,它負(fù)責(zé)把getModel()方法的結(jié)果堆入值棧中
params:最基本的攔截器,負(fù)責(zé)解析HTTP請(qǐng)求中的參數(shù),并將參數(shù)值設(shè)置成Action對(duì)應(yīng)的屬性值
prepare:如果Action實(shí)現(xiàn)了Preparable接口,將會(huì)調(diào)用攔截器的prepare()方法
static-params:攔截器負(fù)責(zé)將xml中標(biāo)簽下標(biāo)簽中的參數(shù)傳入action
scope:范圍轉(zhuǎn)換攔截器,將Action狀態(tài)信息保存到HttpSession范圍或者ServletContext范圍
servlet-config:通過攔截器Action可直接訪問Servlet API
timer:攔截器負(fù)責(zé)輸出Action執(zhí)行時(shí)間
token:用于阻止重復(fù)提交
token-session:用于阻止重復(fù)提交,把token保存在HttpSession中
validation:通過執(zhí)行在xxxAction-validation.xml中定義的校驗(yàn)器,實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)
workflow:負(fù)責(zé)調(diào)用Action類中的validate方法,校驗(yàn)失敗則返回input邏輯視圖
3.配置攔截器
在struts.xml中使用元素完成配置
參數(shù)值
也可以定義攔截器棧,來組合多個(gè)攔截器,使用元素
攔截器棧也可以包含攔截器棧
4.使用攔截器
攔截器的攔截行為將會(huì)在Action的請(qǐng)求處理方法之前被執(zhí)行。攔截器的使用如下:
在元素中配置了三個(gè)攔截器defaultStack、mysimple、later
5.配置默認(rèn)攔截器
一旦我們?yōu)槟硞€(gè)Action顯式應(yīng)用了某個(gè)攔截器,則默認(rèn)攔截器不會(huì)生效,如果需要使用默認(rèn)攔截器,必須手動(dòng)配置該攔截器。
也可以通過元素來配置默認(rèn)攔截器,使攔截器在包下所有Action中生效
6.實(shí)現(xiàn)攔截器類
自定義攔截器需要開發(fā)自己的攔截器類并實(shí)現(xiàn)Interceptor接口
接口包含3個(gè)方法:
init():該方法用于初始化資源
destroy():該方法用于銷毀之前初始化的資源
intercept(ActionInvocation invocation):該方法用于實(shí)現(xiàn)攔截動(dòng)作,該方法返回一個(gè)字符串作為邏輯視圖,并不會(huì)調(diào)用被攔截的Action,需通過invoke方法繼續(xù)執(zhí)行
如下圖:
7.攔截方法的攔截器
默認(rèn)自定義的攔截器會(huì)攔截Action內(nèi)的所有方法,如果只想攔截指定方法,需要繼承MethodFilterInterceptor,類提供了一個(gè)doIntercept(ActionInvocation invocation)抽象方法,可重寫此方法:
在MethodFilterInterceptor類中,增加了兩個(gè)額外方法,用戶限定攔截的Action方法
setExcludeMethods(Stirng excludeMethods):排除需要過濾的方法
setIncludeMethods(String includeMethods):設(shè)置需要過濾的方法
如果同在在excludeMethods和includeMethods中列出,則該方法會(huì)被攔截
上面的兩個(gè)參數(shù)需要在配置攔截器時(shí)設(shè)置
要攔截的方法(多個(gè)逗號(hào)隔開)
不攔截的方法(多個(gè)逗號(hào)隔開)
8.攔截器鏈中攔截器的執(zhí)行順序
在Action的控制方法執(zhí)行前,位于攔截器鏈前面的攔截器先發(fā)生作用;在Action的控制方法執(zhí)行后,位于攔截器鏈前面的攔截器后發(fā)生作用。
總結(jié)
以上是生活随笔為你收集整理的nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界服务器的文件名叫什么,我的世界
- 下一篇: 常用并发工具类(线程池)