最近在做的一个项目,前台依然是使用displaytag,由于项目需要,需要对记录进行排序和导出报表,因为数据不允许分页,提交过来的参数信息又较多,所以在Displaytag中,默认取request中的数据再次导出报表和排序,就导致URL 过长,导致导出和排序失败.
在其他的浏览器都正常.因为DisplayTag在处理导出报表和排序默认是Get处理请求的,没办法,到google搜了一下,发现有人解决了这个问题.见(http://jira.codehaus.org/browse/DISPL-377)
试着修改这个类,,因为处理为Form Post提交数据,一切正常.但是想想source code被修改了,会给以后带来一定的风险.想个1天也没什么办法.感觉只能post才能处理大量的数据.
postForm.append("<form name=\"form" + uid
+ "\" method=\"post\" action=\""
+ sortHref.getBaseUrl() + "\">");
for (int idx = 0; idx < mapKey.length; idx++) {
String value = "";
// Modified by Indicia 07-mar-2007 - Begin
if (sortHref.getParameterMap().get(mapKey[idx]) instanceof Object[]) {
Object[] values = (Object[])sortHref.getParameterMap().get(mapKey[idx]);
for(int j=0; j < values.length; j++) {
value = ((Object)values[j]).toString();
try {
postForm.append("<input type=\"hidden\" name=\""
+ mapKey[idx] + "\" value=\"" + URLDecoder.decode(value, "ISO-8859-1") + "\">");
} catch (UnsupportedEncodingException ignore) {}
}
} else {
value = sortHref.getParameterMap().get(
mapKey[idx]).toString();
try {
postForm.append("<input type=\"hidden\" name=\""
+ mapKey[idx] + "\" value=\"" + URLDecoder.decode(value, "ISO-8859-1") + "\" title=\""+value+"\"/>");
} catch (UnsupportedEncodingException ignore) {}
}
// Modified by Indicia 07-mar-2007 - End
}
postForm.append("</form>");
Href postExportHerf = (Href) sortHref.clone();
postExportHerf.setFullUrl("javascript:document.forms['form" + uid
+ "'].submit();");
本来想这个样子,反正解决了问题,但是想想,好象默认的Session中的数据不会出现在displaytagUrl后面,就试着改了下代码,发现果然可行.把较长的数据放在session中,然后在displaytag前台中使用excludedParams="datasubmit去除那些需要长的需要再次提交给后台的数据.结果发现果然导出报表和排序正常了.
//first get it from request
//if is null get from the session
String dataSubmit=request.getParameter("datasubmit");
if(dataSubmit==null)
{
dataSubmit=(String)request.getSession().getAttribute("datasubmit");
}
request.getSession().setAttribute("datasubmit", dataSubmit);
<display:table name="states" sort="list" defaultsort="1" id="element" requestURI="state.html" excludedParams="datasubmit">
<display:column property="id" title="ID" sortable="true" sortName="id" />
<display:column property="country_id" sortable="true" sortName="country_id" title="First Name" />
</display:table>