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类体积很小,功能也不复杂,但对后台的整个代码结构的改善带来了莫大好处,类似这种组件是值得发掘的。