B/S应用需要解决的一个重要问题是:如何在B/S之间传递数据。同样是采用HTTP协议,当时传递的内容形式已经从最初的平面型的form参数提交,发展为结构型的WebRPC调用。其中DWR、Web Service和JsonRPC是最常见的实现。
WebRPC的基本思路如下:在B端和S端分别实现对象及方法的序列化和反序列化,一个典型的调用过程如下:
- B端实参调用方法
- WebRPC在B端序列化方法和实参对象
- HTTP传输序列化数据到S端
- S端反序列化方法和实参对象
- S端调用服务方法运算,获得运算结果
- WebRPC在S端序列化运算结果
- HTTP传输序列化数据到B端
- WebRPC在B端反序列化运算结果,获得B端对象
看起来很完美,但并没有解决全部问题,应用中经常遇到的场景是:只需要对数据库表中的部分而不是全部字段进行操作。即:我们需要对象部分属性的序列化和反序列化。实现这个目标有两种思路:一是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方法。
以jsonRPC为B/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-->
相关推荐
三层架构是一种常见的软件设计模式,尤其在B/S(Browser/Server)和C/S(Client/Server)架构中广泛应用。这种架构将应用分为三个主要部分:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和...
《B/S实现通用数据库管理系统详解》 在信息技术领域,数据库管理系统(DBMS)是不可或缺的一部分,它用于存储、管理和检索数据。随着Web技术的发展,B/S(Browser/Server,浏览器/服务器)架构的数据库管理系统逐渐...
django-crudbuilder, 在 Django 中,通用CRUD实现 crudbuilder在 Django 中使用 Django tables2列出对象的通用CRUD实现。文档https://django-crudbuilder.readthedocs.org/en/la
本案例主要展示了如何使用Spring、Jersey、Hibernate和MySQL这些技术来实现一个完整的用户信息管理系统的后端逻辑,并结合HTML进行前端展示,实现用户信息的创建(Create)、读取(Read)、更新(Update)和删除...
crud 函数文件夹 models 数据库类文件夹 routers api路径文件夹 schemas 响应模型文件夹 utils 工具函数文件夹 database 数据库连接 dependencies 依赖 main 运行 运行 py main.py jose pip install python...
利用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操作详解** 在Web开发中,CRUD(Create, Read, Update, Delete)是最基本的数据操作,广泛应用于各种业务系统。本项目以JSP(JavaServer Pages)技术为核心,实现了对MySQL数据库的CRUD操作,旨在...
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和MyEclipse开发一个简单的CRUD(Create, Read, Update, Delete)应用,而无需连接到数据库。 首先,"first-java-server-faces-tutorial-en.pdf"可能...
本示例主要介绍如何在MybatisPlus中利用其通用CRUD功能实现数据的插入操作。 首先,我们需要了解MybatisPlus的基本架构。MybatisPlus扩展了Mybatis的功能,提供了实体类与数据库表之间的映射,自动填充字段(如创建...
【标题】"使用EasyUI+Springmvc实现的CRUD"主要涵盖了两个核心技术——EasyUI和SpringMVC,它们在Web开发中的应用以及如何协同工作来完成数据的创建、读取、更新和删除操作。 EasyUI是一款基于jQuery的前端UI框架,...
在这个"通用CRUD源代码下载"中,我们重点讨论如何利用 MyBatis Plus 扩展来实现高效、简洁的 CRUD 操作。 MyBatis Plus 是 MyBatis 的一个扩展,它简化了 CRUD 操作,提供了大量默认的 CRUD 方法,避免了大量的模板...
Ajax-crud-ajax-json-jquery-php.zip,crud-ajax、php、jquery,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页...
springboot+mybatis+postman+crud(视频+源码) https://pan.baidu.com/s/1qYcFDow https://blog.csdn.net/linzhiqiang0316/article/details/78310884?locationNum=3&fps=1
一、部分软件/库版本 Maven:3.0.5 struts2.2.3-spring3.0.6-hibernate3.6.6 二、Demo功能(导入sql可直接运行) 0.数据库文件doc/db.sql ... 若要在CRUD时做一些其它的操作,可继承对应的Universal,来重写或改写
自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...
在本教程中,我们将探讨如何使用 SpringMVC 实现基于 RESTful 风格的 CRUD(Create、Read、Update、Delete)操作。 **CRUD 操作概述** CRUD 操作是任何数据驱动应用的基础,它们分别代表创建新记录、读取现有记录、...
在本案例中,“VUE实现静态数据的CRUD功能”指的是利用Vue.js创建一个能够进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作的应用。这种功能通常用于管理数据库中的数据,而在这个特定场景下,...
在Controller中,我们可以使用Ajax进行异步请求,实现无刷新的CRUD操作。例如,使用JQuery的$.ajax()方法,发送GET或POST请求到后台,然后在success回调中处理返回的数据。为了响应Ajax请求,Controller中的方法通常...