JSON通用服务端处理

最近在学习JavaScript,发现不论是ext还是prototype都很推崇json这种通信协议的格式,但是这两个框架都是比较偏前端的,和dwr不同,dwr是一个一站式的ajax框架,不仅提供了客户端的工具方法,也包括服务端的配置和通信的处理。 
而ext和prototype等仅仅设置好了json的接口并对ajax通信做了封装,相对而言是一种比较“纯粹”的AJAX实现,当然ext还包括了大量的图形组件,这又是题外话了。 
为了解决ext们的通信问题,如果单纯的定义Servlet,实现起来比较原始,既复杂又不好管理。于是网上有好多人采用了dwr来管理通信,还有人用structs作为对接口Servlet的映射配置管理,这样一来不论是客户端还是服务端,都有很多功能被切割掉了,显得不够“干净”。于是我写了下面的两个响应的Servlet处理类来解决这个问题。 
代码如下: 

Java代码 
  1. JSONServlet.java:  
  2. package com.digitalchina.dcscm.service;  
  3.   
  4. import java.io.*;  
  5. import java.lang.reflect.Method;  
  6. import java.util.Enumeration;  
  7. import java.util.HashMap;  
  8.   
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12. import org.json.*;  
  13.   
  14. /** 
  15.  * 通用JSON服务端 
  16.  *  
  17.  * @author 杨一 
  18.  */  
  19.   
  20. public class JSONServlet extends javax.servlet.http.HttpServlet implements  
  21.         javax.servlet.Servlet {  
  22.       
  23.     public JSONServlet() {  
  24.         super();  
  25.           
  26.     }  
  27.   
  28.     protected void doPost(HttpServletRequest request,  
  29.             HttpServletResponse response) throws ServletException, IOException {  
  30.         JSONObject jsonObject = null;  
  31.         String responseText = null;  
  32.         try {  
  33.             //JSON对象,由参数json定义  
  34.             jsonObject = new JSONObject(request.getParameter("json"));  
  35.               
  36.             //访问的类和方法,例如Object ExampleClass.exampleMethod()  
  37.             String action = (String)request.getParameter("action");  
  38.             int dotPos = action.lastIndexOf(".");  
  39.               
  40.             String beanName = action.substring(0, dotPos);  
  41.             String methodName = action.substring(dotPos + 1);  
  42.               
  43.             //在当前线程环境中找当前作用类的实例  
  44.             Object bean = findInstance(beanName);  
  45.             //作用类的原型的引用  
  46.             Class clazz;  
  47.               
  48.             //如果当前线程环境中有当前作用类的实例,获取其引用,否则实例化并返回引用,同时在线程中保存值  
  49.             if(bean == null){  
  50.                 clazz = Class.forName(beanName);  
  51.                 bean = clazz.newInstance();  
  52.                 storeInstance(beanName, bean);  
  53.             } else{  
  54.                 clazz = bean.getClass();  
  55.             }  
  56.   
  57.             //设置JSON值  
  58.             AbstractJsonAction aja = (AbstractJsonAction)bean;  
  59.             aja.initJson(jsonObject);  
  60.               
  61.             //获得要执行的方法  
  62.             Method m = clazz.getMethod(methodName);  
  63.               
  64.             //设置bean的其他参数  
  65.             Enumeration e = request.getParameterNames();  
  66.             Method setM;  
  67.             while(e.hasMoreElements()){  
  68.                 String str = (String)e.nextElement();  
  69.                 if(str.equals("json") || str.equals("action")){  
  70.                     continue;  
  71.                 }  
  72.                 StringBuffer sb = new StringBuffer();  
  73.                 sb.append("set");  
  74.                 sb.append(upperFirstChar(str));  
  75.                 String tempMName = sb.toString();  
  76.                 setM = clazz.getMethod(tempMName, new Class[]{String.class});  
  77.                 setM.invoke(bean, (String)request.getParameter(str));  
  78.             }  
  79.               
  80.             //执行方法  
  81.             Object retObj = m.invoke(bean);  
  82.               
  83.             //此处的Object要进行重写toString方法,使其返回一个json串给客户端  
  84.             responseText = retObj.toString();  
  85.         } catch (Exception e) {  
  86.             e.printStackTrace();  
  87.         }   
  88.         response.setCharacterEncoding("UTF-8");  
  89.         response.setContentType("application/x-json");  
  90.         response.getWriter().print(responseText);  
  91.     }  
  92.       
  93.     private String upperFirstChar(String fieldName) {  
  94.         char ch = fieldName.charAt(0);  
  95.         ch = Character.toUpperCase(ch);  
  96.         StringBuffer sb = new StringBuffer();  
  97.         sb.append(ch);  
  98.         sb.append(fieldName.substring(1));  
  99.         fieldName = sb.toString();  
  100.         return fieldName;  
  101.     }  
  102.       
  103.     private Object findInstance(String beanName){  
  104.         HashMap hm = (HashMap)tl.get();  
  105.         return hm.get(beanName);  
  106.     }  
  107.       
  108.     private void storeInstance(String beanName, Object bean){  
  109.         HashMap hm = (HashMap)tl.get();  
  110.         hm.put(beanName, bean);  
  111.     }  
  112.       
  113.     private static ThreadLocal tl = new ThreadLocal(){  
  114.         protected Object initialValue() {return new HashMap();};  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值