當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

           

           

           

           

           

           

          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類體積很小,功能也不復雜,但對后臺的整個代碼結構的改善帶來了莫大好處,類似這種組件是值得發掘的。

           

          posted on 2012-02-29 10:41 何楊 閱讀(419) 評論(0)  編輯  收藏 所屬分類: Teambiz
          主站蜘蛛池模板: 漳州市| 泰和县| 崇明县| 江西省| 彩票| 黎川县| 西丰县| 安宁市| 淄博市| 灌云县| 剑川县| 体育| 民勤县| 南昌市| 忻城县| 襄垣县| 饶平县| 古浪县| 尼勒克县| 祥云县| 南川市| 宝坻区| 焉耆| 钟祥市| 双牌县| 罗平县| 伊金霍洛旗| 隆化县| 安溪县| 西青区| 尼玛县| 紫金县| 荔浦县| 宜兴市| 泽库县| 正镶白旗| 元朗区| 高邑县| 钟山县| 沧源| 葫芦岛市|