`

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

 
阅读更多

 

B/S应用需要解决的一个重要问题是:如何在B/S之间传递数据。同样是采用HTTP协议,当时传递的内容形式已经从最初的平面型的form参数提交,发展为结构型的WebRPC调用。其中DWRWeb ServiceJsonRPC是最常见的实现。

WebRPC的基本思路如下:在B端和S端分别实现对象及方法的序列化和反序列化,一个典型的调用过程如下:

 

  1. B端实参调用方法
  2. WebRPCB端序列化方法和实参对象
  3. HTTP传输序列化数据到S
  4. S端反序列化方法和实参对象
  5. S端调用服务方法运算,获得运算结果
  6. WebRPCS端序列化运算结果
  7. HTTP传输序列化数据到B
  8. WebRPCB端反序列化运算结果,获得B端对象
  9.  

看起来很完美,但并没有解决全部问题,应用中经常遇到的场景是:只需要对数据库表中的部分而不是全部字段进行操作。即:我们需要对象部分属性的序列化和反序列化。实现这个目标有两种思路:一是hack现有的WebRPC,使其支持部分属性序列化。另一种思路则是:引入一个中间形态以承载部分属性对象。本文采用的是第二种思路。

对该形态的用java描述如下

 

 

/**
 * object部分属性的map形式
 * @author chen4w
 *
 */
public class BObj {
	//从数据库获得的原始状态
	public static final char ACTION_ORIG = 'O';
	//新增对象
	public static final char ACTION_ADD = 'A';
	//已设置为删除状态
	public static final char ACTION_REMOVE='R';
	//经过了修改
	public static final char ACTION_UPDATE='U';
	//用于新增的默认对象
	public static final char ACTION_DEFAULT='D';
	//多表按顺序的类名
	private String[] cns;
	/**
	 * 属性数组
	 */
	private HashMap<String,Object> items;
	/**
	 * 动作标识
	 */
	private char action;
	public char getAction(){
		return action;
	}
	public void setAction(char action){
		this.action=action;
	}
	public String[] getCns(){
		return cns;
	}
	public void setCns(String[] cname){
		this.cns=cname;
	}
	public HashMap<String,Object>  getItems(){
		return items;
	}
	public void setItems(HashMap<String,Object>  fmap){
		this.items=fmap;
	}

}

 

可以看出,描述中包含了如下几类信息:

cns——对象类名(O/R mapping映射的POJO),采用数组是考虑到多表联合查询

action——对象自描述的状态,新增/删除/更新/初始。

Items——对象的部分属性集合

以此类作为中间形态,我们不难写出完整对象与之转换的方法。然后利用WebRPC,编写出一个以该类作为参数的通用的数据库CRUD方法。

jsonRPCB/S双向序列化协议,编写服务方法如下:

 

	static public Object handle(char method,HashMap<String, Object> rm,String sn,
			HttpServletRequest request) throws Exception {
		// TODO Auto-generated method stub
		if(sn==null || sn.trim().equals(""))
			sn = DEFAULTHANDLER;

		//session检查 为空且非登录请求
		/*if(method!=METHOD_LOGIN){
			throw new ServletException(Info.ERR_INVALID_SESSION);	
		}*/
		//如果存在before回调
		String cn = "";
		String[] cns= (String[])rm.get("cns");
		if(cns!=null){
			cn = cns[0];
		}
		//根据HHUtil中对sn+method的事务要求,采用编程决定是否启动事务管理
		Integer transanctionMode = hhutil.getTransactionMode(sn,method);
		PlatformTransactionManager transactionManager=null;
		TransactionStatus transactionStatus=null;
		if(transanctionMode!=null){
			transactionManager=(PlatformTransactionManager)Cfg.getBean("transactionManager");  
			TransactionDefinition transactionDefinition=
				new DefaultTransactionDefinition(transanctionMode);		
			transactionStatus=transactionManager.getTransaction(transactionDefinition);
		}
		try{
			IHandleHook hcb = hhutil.getHandleHook(sn, method, cn);
			if(hcb!=null)
				hcb.beforeHandle(method,rm,request);
			Object result= getHandleImpl(sn).handle(method,rm,request);
			//如果存在after回调
			if(hcb!=null)
				hcb.afterHandle(method, rm, request, result);
			if(transactionManager!=null)
				transactionManager.commit(transactionStatus);
			return result;
		}catch(Exception e){
			e.printStackTrace();
			if(transactionManager!=null)
				transactionManager.rollback(transactionStatus);
			throw e;
		}
	}

 

该方法处理调用的前后的切面,允许在默认处理前后便携特殊处理。另外,允许将多个调用封装为一个事务。

进一步编写数据库CRUD操作的服务作为一个handle实例。

 

 附件说明如下:

BObj.java——对象的部分属性形态

Handler.java——jsonRPC调用的总入口,负责调用前后特殊逻辑调度和事务处理

 

HDDefault.java——负责数据库通用操作的服务

 

HDUtil——数据库操作辅助工具类

 

<!--EndFragment-->

  • bat.zip (49.8 KB)
  • 下载次数: 18
0
0
分享到:
评论

相关推荐

    三层架构工作流程图B/S架构及C/S架构

    三层架构是一种常见的软件设计模式,尤其在B/S(Browser/Server)和C/S(Client/Server)架构中广泛应用。这种架构将应用分为三个主要部分:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和...

    B_S实现通用数据库管理系统

    《B/S实现通用数据库管理系统详解》 在信息技术领域,数据库管理系统(DBMS)是不可或缺的一部分,它用于存储、管理和检索数据。随着Web技术的发展,B/S(Browser/Server,浏览器/服务器)架构的数据库管理系统逐渐...

    django-crudbuilder, 在 Django 中,通用CRUD实现.zip

    django-crudbuilder, 在 Django 中,通用CRUD实现 crudbuilder在 Django 中使用 Django tables2列出对象的通用CRUD实现。文档https://django-crudbuilder.readthedocs.org/en/la

    Spring+Jersey+Hibernate+MySQL+HTML实现用户信息CRUD案例源码

    本案例主要展示了如何使用Spring、Jersey、Hibernate和MySQL这些技术来实现一个完整的用户信息管理系统的后端逻辑,并结合HTML进行前端展示,实现用户信息的创建(Create)、读取(Read)、更新(Update)和删除...

    Python基于B/S的小型汽车维修管理系统源码,数据库用华为的OpenGauss

    crud 函数文件夹 models 数据库类文件夹 routers api路径文件夹 schemas 响应模型文件夹 utils 工具函数文件夹 database 数据库连接 dependencies 依赖 main 运行 运行 py main.py jose pip install python...

    LayUI+Mybatis实现CRUD效果.rar

    利用LayUI+MyBatis实现CRUD操作MySQL数据库 https://blog.csdn.net/qq_29001539/article/details/105613480 雁去雁归雁不散2020-04-19 14:49:17 LayUI+MyBatis实现CRUD操作 项目描述 前端页面采用Layui进行搭建,...

    jsp 实现的CRUD

    **JSP实现的CRUD操作详解** 在Web开发中,CRUD(Create, Read, Update, Delete)是最基本的数据操作,广泛应用于各种业务系统。本项目以JSP(JavaServer Pages)技术为核心,实现了对MySQL数据库的CRUD操作,旨在...

    05实现mybatis简单crud功能demo

    05实现mybatis简单crud功能demo05实现mybatis简单crud功能demo05实现mybatis简单crud功能demo05实现mybatis简单crud功能demo05实现mybatis简单crud功能demo05实现mybatis简单crud功能demo05实现mybatis简单crud功能...

    JSF实现的CRUD例子 myeclipse

    在这个"JSF实现的CRUD例子 myeclipse"中,我们将探讨如何使用JSF和MyEclipse开发一个简单的CRUD(Create, Read, Update, Delete)应用,而无需连接到数据库。 首先,"first-java-server-faces-tutorial-en.pdf"可能...

    MybatisPlus中使用通用CRUD实现插入操作示例代码

    本示例主要介绍如何在MybatisPlus中利用其通用CRUD功能实现数据的插入操作。 首先,我们需要了解MybatisPlus的基本架构。MybatisPlus扩展了Mybatis的功能,提供了实体类与数据库表之间的映射,自动填充字段(如创建...

    使用EasyUI+Springmvc实现的CRUD

    【标题】"使用EasyUI+Springmvc实现的CRUD"主要涵盖了两个核心技术——EasyUI和SpringMVC,它们在Web开发中的应用以及如何协同工作来完成数据的创建、读取、更新和删除操作。 EasyUI是一款基于jQuery的前端UI框架,...

    通用CRUD源代码下载

    在这个"通用CRUD源代码下载"中,我们重点讨论如何利用 MyBatis Plus 扩展来实现高效、简洁的 CRUD 操作。 MyBatis Plus 是 MyBatis 的一个扩展,它简化了 CRUD 操作,提供了大量默认的 CRUD 方法,避免了大量的模板...

    Ajax-crud-ajax-json-jquery-php.zip

    Ajax-crud-ajax-json-jquery-php.zip,crud-ajax、php、jquery,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页...

    springboot+mybatis实现增删改查(视频+源码)

    springboot+mybatis+postman+crud(视频+源码) https://pan.baidu.com/s/1qYcFDow https://blog.csdn.net/linzhiqiang0316/article/details/78310884?locationNum=3&fps=1

    Maven struts-spring-hibernate全注解 通用CRUD示例

    一、部分软件/库版本 Maven:3.0.5 struts2.2.3-spring3.0.6-hibernate3.6.6 二、Demo功能(导入sql可直接运行) 0.数据库文件doc/db.sql ... 若要在CRUD时做一些其它的操作,可继承对应的Universal,来重写或改写

    JDBC通用DAO CRUD(不是Hibernate)

    自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...

    SpringMVC 使用 RESTful 架构实现 CRUD 操作

    在本教程中,我们将探讨如何使用 SpringMVC 实现基于 RESTful 风格的 CRUD(Create、Read、Update、Delete)操作。 **CRUD 操作概述** CRUD 操作是任何数据驱动应用的基础,它们分别代表创建新记录、读取现有记录、...

    VUE实现静态数据的CRUD功能

    在本案例中,“VUE实现静态数据的CRUD功能”指的是利用Vue.js创建一个能够进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作的应用。这种功能通常用于管理数据库中的数据,而在这个特定场景下,...

    SSM-PageHelper实现Crud操作

    在Controller中,我们可以使用Ajax进行异步请求,实现无刷新的CRUD操作。例如,使用JQuery的$.ajax()方法,发送GET或POST请求到后台,然后在success回调中处理返回的数据。为了响应Ajax请求,Controller中的方法通常...

Global site tag (gtag.js) - Google Analytics