`

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-
    分享到:
    评论

相关推荐

    xmlhttp_asp+javascript+json+xml

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

    欧标充电桩 OCPP1.6 消息事件 JSON格式

    资源为欧标充电桩通用协议OCPP1.6标准的通信协议原文。其中包括所有消息事件的JOSN格式定义。并提示必要字段和可选字段。OCPP通信采用一问一答的模式,资源包含所有消息事情的request和response格式。可以通过模拟...

    XGoServer:一个基础性,模块完整且安全可靠的轻量级Go服务端框架

    cipher-AES ,可自行扩展其他日志模块, alecthomas/log4go路由模块, gorilla/mux硬存储/软存储采用xorm框架服务端通用的输出数据结构的整合,例如json各模块对应的单元测试实例如果你想直接输出一条json给客户端...

    通用智能网关参数配置软件-PLC实现HTTP通讯

    通过这个软件配置HTTP的URL,以及PLC数据地址等参数,即可实现HTTP协议的GET/POST请求,同时也支持FTP的文件上传下载和解析;

    基于Swoole 4.5+实现的高性能、高灵活性的PHP协程框架.rar

    框架组件库除了常见的协程版的 `MySQL 客户端`、`Redis 客户端`,还为您准备了协程版的 `Eloquent ORM`、`WebSocket 服务端及客户端`、`JSON RPC 服务端及客户端`、`GRPC 服务端及客户端`、`Zipkin/Jaeger (Open...

    ClientDataSet数据更新,Delta解析,视图更新

    可以将这个JSon字符串传递到服务端, 进行解码,生成更新的SQL语句. 主键更新. 建议主键使用GUID,这样更新数度快, SELECT可以多个表,但是要更新的字段不要AS成其他名字. 打包的时候指定要更新的表和更新主键. 思路...

    jwt简单的介绍和了解

    1、因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。 2、JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。 3、便于传输,jwt的构成非常简单,...

    gRPC 之 .NET 6 中的使用介绍

    在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。 特点: 跨语言,多种语言的类库实现; 基于HTTP/2之上的二进制协议; Protobuf序列化机制,比JSON...

    Hyperf协程框架-PHP

    框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、Zipkin/Jaeger (OpenTracing) 客户端、...

    server:宁静的api服务器

    AOAS 通用服务端AOAS是一个快速开发系统模板, 基于角色授权体系.整个系统以JSON格式来交互数据, 前台传过来的内容也是JSON格式字符串, 而非传统的form字段. 如在js端传过来的, 可用JSON.stringify(xxx)来格式化后再...

    spring-boot-demo_xkcoding.tar.gz

    actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、thymeleaf(模板引擎)、Beetl(模板引擎)、Enjoy(模板引擎)、...

    基于JQUERY的菜单栏插件

    可以用AJAX从服务端获取要初始化渲染的工具栏组,操作单元组,菜单等JSON参数,然后实时渲染出控件界面 实质为工具栏GooToolbar类简化后的一个异化,除了本功能脚本文件不同外,样式、图片均为通用 本类与工具栏...

    thinkphp框架使用JWTtoken的方法详解

    本文实例讲述了thinkphp框架使用JWTtoken的方法。分享给大家供大家参考,具体如下: ...3:json格式通用,不同语言之间都可以使用。 三:JWT组成 1:jwt由三部分组成:  头部(header)  载荷(payload) 包含一

    spring boot集成demo大全.zip

    actuator(`监控`)、admin(`可视化监控`)、logback(`日志`)、aopLog(`通过AOP记录web请求日志`)、统一异常处理(`json级别和页面级别`)、freemarker(`模板引擎`)、thymeleaf(`模板引擎`)、Beetl(`模板引擎`)、Enjoy(`...

    GServer:服务器中的插件框架

    服务端框架 I 依赖 sqlite3 google-protobuf nlohmann_json spdlog asio II 使用方式 $ ./Server <options> (-h help | -l loglevel | -p plugin)" III 项目结构 Common 存放通用插件 Log: 日志插件 NetPlugin: 网络...

    spring-boot-rest-framework

    服务结果以json格式返回,如果服务层发生异常,返回结果中自带errorCode及errorDesc,不论服务端方法执行成功与否,均会返回执行结果及服务端耗时 ####浏览地址 程序入口类为spring.boot.rest.demo.main....

    acl 框架库-其他

    acl 框架库是一个 C 库,主要包含:服务器开发框架、同步/异步网络通讯、...9、xml/json 流式解析库:区别于网上其它已有的 xml/json 解析库,acl 中的 xml/json 解析库采用有限状态机方式解析数据,处理方式更为灵活。

    Hyperf 协程框架 v2.1.10

    框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、OpenTracing(Zipkin, Jaeger) 客户端、...

    heimamovie:vue3.0 + ts 构建的黑马电影WebApp

    数据返回格式统一使用 JSON 支持的请求方法 GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 PATCH...

Global site tag (gtag.js) - Google Analytics