displayTag解决中文排序、和翻页查询出错的问题

文章介绍了displayTag在处理中文查询条件时遇到的翻页、排序和导出文件乱码问题,并提供了两种解决方案。一种是修改服务器配置,如Tomcat的URIEncoding,但此方法不适用于所有容器。另一种是通过修改displaytag.js,对URL参数进行二重编码,然后在后端进行解码,以此来解决中文支持的问题。
摘要由CSDN通过智能技术生成

displayTag对中文的支持不好,比如如果查询条件中有中文,就无法翻页,无法对中文排序,将中文导出为指定文件时出现乱码等。这些问题有时候会让人很郁闷,有时候逼得你要去修改它的源代码。

对于中文无法翻页、排序。

网上的方法:

      是修改Tomcat下的server.xml文件。找到HTTP的Connector标签,在里面添加一项URIEncoding="..",引号里面的内容取决于你的页面编码,比如可以是GBK,UTF8等。

      按网上方法 本地修改tomcat配置文件测试没效果,而且这个只是针对tomcat,其他容器比如weblogic就不适用了

本人方法:

      修改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;
    }    
displaytag.js中添加新方法
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);
    
}
修改displaytag中的goPage和changePageSize方法
//调用    
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;
    }
后端解码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱跳舞的程序员.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值