两级联动菜单的实现之二 --- 用ajax实现菜单联动

前面记录了实现动态下拉菜单标签的过程,这仅仅完成了级联的第一步,这里将描述第二步,级联变化的实现。

要实现两个输入的变化:接口版本和接口参数,我的设想是调用两次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 block
			e1.printStackTrace();
		} catch (NoSuchMethodException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return xmlData;
	}
}

三、实际的处理类apiInfo

package com.vness.data; 
 
import java.sql.ResultSet;  
import com.vness.tool.dbTool;

public class apiInfo {
	//作为数据载体,返回到servlet
	private 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值