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;
    }
View Code

 

 

本人方法二:

      修改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;
    }
后端解码

 

posted @ 2023-04-21 10:19  爱跳舞的程序员  阅读(45)  评论(0编辑  收藏  举报