Teambiz中后臺參數容器RequestParamMap
作者:何楊
撰寫日期:2012年2月27日
版本:1.00
更新日期:
第一部分:功能說明
簡化頁面請求參數的取值和存放,解決亂碼問題,并簡化數據傳輸通道上函數參數的編寫。
第二部分:核心組件
名稱 | 路徑 | 說明 |
RequestParamMap | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java | 它是一個頁面請求參數的容器,內含一個哈希表,以鍵值對的方式來存儲請求參數的名和值。 它的構造函數接受一個哈希表,這個哈希表在AjaxAction的getRequestParamMap函數中被生成,并傳入強制子類實現的process函數中,因此每個繼承自AjaxAction的類中直接使用RequestParamMap對象即可,無需考慮它的由來。 有一點需要說明的是,由于非ASC碼字符在URL中是不允許的,因此在使用Ajax.Request對象發起請求前使用javaScript函數eval兩次對url進行轉碼,與之對應的,在AjaxAction的getRequestParamMap函數中使用UTF8Coder類decode方法又將其還原了回來,因此程序員無需擔心亂碼問題。 |
getParamValue | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java中同名函數。 | 程序員可以參數名為單位,使用這個函數取出參數的值,當參數名不存在,即請求參數中沒有后臺想要的值,一個異常將被拋出。按照teamBiz的異常傳遞體系,這個異常會在用戶界面上顯示出來,這樣做有助于問題的快速定位。 |
addParam | teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java中同名函數。 | 程序員可以將參數名和參數值添加到RequestParamMap,設計這個函數的考慮到很多參數如用戶信息在請求中往往是不見的,需要在Action中從session或是其它地方取出再往后方傳遞。 |
第三部分:有關RequestParamMap使用的代碼
1. RequestParamMap類的代碼
/**
* 頁面請求參數容器
* @author 何楊(heyanghy@cn.ibm.com)
* @version 1.00
* @time Feb 6, 2012 10:47:39 AM
*
*/
public class RequestParamMap{
// 存儲頁面請求參數的哈希表
private Map<String,String> map;
/**
* 構造函數
* @param map
*/
public RequestParamMap(Map<String,String> map){
this.map=map;
}
/**
* 按請求參數的名稱取得請求參數的值
* @param paramName
* @return
*/
public String getParamValue(String paramName) throws IllegalArgumentException{
if(map.containsKey(paramName)){
return map.get(paramName);
}else{
throw new IllegalArgumentException("找不到名為"+paramName+"的頁面請求參數.");
}
}
/**
* 添加一個參數
* @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函數
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類中對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("取得執行者名單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>請登錄后再來執行此操作</text>");
out.println("</response>");
}
}
}
以上代碼來自:teambiz\src\com\ibm\heyang\action\relation\FetchExecuterAction.java
4.后臺DAO類對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
第四部分:小結
函數參數如果雜亂很不利于一些基類中共通函數的編寫,比如分頁函數,在RequestParamMap類的幫助下,這個問題能夠得到解決。它附帶的自動生成對象,解碼,無參數時拋出異常要給程序中參數的取值,轉碼和異常處理帶來了方便.
RequestParamMap類體積很小,功能也不復雜,但對后臺的整個代碼結構的改善帶來了莫大好處,類似這種組件是值得發掘的。