关于URL转码问题

25 篇文章 0 订阅

最近遇到这么一个问题,一个是查询乱码(16进制字符串),另外一个是URL传参需要对参数转码,因为传的参数是一串中文字符,所以需要处理。前台转码倒是方便,一种情景是直接在请求发送触发的事件里面直接转码,然后跳到后台里面,然后在action里面再转码一次。在这个过程中遇到一个问题如代码所示,

前台代码:

$(document).ready(function(){//初始化查询
    $("#img_sousuo").click(function(){
     $("#leaderName").val(encodeURI($("#leaderName").val()));
     $("#activityTitle").val(encodeURI($("#activityTitle").val()));
     $("#activityContent").val(encodeURI($("#activityContent").val()));
                document.getElementById("myTableForm").submit();
    });
   });

<s:form id="myTableForm" action="leaderAct!list.action" method="get">

<table>

 <tr>
            <td width="4%" align="center"  class="biao_bg1">
            <img id="img_sousuo" style="cursor: hand;" src="<%=root%>/images/ico/sousuo1.gif" width="43" height="24" >
            </td>
           
            <td width="10%" height="21" class="biao_bg1" align="right">
          <input id="leaderName" name="model.leaderName" type="hidden" value="${model.leaderName}">
         </td>
         <td class="td1"  align="left">
          <s:select list="leaderNameList" listKey="dictItemCode" listValue="dictItemName" headerKey="" headerValue="请选择"
          id="leaderId" name="model.leaderId" οnchange="changeLeaderName(this)" />
         </td>
             
              <td width="20%"  class="biao_bg1">
              <input name="activityTitle" id="activityTitle" type="text" 
              style="width=100%" class="search" title="" value="${model.activityTitle}">
              </td>
             
              <td width="30%"  class="biao_bg1">
              <input name="activityContent" id="activityContent" type="text"
              style="width=100%" class="search" title="" value="${model.activityContent}">
              </td>
              <td width="26%" align="center" class="biao_bg1">
              <strong:newdate  name="model.activityTime" id="activityTime" width="100%" skin="whyGreen" isicon="true"  classtyle="search" title=""/></td>        
              <td class="biao_bg1">&nbsp;</td>
            </tr>

</table>

</s:form>

后台代码:

action 中

leaderNameList=dictservice.getItemsByDictValue("FGJTLD");//获取字典项

  userId= userService.getCurrentUser().getUserId();
  List<TUumsBaseRole> roleList = roleManager.getUserRoleInfosByUserId(userId, Const.IS_YES);
  if(!roleList.isEmpty()){//信息员录入信息页面
   for (Iterator<TUumsBaseRole> it = roleList.iterator(); it.hasNext();) {
    TUumsBaseRole role = it.next();
    if(role.getRoleName().equals("活动录入员")){
     page=manager.getPageList(page, model);
     return "xxylist";
    }
    else if(role.getRoleName().equals("厅长")||role.getRoleName().equals("副厅长")||role.getRoleName().equals("厅办工作人员")){
     page=manager.getPageList(page, model);
     return "list";
     }
    }
   }

manager中:

  public Page<ToaLeaderAct> getPageList(Page<ToaLeaderAct> page,ToaLeaderAct model)throws SystemException,ServiceException{
     try{
       //查询参数获取
       String leaderName=model.getLeaderName()==null?"":model.getLeaderName();
       String activityTitle=model.getActivityTitle()==null?"":model.getActivityTitle();
       String activityContent=model.getActivityContent()==null?"":model.getActivityContent();
       
       
       StringBuffer hql=new StringBuffer();
       hql.append("from ToaLeaderAct t where 1=1");
       //站位符参数数组集合
       List paramList = new ArrayList();
         if(!"".equals(leaderName)) { 
           leaderName=java.net.URLDecoder.decode(leaderName);
        hql.append(" and t.leaderName = ? ");
        paramList.add(leaderName);
       }
       if(!"".equals(activityTitle)) { 
       activityTitle=java.net.URLDecoder.decode(activityTitle);

          hql.append("and t.activityTitle like ?")
           paramList.add("%"+activityTitle+"%");
       }
       if(!"".equals(activityContent)){
        activityContent=URLDecoder.decode(activityContent);
        hql.append(" and t.activityContent like ? " );
        paramList.add("%"+activityContent+"%");
       }
       if(model.getActivityTime()!=null&&!"".equals(model.getActivityTime())){//根据一个时间查询一周的活动
           Calendar cal=Calendar.getInstance();
           cal.setTime(model.getActivityTime());
           int k=cal.get(Calendar.DAY_OF_WEEK);
           Date cal1 = null;
           Date cal2=null;
           if(k>=1){
            cal.add(cal.DATE,-k);
               cal1=cal.getTime();
               cal.add(cal.DATE, 7);
               cal2=cal.getTime();
           }else{
            cal1=cal.getTime();
            cal.add(cal.DATE, 7);
            cal2=cal.getTime();
           }
           
           hql.append(" and t.activityTime>? and t.activityTime<?");
           paramList.add(cal1);
           paramList.add(cal2);
          }
       hql.append(" order by t.activityTime desc");
       
       return leaderDao.find(page, hql.toString(),paramList.toArray());
     }catch(ServiceException e){
      throw new ServiceException(MessagesConst.find_error,new Object[] {"查询活动列表"});
     }
     
     
    }

后来使劲调试还是发现在Linux系统中转码问题无法实现(Windows环境正常),前台转码有效,后台失效了。查询不出来东西,于是去掉了manager中的转码,在action中转码

如图所示:

之后才有效。之前Linux环境下一直都是16进制码,Windows环境下不转码也是正常的。

情景二:ajax传参的过程中

<div class="conld04">
         <dl class="conldlist">
           <dt class="tit"><span class="dtmore"><a style="font-size:12px; font-weight:normal; padding-right:12px;" href="#" οnclick="refreshWorkByTitle('<%=path%>/leaderAct/leaderAct!myList.action','办公门户')">更多>></a></span>活动</dt>
           <dd style="height:120px; overflow:hidden;">
             <div class="cnrglists fle" type="1" id="ldhdcontent">
             </div>
                     <script type="text/javascript">
         var ldhdcontent = document.getElementById("ldhdcontent");
         function ref_ldhd(){
          $.ajax({ type:"post",
           url:'<%=path%>/leaderAct/leaderAct!showDesktop.action',
           data:{},
           success:function(response){
            if(response==""){
            }else{
             ldhdcontent.innerHTML=replaceMore(response);
            }
           },
           error:function(data){
            //alert("对不起,操作异常"+data);
           }
            });
            }
           
      </script>
      
            
           </dd>
         </dl>
       </div>

/**
  * lanyq
  * 添加首页展示领导活动
  */
 public String showDesktop() throws Exception{
  getResponse().setContentType("text/html;charset=UTF-8");
   StringBuffer innerHtml = new StringBuffer();
  leaderNameList=dictservice.getItemsByDictValue("FGJTLD");
  innerHtml.append("<table width=\"100%\" class=\"linkdiv\" title=\"\">");
  if(leaderNameList!=null&&leaderNameList.size()>0){
   innerHtml.append("<tr>");
   for(int i=0;i<(leaderNameList.size());i++){
    String leader=leaderNameList.get(i).getDictItemName();
    innerHtml.append("<td align=\"center\" height=\"20px\";width=\"20px\";><a href=\"#\" οnclick=\"javascript:window.parent.refreshWorkByTitle('/oa/leaderAct/leaderAct!myList.action?leaderName=")    
    .append(leader).append("','活动');\">")
     .append(leader)
     .append("</a></td>");
    if(i%3==2){
     innerHtml.append("</tr><tr>");
    }
   }
   innerHtml.append("</tr>");
   innerHtml.append("</table>");
  }
  getResponse().getWriter().write(innerHtml.toString());
  return null;
  
  
 }

由于框架中使用的都是在后台中拼接HTML语句,有一个很麻烦的地方leadername那个参数是中文,而URL中不能存在中文,所以需要转码。但是这种不能像之前那样前台转一次,后台转一次,因为框架中MVC没明显体现出来,拼接的HTML语句转码太繁琐了,于是加了两句话就实现了,

 getResponse().setContentType("text/html;charset=UTF-8");

getResponse().getWriter().write(innerHtml.toString());

注意这个地方不能再调用list方法了,因为list方法里面转码了一次,所以必须方法重写,可能确实有点麻烦,这种方式有点笨拙,但是结果还是实现了。

做完之后发现尽是些幺蛾子。
做出来的结果如图,第一次写Blog,写得不好请口下留情

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值