以往,在webwork中實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)為csv文本時(shí),采用的是之前自己實(shí)現(xiàn)的csv result,但是這個(gè)實(shí)現(xiàn)有個(gè)缺陷就是對象嵌套不支持,而且需要構(gòu)造dto遍歷獲取列表進(jìn)行列表字段顯示的封裝,且在webwork配置文件要羅列出需要導(dǎo)出的字段,過于繁瑣。
于是產(chǎn)生了采用直接用freemarker作為導(dǎo)出csv文件模板的想法,這樣后臺(tái)只做查詢列表數(shù)據(jù)的獲取,配置文件只需要定位到指定freemarker模板,而且導(dǎo)出排版可以在freemarker中更靈活的得到控制。
其中,在中文亂碼問題上尤其需要注意的是,一定要設(shè)置模板文件的編碼。
以下是實(shí)現(xiàn)實(shí)例:
1
2 public String sampelExport()throws Exception{
3 samplelist = SampleService.getAll();
4 return SUCCESS;
5 }
//samplelist的getter不要忘記哦。
SampleObject具有name屬性,類型為String,createDate屬性,類型為java.util.date,emails屬性,類型為java.util.list,為一個(gè)email封裝對象列表,status屬性,類型為Enum,提供按locale獲取顯示內(nèi)容方法。
1 <action name="sampleexport" method="sampleExport"
2 class="org.hook.webwork.SampleExportAction">
3 <result type="freemarker" name="success">
4 template/default/sampleexport.ftl
5 <result>
6 </action>
7
1 <#ftl encoding="GBK">
2 <#if response?exists>${response.setHeader("Content-Disposition","attachment; filename=sample_export.csv")}${response.setHeader("Cache- Control", "cache")}${response.setContentType("text/plain; charset=GBK")}${action.getText('org.hook.sampleobject.name')},
${action.getText('org.hook.sampleobject.createdate')},${action.getText('org.hook.sampleobject.emails')},
${action.getText('org.hook.sampleobject.status')}</#if>
3 <#if samplelist?exists>
4 <#list samplelist as sampleobject>"${sampleobject.name}","${sampleobject.createDate?date}","<#list sampleobject.emailss as email>${email.fullinfo} </#list>",<#if sampleobject.status?exists&&sampleobject.status.getValue(locale)?exists>
${sampleobject.status.getValue(locale)}</#if>
5 </#list>
6 </#if>
注意:沒有行號的地方說明代碼不要換行,要不導(dǎo)出的文件位置會(huì)有誤差。