惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - 爱跳舞的程序员

freemarker对数字格式的处理 FilePathJaxbUtil(xml文件转JavaBean对象工具) freemarker对日期的处理 PL_SQL常用快捷键 将博客搬至CSDN css+jquery右下角弹框提示框(工作需要就开发调式了) textarea文本居中的问题 bat批量复制文件(一键打包更新代码,避免手动一个个复制) url特殊字符传递参数解决方法(特指超链接) js 拼接字符串带变量(js方法参数单双引号拼接的问题记录) 表单提交由submit改为异步的方式 解决复制select下拉框时 值没法复制的问题 Jquery操作select汇总 博文阅读密码验证 - 博客园 ztree树添加右击菜单 ligerLayout布局(左右分栏) 模糊查询+首字母查询组合框 jquery之ztree树入门(输出最简单树形) java 根据word xml模板生成word(个人v2版本)
displayTag解决中文排序、和翻页查询出错的问题
爱跳舞的程序员 · 2023-04-21 · via 博客园 - 爱跳舞的程序员

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

后端解码