最近遇到这么一个问题,一个是查询乱码(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"> </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中转码

如图所示:

url转码方法java url转码接口_Windows

之后才有效。之前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方法里面转码了一次,所以必须方法重写,可能确实有点麻烦,这种方式有点笨拙,但是结果还是实现了。

做完之后发现尽是些幺蛾子。

做出来的结果如图

url转码方法java url转码接口_url_02

,第一次写Blog,写得不好请口下留情