seasun |
|
|||
在不斷模仿、思考、總結(jié)中一步一步進(jìn)步! |
公告
日歷
導(dǎo)航常用鏈接隨筆分類
good blog author積分與排名
最新評論
閱讀排行榜
|
項(xiàng)目中需要將查詢結(jié)果導(dǎo)出成Excel,由于使用了DisplayTag,知道這個(gè)標(biāo)簽庫具有導(dǎo)出Excel的功能,不過之前一直沒有使用過,剛好今天體驗(yàn)一把。
使用實(shí)在是太Easy了,只需要在display:table標(biāo)簽上設(shè)置一下參數(shù),export="true",就可以在表格下邊看到導(dǎo)出Excel的鏈接了,其他什么都不用做! 對他的實(shí)現(xiàn)方式有點(diǎn)好奇,遂查看一下這個(gè)導(dǎo)出功能的鏈接,乖乖,那是相當(dāng)簡潔啊,就是把我這個(gè)頁面的全部參數(shù)添加到URL里,然后附加上了幾個(gè)奇怪?jǐn)?shù)字組成的參數(shù),估計(jì)就是DisplayTag用來識別我要做導(dǎo)出操作的了。從這個(gè)鏈接來看,做導(dǎo)出操作時(shí)還是要到我這個(gè)Action去進(jìn)行邏輯處理,但我這個(gè)Action輸出的內(nèi)容可是一個(gè)完整的HTML,而不是Excel啊,他是怎么實(shí)現(xiàn)的呢?帶著個(gè)大大的問號,開始去挖源代碼。順便提一下,m2eclipse確實(shí)方便,不但幫我管理了項(xiàng)目的依賴,還能幫我把源代碼拽下來關(guān)聯(lián)到相應(yīng)的jar,所以我直接在項(xiàng)目依賴?yán)锩嬲业絛isplaytag.jar,就可以查看源代碼了。 代碼其實(shí)很簡單,其實(shí)是利用了ServletRsponse的緩存機(jī)制,當(dāng)我們調(diào)用response.getWriter().print()方法時(shí),打印的內(nèi)容是不會立即發(fā)送到客戶端的,在發(fā)送到客戶端之前,還可以對其進(jìn)行操作,哈哈,有點(diǎn)明白了吧?DisplayTag就是利用了這個(gè)原理,在TableTag這個(gè)類中,導(dǎo)出Excel時(shí),趁ServletResponse還沒有提交到客戶端,先執(zhí)行了一下response.reset()和pageContext.getOut().clearBuffer(),這樣就把前面jsp里面輸出的所有內(nèi)容都清除掉了~然后再使用response.setContentType()重新設(shè)置文件類型,輸出表格內(nèi)容,完事了再返回Tag.SKIP_PAGE,這樣JSP里面剩下的內(nèi)容也不會再輸出了,客戶端得到的就完全是在DisplayTag控制下的內(nèi)容了,牛吧! 其實(shí)這個(gè)response.reset以前也見過,讀servlet API文檔時(shí)也看過方法的解釋,但如果不是今天看這個(gè)Display的源代碼,還真不會想到這樣子來應(yīng)用,看來這就是理論和實(shí)踐的差距呀!!! PS:上面這種方法,只適用于輸出文本內(nèi)容。DisplayTag自帶的Excel導(dǎo)出工具其實(shí)就是輸出了一個(gè)csv文件,把擴(kuò)展名改成xls了而已。如果要輸出真正的xls文件獲者PDF這樣的二進(jìn)制文件,使用上面的方法在某些中間件上就會有問題了。因?yàn)樵瓌t上response.getOutputStream方法是只能被調(diào)用一次的,這在進(jìn)入jsp處理時(shí)就被調(diào)用了,而輸出PDF文件這樣二進(jìn)制流時(shí)又必須使用這個(gè)方法,那就出錯(cuò)了。DisplayTag很巧妙的提供了一個(gè)Filter,對標(biāo)準(zhǔn)的ServletRepsonse做了一個(gè)包裝(Wrap),在執(zhí)行Export導(dǎo)出時(shí),如果是jsp等其他請求執(zhí)行的response.getOutputStream,就返回自己的一個(gè)緩存的OutputStream,而不是真正去調(diào)用容器的這個(gè)方法。直到執(zhí)行Export時(shí),才去調(diào)用容器的方法,保證這個(gè)response.getOutputStream只執(zhí)行一次。 DisplayTag的地址:http://displaytag.sourceforge.net/1.2/index.html,很簡單,很強(qiáng)大,強(qiáng)烈推薦,可以少寫N多表格和分頁標(biāo)簽
評論:
|
![]() |
|
Copyright © shiwf | Powered by: 博客園 模板提供:滬江博客 |