当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  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 何杨 阅读(397) 评论(0)  编辑  收藏 所属分类: Teambiz

只有注册用户登录后才能发表评论。


网站导航: