两级联动菜单的实现之二 --- 用ajax实现菜单联动
来源:互联网 发布:网络切换软件 编辑:程序博客网 时间:2024/06/11 19:27
前面记录了实现动态下拉菜单标签的过程,这仅仅完成了级联的第一步,这里将描述第二步,级联变化的实现。
要实现两个输入的变化:接口版本和接口参数,我的设想是调用两次ajax与后台交互获取数据,然后再重新渲染页面。但我又比较懒惰,不想为每个ajax都实现一个servlet,而且那样写的话也显得代码冗余了。我的设想是实现一个servlet,这个servlet根据接受请求的参数,来判断需要调用某个类的某个方法进行处理。一种较为常见的做法是在servlet里写一些if...else之类的条件语句来完成这个判断过程。我又觉得这个做法比较呆板,代码耦合太高,如果新增一个功能点都需要修改servlet。所幸,受struts的启发,我使用发射机制实现了这个自动寻找调用方法的过程。
一、servlet的实现
package com.vness.servlet; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import com.vness.tool.actionDealer;public class dataServlet extends HttpServlet { private static final long serialVersionUID = 1L;public void init() throws ServletException {}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/xml; charset=UTF-8");response.setHeader("Cache-Control", "no-cache");String param = request.getParameter("param");String action = request.getParameter("action"); String xmlData=actionDealer.doAction(action, param); PrintWriter out = response.getWriter(); out.write(xmlData);out.close();}}
整个servlet只做两件事情:获取参数交由actionDealer处理,获取返回输出到前端。
二、actionDealer类
这个类使用到了反射,这个类的功能完全可以在servlet里实现,但那样做不符合MVC的思想。整个类就做一件事情,利用发射转发请求到后台处理。
package com.vness.tool;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import com.vness.data.apiInfo;public class actionDealer {public actionDealer(){}public static String doAction(String action, String param) {apiInfo api = new apiInfo(); Class apiClass = api.getClass();String xmlData = "";try {Method callMethod = apiClass.getDeclaredMethod(action, String.class);xmlData = (String) callMethod.invoke(api, param);} catch (SecurityException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (NoSuchMethodException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return xmlData;}}
三、实际的处理类apiInfo
package com.vness.data; import java.sql.ResultSet; import com.vness.tool.dbTool;public class apiInfo {//作为数据载体,返回到servletprivate String xmlData;private String apiJrno;private static String XML_LABLE_PRE="<display_value>";private static String XML_LABLE_AFT="</display_value>";public static String VERSQL_PRE="SELECT DISTINCT API_VER FROM MPOPTAPII WHERE API_ID= '";public static String VERSQL_AFT="'";public String getXmlData() {return xmlData;}public void setXmlData(String xmlData) {this.xmlData = xmlData;}public String getApiJrno() {return apiJrno;}public void setApiJrno(String apiJrno) {this.apiJrno = apiJrno;}//生成查询API版本的SQL public String createVerSql() throws Exception{ if(apiJrno==null||apiJrno==""){ throw new Exception("[ apiInfo::createVerSql ] api Jrno is null."); } return VERSQL_PRE+apiJrno+VERSQL_AFT; } private String getVerData(String api_id) throws Exception{ setApiJrno(api_id);String sql=createVerSql();dbTool dt= new dbTool();dt.createConnection();ResultSet rs = dt.executeSQL(sql); String ret="";while(rs.next()){ String ver = rs.getString(1) ; if(ret==null||ret==""){ ret=ver; }else{ ret=ret+"|"+ver; } System.out.println("name:"+ret); }dt.closeConnection();return ret; } public String createVersionData2XML(String api_id) throws Exception{ String tmp=getVerData(api_id); String[] tmpArr=tmp.split("[|]"); //String[] tmpArr=api_id.split("[|]"); StringBuffer sb = new StringBuffer("<valueCollect>"); sb.append(buildSingleElement("请选择")); for(String s:tmpArr){ sb.append(buildSingleElement(s)); } sb.append("</valueCollect>"); return sb.toString(); } private String buildSingleElement(String value){ return XML_LABLE_PRE+value+XML_LABLE_AFT; } public String createParamData2XML(String param){ String[] apiParamArray=param.split("[|]");String apiParam=param+" param";StringBuffer sb = new StringBuffer("<valueCollect>");sb.append(buildSingleElement(apiParam));sb.append("</valueCollect>"); return sb.toString();} public static void main (String[] x) throws Exception{apiInfo api=new apiInfo();//api.getVerData("000083");String s="v1|v2|v3";String rt=api.createVersionData2XML(s);System.out.println(rt);} }这个类有两个方法createParamData2XML()和createVersionData2XML()分别是获取参数和版本信息,并组装为XML格式的数据返回到前端。它被actionDealer类利用发射机制直接调用。
最后,就是页面配置了,页面的东西比较简单,就不多讲了。只有一点,页面上ajax部分一定要传递参数action到后台,这个参数是需要调用的方法名字,比如:获取版本信息就配置createVersionData2XML,获取参数信息就配置createParamData2XML。
- 两级联动菜单的实现之二 --- 用ajax实现菜单联动
- Jquery ajax 实现两级下拉菜单联动
- 两级联动菜单的实现之一 --- 用taglib实现下拉菜单
- jquery+json两级联动下拉菜单的实现
- 不错的两级联动菜单
- Ajax实现二级联动菜单
- Ajax+jQuery 实现菜单联动
- Ajax实现二级联动菜单
- Ajax实现二级联动菜单
- Ajax实现多级联动菜单
- Ajax实现二级联动菜单
- Ajax实现二级联动菜单
- Ajax实现多级联动菜单
- Ajax实现二级联动菜单
- AJAX实现三级菜单联动
- 两级联动的实现
- 两级联动菜单
- 两级联动下拉菜单
- The guide to implementing 2D platformers(2D动作游戏开发与实现)
- IOS 5中的strong和weak关键字
- Re: HTTPS streams through a proxy
- CSDN博客存在的一些问题
- css实现强制不换行/自动换行/强制换行
- 两级联动菜单的实现之二 --- 用ajax实现菜单联动
- javabean ireport 做交叉报表
- 企业路由器应用——命令行—管理
- 华为三层混合模式端口配置
- 数据仓库的数据存储和实现(转)
- Sencha Touch入门
- Android远程图片获取和本地缓存
- 常用数据结构几篇好的参考文章
- Sql 2008 Study for two ------CTE(Command Table Expression)