狂奔 lion

          自強不息

          JSON通用服務端處理

          最近在學習JavaScript,發(fā)現(xiàn)不論是ext還是prototype都很推崇json這種通信協(xié)議的格式,但是這兩個框架都是比較偏前端的,和dwr不同,dwr是一個一站式的ajax框架,不僅提供了客戶端的工具方法,也包括服務端的配置和通信的處理。
          而ext和prototype等僅僅設置好了json的接口并對ajax通信做了封裝,相對而言是一種比較“純粹”的AJAX實現(xiàn),當然ext還包括了大量的圖形組件,這又是題外話了。
          為了解決ext們的通信問題,如果單純的定義Servlet,實現(xiàn)起來比較原始,既復雜又不好管理。于是網(wǎng)上有好多人采用了dwr來管理通信,還有人用structs作為對接口Servlet的映射配置管理,這樣一來不論是客戶端還是服務端,都有很多功能被切割掉了,顯得不夠“干凈”。于是我寫了下面的兩個響應的Servlet處理類來解決這個問題。
          代碼如下:

           JSONServlet:

          import java.io.*;
          import java.lang.reflect.Method;
          import java.util.Enumeration;
          import java.util.HashMap;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import org.json.*;

          /**
           * 通用JSON服務端
           * 
           * 
          @author 楊一
           
          */


          public class JSONServlet extends javax.servlet.http.HttpServlet implements
                  javax.servlet.Servlet 
          {
              
              
          public JSONServlet() {
                  
          super();
                  
              }


              
          protected void doPost(HttpServletRequest request,
                      HttpServletResponse response) 
          throws ServletException, IOException {
                  JSONObject jsonObject 
          = null;
                  String responseText 
          = null;
                  
          try {
                      
          //JSON對象,由參數(shù)json定義
                      jsonObject = new JSONObject(request.getParameter("json"));
                      
                      
          //訪問的類和方法,例如Object ExampleClass.exampleMethod()
                      String action = (String)request.getParameter("action");
                      
          int dotPos = action.lastIndexOf(".");
                      
                      String beanName 
          = action.substring(0, dotPos);
                      String methodName 
          = action.substring(dotPos + 1);
                      
                      
          //在當前線程環(huán)境中找當前作用類的實例
                      Object bean = findInstance(beanName);
                      
          //作用類的原型的引用
                      Class clazz;
                      
                      
          //如果當前線程環(huán)境中有當前作用類的實例,獲取其引用,否則實例化并返回引用,同時在線程中保存值
                      if(bean == null){
                          clazz 
          = Class.forName(beanName);
                          bean 
          = clazz.newInstance();
                          storeInstance(beanName, bean);
                      }
           else{
                          clazz 
          = bean.getClass();
                      }


                      
          //設置JSON值
                      AbstractJsonAction aja = (AbstractJsonAction)bean;
                      aja.initJson(jsonObject);
                      
                      
          //獲得要執(zhí)行的方法
                      Method m = clazz.getMethod(methodName);
                      
                      
          //設置bean的其他參數(shù)
                      Enumeration e = request.getParameterNames();
                      Method setM;
                      
          while(e.hasMoreElements()){
                          String str 
          = (String)e.nextElement();
                          
          if(str.equals("json"|| str.equals("action")){
                              
          continue;
                          }

                          StringBuffer sb 
          = new StringBuffer();
                          sb.append(
          "set");
                          sb.append(upperFirstChar(str));
                          String tempMName 
          = sb.toString();
                          setM 
          = clazz.getMethod(tempMName, new Class[]{String.class});
                          setM.invoke(bean, (String)request.getParameter(str));
                      }

                      
                      
          //執(zhí)行方法
                      Object retObj = m.invoke(bean);
                      
                      
          //此處的Object要進行重寫toString方法,使其返回一個json串給客戶端
                      responseText = retObj.toString();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }
           
                  response.setCharacterEncoding(
          "UTF-8");
                  response.setContentType(
          "application/x-json");
                  response.getWriter().print(responseText);
              }

              
              
          private String upperFirstChar(String fieldName) {
                  
          char ch = fieldName.charAt(0);
                  ch 
          = Character.toUpperCase(ch);
                  StringBuffer sb 
          = new StringBuffer();
                  sb.append(ch);
                  sb.append(fieldName.substring(
          1));
                  fieldName 
          = sb.toString();
                  
          return fieldName;
              }

              
              
          private Object findInstance(String beanName){
                  HashMap hm 
          = (HashMap)tl.get();
                  
          return hm.get(beanName);
              }

              
              
          private void storeInstance(String beanName, Object bean){
                  HashMap hm 
          = (HashMap)tl.get();
                  hm.put(beanName, bean);
              }

              
              
          private static ThreadLocal tl = new ThreadLocal(){
                  
          protected Object initialValue() {return new HashMap();};
              }
          ;
          }

           

           

          AbstractJsonAction.java:

          import org.json.JSONObject;

          /**
           * 抽象JSON Action類,負責處理各種業(yè)務,可以有自己的參數(shù),數(shù)據(jù)結構采用JSON定義,業(yè)務方法名自己定義
           * 可以通過繼承定義具體業(yè)務
           * 
           * 
          @author 楊一
           
          */

          public abstract class AbstractJsonAction {
           
          public AbstractJsonAction(){}
           
           
          public void initJson(JSONObject json){
            
          this.json = json;
           }

           
           
          protected JSONObject json; 
          }


          僅僅是表述一種想法,歡迎大家批評,呵呵:)

           @2008 楊一. 版權所有. 保留所有權利

          posted on 2008-11-24 18:14 楊一 閱讀(2230) 評論(1)  編輯  收藏

          評論

          # re: JSON通用服務端處理[未登錄] 2008-11-24 18:59 Sirius

          http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/BeanJsonConverter.java

          shindig中的json to object 雙向轉換器
          我一直在用,可以參考一下,可能要修改一下才能用

          ps:這個日期轉換有點問題  回復  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          公告

          本人在blogjava上發(fā)表的文章及隨筆除特別聲明外均為原創(chuàng)或翻譯,作品受知識產權法保護并被授權遵從 知識分享協(xié)議:署名-非商業(yè)性使用-相同方式共享 歡迎轉載,請在轉載時注明作者姓名(楊一)及出處(www.aygfsteel.com/yangyi)
          /////////////////////////////////////////
          我的訪問者

          常用鏈接

          留言簿(5)

          隨筆分類(55)

          隨筆檔案(55)

          相冊

          Java

          其他技術

          生活

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          自強不息


          用心 - 珍惜時間,勇于創(chuàng)造
          主站蜘蛛池模板: 社旗县| 河源市| 黄浦区| 祁门县| 澜沧| 清丰县| 怀安县| 平原县| 镇远县| 黔东| 壶关县| 汶上县| 丰都县| 垫江县| 红原县| 龙州县| 泸西县| 万州区| 仙桃市| 黄浦区| 北辰区| 安康市| 大埔县| 忻州市| 贺州市| 衡水市| 晋宁县| 长乐市| 改则县| 拜泉县| 蕲春县| 淳化县| 白城市| 湘乡市| 博湖县| 阿克苏市| 曲周县| 桐城市| 凤翔县| 福海县| 甘泉县|