Struts2框架不僅提供了一系列的攔截器幫我們完成驗(yàn)證,參數(shù)注入的任務(wù),還可以使用不同的type 完成不同的功能,接下來(lái)解析一下使用配置文件Action中結(jié)果類型為stream時(shí)完成文件下載的功能。
需要理解的是,Action在值棧中,而ognl的根就是值棧。這就是為什么在配置文件中可以使用ognl表達(dá)式來(lái)獲取Action的屬性(Action中要實(shí)現(xiàn)對(duì)應(yīng)屬性的get方法)。
步驟一:配置struts.xml配置文件

配置結(jié)果類型為stream
步驟二:配置參數(shù)
? ? ?1)配置ContentType:配置需要下載文件的web類型,在web.xml中尋找zip對(duì)應(yīng)的mine-type
? ? ?2)配置inputName:配置流的名稱,需要在Action提供對(duì)應(yīng)的Set(),Get()方法。這個(gè)流就是給瀏覽器用戶下載的流。
? ? 在Action中完成相關(guān)代碼:
(注意需要使用ServletContext來(lái)獲得流)

? ? ?3)配置contentDisposition:
? ? ?該內(nèi)容需要放在響應(yīng)頭中,而響應(yīng)頭只能使用拉丁碼表,因此,如果我們的文件名稱為中文,則需要使用URLEncoder編碼對(duì)中文進(jìn)行編碼才能發(fā)送。
在此,我們是用ognl表達(dá)式來(lái)完成這一需求。
<param name="contentDisposition">
? ? ?attachment;filename="${filename}"?
</param>
? ? ?注意:a.此處不是EL表達(dá)式,EL表達(dá)式只在jsp頁(yè)面出現(xiàn),不在配置文件中出現(xiàn)。
? ? ? ? ? ? ? ? ?b.ognl表達(dá)式中根是值棧,值棧中放的是Action
? ? ? ? ? ? ? ? ?c.配置文件中使用ognl表達(dá)式的格式是${},在括號(hào)中填寫ognl。由于沒有加#,所以是從根,即Action中取值
? ? ? ? ? ? ? ? ?d.在Action中添加filename屬性,并對(duì)其完成轉(zhuǎn)碼。

? ? ?4)配置bufferSize:設(shè)定緩沖區(qū)大小
到此已經(jīng)完成了所有工作,運(yùn)行后的結(jié)果為:
