Teambiz中后臺(tái)參數(shù)容器RequestParamMap
作者:何楊
撰寫日期:2012年2月27日
版本:1.00
更新日期:
第一部分:功能說明
簡(jiǎn)化頁(yè)面請(qǐng)求參數(shù)的取值和存放,解決亂碼問題,并簡(jiǎn)化數(shù)據(jù)傳輸通道上函數(shù)參數(shù)的編寫。
第二部分:核心組件
名稱 | 路徑 | 說明 |
RequestParamMap | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java | 它是一個(gè)頁(yè)面請(qǐng)求參數(shù)的容器,內(nèi)含一個(gè)哈希表,以鍵值對(duì)的方式來存儲(chǔ)請(qǐng)求參數(shù)的名和值。 它的構(gòu)造函數(shù)接受一個(gè)哈希表,這個(gè)哈希表在AjaxAction的getRequestParamMap函數(shù)中被生成,并傳入強(qiáng)制子類實(shí)現(xiàn)的process函數(shù)中,因此每個(gè)繼承自AjaxAction的類中直接使用RequestParamMap對(duì)象即可,無需考慮它的由來。 有一點(diǎn)需要說明的是,由于非ASC碼字符在URL中是不允許的,因此在使用Ajax.Request對(duì)象發(fā)起請(qǐng)求前使用javaScript函數(shù)eval兩次對(duì)url進(jìn)行轉(zhuǎn)碼,與之對(duì)應(yīng)的,在AjaxAction的getRequestParamMap函數(shù)中使用UTF8Coder類decode方法又將其還原了回來,因此程序員無需擔(dān)心亂碼問題。 |
getParamValue | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java中同名函數(shù)。 | 程序員可以參數(shù)名為單位,使用這個(gè)函數(shù)取出參數(shù)的值,當(dāng)參數(shù)名不存在,即請(qǐng)求參數(shù)中沒有后臺(tái)想要的值,一個(gè)異常將被拋出。按照teamBiz的異常傳遞體系,這個(gè)異常會(huì)在用戶界面上顯示出來,這樣做有助于問題的快速定位。 |
addParam | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java中同名函數(shù)。 | 程序員可以將參數(shù)名和參數(shù)值添加到RequestParamMap,設(shè)計(jì)這個(gè)函數(shù)的考慮到很多參數(shù)如用戶信息在請(qǐng)求中往往是不見的,需要在Action中從session或是其它地方取出再往后方傳遞。 |
第三部分:有關(guān)RequestParamMap使用的代碼
1. RequestParamMap類的代碼
/**
* 頁(yè)面請(qǐng)求參數(shù)容器
* @author 何楊(heyanghy@cn.ibm.com)
* @version 1.00
* @time Feb 6, 2012 10:47:39 AM
*
*/
public class RequestParamMap{
// 存儲(chǔ)頁(yè)面請(qǐng)求參數(shù)的哈希表
private Map<String,String> map;
/**
* 構(gòu)造函數(shù)
* @param map
*/
public RequestParamMap(Map<String,String> map){
this.map=map;
}
/**
* 按請(qǐng)求參數(shù)的名稱取得請(qǐng)求參數(shù)的值
* @param paramName
* @return
*/
public String getParamValue(String paramName) throws IllegalArgumentException{
if(map.containsKey(paramName)){
return map.get(paramName);
}else{
throw new IllegalArgumentException("找不到名為"+paramName+"的頁(yè)面請(qǐng)求參數(shù).");
}
}
/**
* 添加一個(gè)參數(shù)
* @param paramName
* @param paramValue
*/
public void addParam(String paramName,String paramValue){
map.put(paramName, paramValue);
}
}
以上代碼路徑:teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java
2. AjaxAction的getRequestParamMap函數(shù)
private RequestParamMap getRequestParamMap(HttpServletRequest request){
Map<String,String> map=new HashMap<String,String>();
for (Enumeration<?> e = request.getParameterNames(); e.hasMoreElements();) {
String name = (String) e.nextElement();
String[] values = request.getParameterValues(name);
if (values != null && values.length >= 1) {
String value=UTF8Coder.decode(values[0]);
map.put(name, value);
}
}
return new RequestParamMap(map);
}
以上代碼路徑:teambiz\src\com\ibm\heyang\action\base\AjaxAction.java
3.繼承自AjaxAction的Action類中對(duì)RequestParamMap的使用:
public final class FetchExecuterAction extends AjaxAction {
private static Logger logger = Logger.getLogger(FetchExecuterAction.class);
public void process(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response,RequestParamMap paramMap)
throws Exception {
logger.trace("取得執(zhí)行者名單Action");
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PrintWriter out = response.getWriter();
RelationService service=SpringUtil.getRelationService();
Long userId=(Long)request.getSession().getAttribute("userId");
if(userId!=null){
paramMap.addParam("userId", String.valueOf(userId));
paramMap.addParam("userName", "自己");
paramMap.addParam("status", Relation.Status_Agree);
String xml=service.getExecuterXml(paramMap);
out.println("<response>");
out.println("<status>ok</status>");
out.println(xml);
out.println("</response>");
}else{
out.println("<response>");
out.println("<status>ng</status>");
out.println("<text>請(qǐng)登錄后再來執(zhí)行此操作</text>");
out.println("</response>");
}
}
}
以上代碼來自:teambiz\src\com\ibm\heyang\action\relation\FetchExecuterAction.java
4.后臺(tái)DAO類對(duì)RequestParamMap的使用
public String getExecuterXml(RequestParamMap paramMap) throws Exception{
String userId=paramMap.getParamValue("userId");
String userName=paramMap.getParamValue("userName");
String status=paramMap.getParamValue("status");
StringBuilder sb=new StringBuilder();
sb.append(" select");
sb.append(" tb01.toUserId as id,");
sb.append(" tb02.name as name");
sb.append(" from");
sb.append(" teambiz_relation");
sb.append(" tb01,");
sb.append(" teambiz_user");
sb.append(" tb02");
sb.append(" where");
sb.append(" tb01.toUserId=tb02.id");
sb.append(" and");
sb.append(" tb01.fromUserId="+userId+"");
sb.append(" and");
sb.append(" tb01.status='"+status+"'");
sb.append(" order by");
sb.append(" tb01.id");
String sql=sb.toString();
List<?> ls=fetchRecords(sql,new NameValueRowMapper());
StringBuilder sb2=new StringBuilder();
sb2.append(new NameValueList(ls).asXML());
sb2.append("<node>");
sb2.append("<id>"+userId+"</id>");
sb2.append("<name>"+userName+"</name>");
sb2.append("</node>");
return sb2.toString();
}
以上代碼來自:teambiz\src\com\ibm\heyang\dao\RelationDao.java
第四部分:小結(jié)
函數(shù)參數(shù)如果雜亂很不利于一些基類中共通函數(shù)的編寫,比如分頁(yè)函數(shù),在RequestParamMap類的幫助下,這個(gè)問題能夠得到解決。它附帶的自動(dòng)生成對(duì)象,解碼,無參數(shù)時(shí)拋出異常要給程序中參數(shù)的取值,轉(zhuǎn)碼和異常處理帶來了方便.
RequestParamMap類體積很小,功能也不復(fù)雜,但對(duì)后臺(tái)的整個(gè)代碼結(jié)構(gòu)的改善帶來了莫大好處,類似這種組件是值得發(fā)掘的。