`

JSON通用服务端处理

    博客分类:
  • 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();};  
  115. font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-
    分享到:
    评论

相关推荐

    JSON在JAVAWEB服务端所需JAR包

    在处理JSON时,可能需要用到其中的一些通用函数,如字符串处理、日期时间操作等。 3. **commons-collections-3.2.2.jar**:Apache Commons Collections库提供了对Java集合框架的扩展,包含各种集合的实现、迭代器、...

    JSONRPC

    3. **跨语言支持**:由于JSON是通用的数据格式,JSONRPC协议允许不同语言的客户端和服务器进行通信。 4. **动态代理**:JAVA的动态代理技术可以用于实现JSONRPC的自动调用,简化客户端代码。 **集成与安全** 1. **...

    网关编程服务端+页面(含JSON解析与封装)

    服务端处理业务逻辑后,通常会将结果封装成JSON对象,然后返回给前端。前端则负责解析这些JSON数据,显示在界面上。 JSON解析与封装在Java中可以通过Jackson、Gson等库实现。例如,当接收到前端的请求后,服务端...

    一个java处理JSON格式数据的通用类.pdf

    ### Java处理JSON格式数据的通用类详解 #### 概述 在现代软件开发过程中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式被广泛采用。它基于JavaScript的一个子集,采用完全独立于编程语言的...

    服务端.rar

    本资源“服务端.rar”提供了一个基于Socket的通用服务端网络模块,旨在帮助初学者理解并实践网络服务器的开发。下面将详细介绍Socket、服务端、网络模块以及与聊天室相关的知识点。 1. Socket(套接字): Socket...

    服务端源码

    在IT行业中,服务端开发是构建网络应用的核心部分,它负责处理客户端的请求,执行业务逻辑,并返回响应数据。在这个“服务端源码”的主题中,我们主要关注的是如何实现一个简单的服务端程序来获取并返回服务器的时间...

    安卓网站交互JSONxmlWebserviceUPnP相关-客户端与服务端的json交互的小例子.zip

    这个压缩包文件“安卓网站交互JSONxmlWebserviceUPnP相关-客户端与服务端的json交互的小例子.zip”主要涵盖了在Android平台上实现网站交互时使用的关键技术,包括JSON、XML、Web Service以及UPnP(通用即插即用)...

    java开发常用jar包之json-rpc.rar

    2. 易于跨语言:JSON是通用的数据交换格式,因此JSON-RPC使得不同编程语言之间可以方便地进行互操作。 3. 适用于微服务:在微服务架构中,JSON-RPC可以作为一个高效的通信机制,用于服务间的调用。 总结来说,"java...

    苹果授权登陆 服务端验证(java)

    - **jwks-rsa-0.9.0.jar**:用于处理JSON Web Key Sets (JWKS)的库,JWKS是公开密钥的集合,服务端可以使用这些密钥来验证JWTs的签名。 4. **验证流程**: - 用户在客户端(如iOS或Android应用)上进行苹果授权...

    通用数据访问层及Ajax服务端框架的综合示例

    "通用数据访问层"与"Ajax服务端框架"的结合,旨在提供一种优化的Web应用开发模式,提高前端与后端之间的交互效率,同时简化数据库操作。下面将详细阐述这两个概念以及它们在实际项目中的应用。 首先,通用数据访问...

    基于c++实现的GRPC服务端demo

    gRPC 是一个高性能、开源和通用的 RPC(远程过程调用)框架,它基于 Protocol Buffers 协议,由 Google 开发并维护。在本文中,我们将深入探讨如何使用 C++ 实现一个简单的 gRPC 服务端 demo。首先,我们需要了解 ...

    对象转换成JSON和Map

    "对象转换成JSON和Map"是一个核心话题,特别是在Java编程语言中,因为JSON(JavaScript Object Notation)是网络通信中广泛使用的轻量级数据交换格式,而Map则是一种通用的数据结构,用于存储键值对。下面我们将深入...

    JSON-RPC for Java.src 2.0

    服务器端通过实现特定的处理函数来响应客户端的请求,而客户端则可以通过发送JSON格式的数据包来发起调用。由于JSON-RPC的简单性和灵活性,它在微服务架构、跨语言通信和Web服务中都有广泛应用。通过阅读提供的文档...

    实现通用的CRUD之二—用jsonRPC打通B/S的任督二脉

    2. **实现服务端处理逻辑**:在服务器端,为每个CRUD操作编写对应的处理函数,处理来自客户端的请求。这些函数应该能正确地与数据库进行交互,执行相应的SQL语句。 3. **客户端调用**:在前端,使用AJAX或Fetch API...

    C# 微服务---Grpc框架 Demo 服务端 客户端分离

    4. **错误处理**:客户端应该包含适当的错误处理机制,如处理网络异常、超时或服务端返回的错误状态码。 5. **异步编程**:gRPC支持异步调用,客户端可以使用async/await关键字进行非阻塞调用,提高系统性能。 ...

    xmlhttp_asp+javascript+json+xml

    实现通用型基于xmlhttp的ajax模型。 客户端用javascript建立xmlhttp对象, 采用规范化的dom来处理上传的xml格式数据, 通过eval方法解译服务端回传的json格式数据。 服务端用asp编写,通过response.binaryRead()解译...

    安卓网站交互JSONxmlWebserviceUPnP相关-Android解析服务端XML.zip

    标题 "安卓网站交互JSONxmlWebserviceUPnP相关-Android解析服务端XML.zip" 提供了几个关键的技术领域,包括在Android平台上处理网站交互、JSON数据、XML解析、Web Service服务以及UPnP(通用即插即用)技术。...

    json字符串转table字符串

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的数据传输。...通过理解这些基本概念和使用相关库,开发者可以有效地将服务端返回的JSON数据转化为易于理解的表格格式。

    世界地图,世界国家geojson,各国地图json数据

    3. **坐标系统(CRS)**:GeoJSON文件通常使用WGS84坐标系统,这是全球通用的地理坐标系,以经度和纬度表示地理位置。 4. **属性(Properties)**:Feature对象还包含一个Properties对象,存储与地理形状相关的非...

    jquery+json 通用三级联动下拉列表

    【jQuery + JSON 通用三级联动下拉列表】 在网页设计中,经常需要实现联动效果,特别是在处理地理位置选择或层级分类时。例如,一个常见的需求是从省份、城市到区县的三级联动下拉列表。这个功能可以提高用户体验,...

Global site tag (gtag.js) - Google Analytics