最近遇到这么一个问题,一个是查询乱码(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中转码
如图所示:
之后才有效。之前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,写得不好请口下留情