如何在视图状态中保存自定义的对象

此博客围绕B/S三层结构系统展开。在表现层实例化业务层对象操作时,发现该对象无法加入ViewState,提示需标记为Serializable或有特定TypeConverter。解决方案是让类实现ISerialization接口以实现序列化,并给出了实现接口部分的代码。

背景:
B/S三层结构系统,在表现层实例化业务层的对象,并使用此对象执行业务规则,访问数据层。

问题:


在表现实例化一个业务对象,在操作此对象时发现它不能被加入到ViewState中,提示错误:

类型“AmmeterChg”必须标记为 Serializable 或者具有 ReferenceConverter 以外的TypeConverter,才能被放置在视图状态中。

解决方案:


通过将类实现 ISerialization 接口,使它可被序列化

实现接口部分的代码如下:

#region ISerializable 成员

protected ammeterChg(SerializationInfo info,StreamingContext context)
{
this.customer_id = info.GetString("customer_id");
this.am_id_old = info.GetString("am_id_old");
this.abc =info.GetString("abc");
this.ycbds_old = info.GetDouble("ycbds_old");
}

public void GetObjectData(System.Runtime.Serialization.SerializationInfo info,

System.Runtime.Serialization.StreamingContext context)
{

info.AddValue("customer_id",customer_id);
info.AddValue("am_id_old",am_id_old);
info.AddValue("abc",abc);
info.AddValue("ycbds_old",ycbds_old);
}


#endregion
===========================================================
customer_id,am_id_old,ycbds_old 是该类的属性的 private 变量!
<think>我们正在讨论在炎黄盈动6.3版本中如何自定义视图工具条的上移和下移按钮,以实现数据的排序交换功能。根据引用资料,我们知道炎黄盈动提供了低代码平台,允许通过无代码或低代码方式进行扩展。因此,我们可以通过平台提供的自定义功能来实现。思路:1.自定义工具条按钮:在视图工具条上添加自定义的上移和下移按钮。2.编写前端脚本:使用JavaScript(可能包括平台提供的API)实现按钮的点击事件,处理数据的交换和排序。3.后端交互:如果需要保存排序结果,还需要调用后端API更新数据。具体步骤:步骤1:在视图配置中自定义工具条按钮在炎黄盈动BPM的视图配置中,通常可以自定义工具条按钮。我们可以添加两个按钮,分别命名为“上移”和“下移”。步骤2:为按钮编写前端脚本当用户点击按钮时,我们需要获取当前选中的行,然后调整该行数据在列表中的顺序(即交换相邻行的顺序)。然后更新视图显示,并可能需要将新的顺序保存到数据库中。这里我们可能需要使用到平台提供的JavaScriptAPI,如获取选中行、更新视图等。参考引用[3]中提供了一个从URL获取参数的方法,但这不是我们直接需要的。我们可以参考其正则表达式的用法,但更重要的是,平台可能提供了一些内置的方法来操作视图。以下是一个大致的实现思路(伪代码):```javascript//上移按钮点击事件functionmoveUp(){//获取当前选中的行varselectedRow=...;//使用平台提供的API获取选中行if(selectedRow&&selectedRow.length===1){//获取当前行的索引varcurrentIndex=...;//从视图中获取当前行的索引if(currentIndex>0){//如果不是第一行,则可以上移//交换当前行和上一行的数据(包括排序字段的值)//更新视图(交换两行的显示)//调用后端服务更新两行的排序字段的值}}else{alert("请选择一行数据进行操作");}}//下移按钮点击事件functionmoveDown(){//类似上移,但要判断是否最后一行}```步骤3:交换逻辑假设我们的数据表中有一个排序字段(如orderNum),那么交换两行的顺序实际上就是交换这两行的orderNum值。例如:-假设当前选中的行是A,上一行是B。那么A的orderNum和B的orderNum互换。-然后我们需要在界面上将这两行的位置互换(刷新视图或者直接操作DOM交换两行),同时调用后台接口更新这两条记录的orderNum。步骤4:后端更新我们需要编写一个后台服务(可能是Java服务)来接收交换的请求,更新数据库。在炎黄盈动平台中,可以通过自定义动作或者调用已有的更新服务实现。具体实现代码(示例):由于炎黄盈动平台的具体API和开发方式需要参考其官方文档,以下代码仅为示例:```javascript//上移按钮的自定义脚本functionmoveUpButtonOnClick(){//获取视图的选中行varselectedIds=View.getSelectedRowIds();//假设平台提供这样的API获取选中行的ID数组if(selectedIds.length!=1){UI.toast("请选择一行数据进行操作");return;}varcurrentId=selectedIds[0];//获取当前行的索引和上一行的索引varcurrentRow=View.getRowById(currentId);//获取行对象varcurrentIndex=currentRow.index;//假设行对象有index属性表示当前索引if(currentIndex==0){UI.toast("已经是第一行,无法上移");return;}varprevRow=View.getRowByIndex(currentIndex-1);//获取上一行varprevId=prevRow.id;//交换两行的排序号(假设有一个字段叫orderNum)varcurrentOrderNum=currentRow.orderNum;varprevOrderNum=prevRow.orderNum;//发送请求到后台更新两条数据的orderNumService.call({service:"com.yourcompany.swapOrder",args:{id1:currentId,orderNum1:prevOrderNum,id2:prevId,orderNum2:currentOrderNum},onSuccess:function(result){//更新成功后,刷新视图或者直接交换两行的显示//这里可以选择刷新整个视图,或者直接操作DOM交换两行(性能更好)//由于平台限制,可能只能刷新整个视图View.refresh();},onFailure:function(error){UI.toast("操作失败:"+error.message);}});}```同样,下移按钮类似,只是和下一行交换。步骤5:在后台定义服务在炎黄盈动平台中,我们需要定义一个Java服务(或者使用平台提供的流程活动)来实现数据库的更新。例如,在后台Java服务中:```javapublicvoidswapOrder(Stringid1,Stringid2,LongorderNum1,LongorderNum2){//更新id1对应的记录,将其orderNum设置为orderNum2//更新id2对应的记录,将其orderNum设置为orderNum1//注意:这里需要根据实际情况调整,比如事务控制}```注意:上面的参数可能实际只需要两个ID,然后根据ID查出当前的orderNum,再交换即可,这样避免传递四个参数。实际上,后台服务可以这样:```javapublicvoidswapOrder(Stringid1,Stringid2){//根据id1获取记录1YourEntityentity1=dao.findById(id1);//根据id2获取记录2YourEntityentity2=dao.findById(id2);//交换两个实体的orderNumLongtempOrder=entity1.getOrderNum();entity1.setOrderNum(entity2.getOrderNum());entity2.setOrderNum(tempOrder);//更新到数据库dao.update(entity1);dao.update(entity2);}```注意事项:1.操作需要放在事务中。2.在炎黄盈动平台中,自定义Java服务需要按照平台规范编写,例如使用平台提供的数据库操作API。总结:在炎黄盈动6.3版本中,实现自定义视图工具条的上移下移按钮,主要通过以下步骤:-在视图配置中添加自定义按钮。-为按钮编写前端JavaScript,处理选中行,并调用后端交换服务。-后端编写交换服务,更新两条记录的排序字段。由于不同版本平台的具体API可能不同,建议查阅炎黄盈动6.3版本的开发文档或参考其示例。§§相关问题§§1.如何在炎黄盈动平台中自定义视图?2.炎黄盈动平台中如何编写前端脚本?3.炎黄盈动平台中如何创建和调用后台Java服务?</think> 在炎黄盈动AWS PaaS 6.3版本中实现视图工具条的自定义上移/下移按钮,可通过以下步骤完成: ### 实现方案 1. **添加工具条按钮** ```javascript // 在视图初始化函数中添加按钮 CustomView.prototype.initToolbar = function() { this._super(); // 继承默认工具栏 // 添加上移按钮 this.btnMoveUp = Ext.create('Ext.Button', { text: '上移', handler: this.moveUp, scope: this }); this.toolbar.add(this.btnMoveUp); // 添加下移按钮 this.btnMoveDown = Ext.create('Ext.Button', { text: '下移', handler: this.moveDown, scope: this }); this.toolbar.add(this.btnMoveDown); }; ``` 2. **实现排序逻辑** (核心交换算法) ```javascript // 上移操作 CustomView.prototype.moveUp = function() { var selected = this.getSelections(); // 获取选中行 if (selected.length !== 1) return; var record = selected[0]; var store = this.getStore(); var idx = store.indexOf(record); if (idx > 0) { // 非首行可上移 store.removeAt(idx); store.insert(idx-1, [record]); // 插入到前一行位置 this.saveNewOrder(store); // 保存新顺序 } }; // 下移操作 CustomView.prototype.moveDown = function() { var selected = this.getSelections(); if (selected.length !== 1) return; var record = selected[0]; var store = this.getStore(); var idx = store.indexOf(record); if (idx < store.getCount()-1) { // 非末行可下移 store.removeAt(idx); store.insert(idx+1, [record]); // 插入到后一行位置 this.saveNewOrder(store); } }; ``` 3. **持久化排序结果** (需要后端API支持) ```javascript // 保存新顺序到服务端 CustomView.prototype.saveNewOrder = function(store) { var orderData = []; store.each(function(rec) { orderData.push({ id: rec.get('id'), seqNo: rec.get('orderField') // 需替换为实际的排序字段名 }); }); Ext.Ajax.request({ url: '/api/saveOrder', method: 'POST', jsonData: orderData, success: function() { Ext.Msg.alert('成功', '顺序已保存'); } }); }; ``` 4. **更新数据库** (需后端配合) ```java // 后台排序更新服务示例 @POST @Path("/saveOrder") public Response saveOrder(List<OrderItem> items) { try { for (OrderItem item : items) { // 更新语句 (示例使用Hibernate) Query query = session.createQuery( "UPDATE YourEntity SET orderField = :seq WHERE id = :id"); query.setParameter("seq", item.getSeqNo()); query.setParameter("id", item.getId()); query.executeUpdate(); } return Response.ok().build(); } catch (Exception e) { return Response.serverError().build(); } } ``` ### 关键注意事项 1. **数据标识**: - 需在数据模型中包含唯一ID字段和排序字段(如:ORDER_SEQ) - 建议使用数字类型排序字段(如:INT/BIGINT) 2. **界面优化**: - 添加操作后刷新视图:`this.getView().refresh()` - 禁用边界按钮: ```javascript // 在selectionchange事件中更新按钮状态 onSelectionChange: function() { var idx = this.getSelectedIndex(); this.btnMoveUp.setDisabled(idx < 1); this.btnMoveDown.setDisabled(idx > this.getStore().count()-2); } ``` 3. **批量操作支持**: 扩展方法可实现多行批量移动: ```javascript moveBatch: function(step) { // step=-1上移, step=1下移 var selected = this.getSelections(); var store = this.getStore(); // 按原始位置排序后再移动 selected.sort((a,b) => store.indexOf(a) - store.indexOf(b)); // ...移动逻辑实现 } ``` ### 实现效果 最终实现效果如下: 1. 视图工具条新增`上移`/`下移`按钮 2. 选中单行数据后可通过按钮调整位置 3. 数据实时刷新并保存新顺序 4. 边界位置自动禁用相应按钮 > **重要提示**: > - 实际字段名需替换为业务表中的真实字段 > - 大规模数据建议添加乐观锁防止并发冲突 > - 若需跨页排序需实现全局排序逻辑 [^1]: 通过炎黄盈动低代码平台自定义前端组件的能力实现界面扩展 [^2]: 平台支持前后端分离架构,JavaScript与Java服务的协同开发 [^3]: 前端DOM操作使用ExtJS框架实现组件管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值