displayTag解决中文排序、和翻页查询出错的问题
displayTag对中文的支持不好,比如如果查询条件中有中文,就无法翻页,无法对中文排序,将中文导出为指定文件时出现乱码等。这些问题有时候会让人很郁闷,有时候逼得你要去修改它的源代码。
对于中文无法翻页、排序。
网上的方法:
是修改Tomcat下的server.xml文件。找到HTTP的Connector标签,在里面添加一项URIEncoding="..",引号里面的内容取决于你的页面编码,比如可以是GBK,UTF8等。
按网上方法 本地修改tomcat配置文件测试没效果,而且这个只是针对tomcat,其他容器比如weblogic就不适用了
本人方法一:
对前端传过来的有中文的参数进行转码String xxx= new String (xxx.getBytes("iso8859-1"),"UTF-8");
这种方法只能解决少次的排序,如果疯狂点击排序,那么地址栏参数会越来越多,连续点个五六次就报错了

@RequestMapping("openGet") public ModelAndView openGet(HttpServletRequest request, HttpServletResponse response) throws Exception { String bdzmc = request.getParameter("bdzmc"); System.out.println("----------------------------------"+bdzmc); Pattern pattern = Pattern.compile("^[0-9a-zA-Z]+[\\u4e00-\\u9fa5]+$"); Matcher matcher = pattern.matcher(bdzmc); boolean matches = matcher.matches(); while (!matches) { bdzmc = new String (bdzmc.getBytes("iso8859-1"),"UTF-8"); matcher = pattern.matcher(bdzmc); matches = matcher.matches(); } System.out.println("----------------------------------"+bdzmc); QueryFilter qf = new QueryFilter(request, "keywordresultItem"); qf.addFilter("bdzmc", bdzmc); List<KeyWordResult> list =keywordresultService .getAll(qf); ModelAndView mv = this.getAutoView().addObject("keywordresultList", list).addObject("bdzmc", bdzmc); return mv; }
本人方法二:
修改displaytag.js实际上就是对url中的参数添加加密, value = encodeURI(encodeURI(value)); 对参数进行二重编码,然后后台解密val = URLDecoder.decode(val, "UTF-8");
样例:

//displaytag.js中添加新方法,用来对超链接中的参数进行编码 function handleParams(myUrl){ //中文翻页问题 if(myUrl.indexOf("ytdyjykdbjgb")){ if(myUrl.indexOf('?')!=-1&&myUrl.indexOf('&')!=-1){ var strsWh = myUrl.split("?"); //取得问号前完整连接 var url1=strsWh[0]; var url2=strsWh[1]; // alert(strsWh[0]); var args={}; var url3 = url2.split("&"); // console.log("url3="+url3); for (var i = 0; i < url3.length; i++) { var eq = url3[i].indexOf('='); if(eq == -1) continue; var name = url3[i].substring(0,eq); //提取name var value = url3[i].substring(eq+1); //提取value // console.log("name="+name); //console.log("val="+value); var patt=/Q_.*_S/g; if(name.indexOf("Q_")!=-1&&name.indexOf("_S")!=-1){ if(value!=""&&value!=undefined){ // alert(name); // alert(value); value = encodeURI(encodeURI(value)); //对value进行解码 // console.log("name="+name+",val="+value); } } args[name] = value; //存储为属性 } myUrl=url1+"?"; for (let key in args) { if (args.hasOwnProperty(key)) { // console.log(args[key]) // //alert("key="+key+",val="+args[key]); myUrl+=(key+"="+args[key]+"&"); } } myUrl=myUrl.substring(0,myUrl.length-1); //去掉最后一个多余的& // alert(myUrl); } return myUrl; }

function goPage(n,tableIdCode){ var url = replacecurrentPage($("#_nav"+tableIdCode).attr('href'),n,tableIdCode); url = replagePageSize(url,$("#oldPageSize"+tableIdCode).val(),tableIdCode); var myUrl =replageOldPageSize(url,$("#oldPageSize"+tableIdCode).val(),tableIdCode); //alert(myUrl); location.href= handleParams(myUrl); } function changePageSize(sel,tableIdCode){ var url = replagePageSize($("#_nav"+tableIdCode).attr('href'),sel.value,tableIdCode); url = replacecurrentPage(url,$("#currentPage"+tableIdCode).val(),tableIdCode); //location.href=replageOldPageSize(url,$("#oldPageSize"+tableIdCode).val(),tableIdCode); var myUrl=replageOldPageSize(url,$("#oldPageSize"+tableIdCode).val(),tableIdCode); location.href= handleParams(myUrl); }

//调用 String Q_bdzmc_S = handleUrlParamsTwo(request,"bdzmc", queryFilter); /** * @param param * @param queryFilter * @return 对包含Q_和_S 的查询条件,进行解码 * @throws UnsupportedEncodingException * String * */ public String handleUrlParamsTwo(HttpServletRequest request, String key, QueryFilter queryFilter) throws Exception { Map<String, Object> filters = queryFilter.getFilters(); String val = request.getParameter("Q_" + key + "_S"); System.out.println("val=" + val); if (val != null && val != "") { int i = 0; while (val.indexOf("%") != -1) { i++; val = URLDecoder.decode(val, "UTF-8"); if (i == 300) { break; } } System.out.println("val=" + val); // Map<String, Object> filters = queryFilter.getFilters(); // filters.put("Q_" + key + "_S", val); filters.put(key, val); queryFilter.setFilters(filters); } else { } System.out.println(filters.toString()); return val; }