日期:2014-05-16 浏览次数:20550 次
?
一、目的:
JS客户端在编写程序时,可以像调用本地方法一样调用服务器端的Spring中Bean的方法,实现对Spring的动态调用,从而减少客户端的每个请求都要配置成action的麻烦,使业务模块的开发只关注业务逻辑的展示页面的开发。
二、设计思路:
1.服务器端利用Struts机制,提供统一的动态action,名称为DynamicAjaxAction,接收客户端的请求,并返回处理结果;
2.DynamicAjaxAction内部解析请求后,通过java反射机制动态调用spring中的baen方法;
3.客户端封装异步请求方法,提供调用接口;
总体架构如下示意图:
?
?
?
三、详细设计:
1.DynamicAjaxAction的设计:
public class DynamicAjaxAction extends ActionSupport { private ActionInvoker actionInvoker; private DynamicAjaxActionRouting routing; private static final Log log = LogFactory.getLog(DynamicAjaxAction.class); protected static ArrayList<String> ExcludeValues = new ArrayList<String>(); public DynamicAjaxAction() { ExcludeValues.add("_de"); ExcludeValues.add("serviceUrl"); ExcludeValues.add("cacheData"); } public String execute() throws Exception { log.debug("DynamicAjaxAction.execute"); String key = this.getServiceUrl(); Map<String, Object> session = ServletActionContext.getContext().getSession(); HttpServletResponse response = ServletActionContext.getResponse(); data = this.invokerAction(); if(data == null) ExtObject.writeJsonString(response, (new ExtResultObject(true)).toString()); else ExtObject.writeJsonString(response, data.toString()); return null; } protected Object invokerAction() throws Exception { Object[] params = this.getInvokerParams().toArray(); Object obj = actionInvoker.invokerAction(this.getRouting().getServiceName(), this.getRouting().getActionName(), params); return obj; } private String getServiceUrl() { HttpServletRequest request = ServletActionContext.getRequest(); String serviceUrl = request.getParameter("serviceUrl"); return serviceUrl; } private boolean isCacheData() { HttpServletRequest request = ServletActionContext.getRequest(); String serviceUrl = request.getParameter("cacheData"); if(StringUtility.isNullOrEmpty(serviceUrl)) return false; return serviceUrl.equals("true"); } protected DynamicAjaxActionRouting getRouting() { String serviceUrl = this.getServiceUrl(); routing = new DynamicAjaxActionRouting(serviceUrl); return routing; } @SuppressWarnings("unchecked") protected HashMap<String, Object> getRequestParams() { HttpServletRequest request = ServletActionContext.getRequest(); HashMap<String, Object> requestParams = new HashMap<String, Object>(); Object[] params = request.getParameterMap().keySet().toArray(); for(int i = params.length; i > 0; i --) { String item = params[i - 1].toString(); if(!ExcludeValues.contains(item)) { String[] value = request.getParameterValues(item); if(value.length == 0) { //do nothing } else if(value.length == 1) { requestParams.put(item, value[0]); } else { requestParams.put(item, value); } } } return requestParams; } @SuppressWarnings("unchecked") protected ArrayList getInvokerParams() { HttpServletRequest request = ServletActionContext.getRequest(); ArrayList requestParams = new ArrayList(); requestParams.addAll(this.getRouting().g