Ruby on Rails 他山的宝石 - 改进我们的struts!

告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南) 本文详细介绍了如何使用ArcGIS和GTB进行生态源地MSPA分析的全流程,包括软件安装、数据预处理、参数设置、结果可视化和常见问题排查。特别针对ArcGIS和GTB组合使用时的常见问题提供了避坑指南,帮助研究者高效完成生态规划任务。 阅读详情
ROR的飓风劲吹,仁者心动。
我们开发团队mvc一直是用struts,我准备用它的 convention over configuration  之风清洗一下我们的struts使用,顺便把CRUD通用业务操作也完善起来,重复的工作让它最简,且保留扩展点。在看ROR的帖子时扫到了Jdonframework,也借鉴了一些思路。
       下来我把基本的思路描述一下:
       ROR用约定的url格式+反射简化了大量配置xml内容,如下:
       http://localhost/app[b]/user/view/3,明显,前缀user代表DomainObject,后面的view代表业务方法,最后为id参数.
      首先,在struts中,我完全支持粗粒度的Action设计,即一组相关操作置入一个DispatchAction,这个类的用法不简洁,需要在ActionMapping节点中配上parameter="method",然后采用这种url:
http://localhost:8080/app/user.do?method=view&id=1
无疑,ROR的方式更自然和简洁一些。这一步修改并不复杂,我重载ActionServlet(只重载RequestProcessor类就可以了),使其默认的根据Path寻找action的规则变成:首先全路径查找,如果找不着,使用前缀查找,如:
http://localhost:8080/app/user/view.do?id=3,首先会根据/user/view在struts-config.xml中查,若查不到,再用/user查。这样作的目的是:一个UserAction假如有CRUD等方法,还是要配置两处的,因为涉及表单的ActionMapping得有input节点和name(action form),而只读操作并不需要这些,这也是struts的一处硬伤。


接下来,我们扩展一下DispatchAction,预制view、delete、edit这几个常用方法,抽取其共同流程(按约定),并留出扩展点,url中的后缀,即view就以是Action中的方法了,

由于我们是采用spring+hibernate+struts的,并不能完全的DDD,所以,在action中根据前缀定位到Manager的实例,来方便一些通用的CRUD操作(原先我的设想是用spring接管action,注入一些特性,但现在这种用url反射的方法更简单一点)。

另外,在传统的struts-config.xml中有很多看起来冗余的配置项,例如:
<action type="xxx" input="/edit/xxx.jsp">
    <forward name="success" path="/edit/xxx.jsp"/>
</action>
这个forward一般情况下就是一个多余配置,95%以上的表单错误信息都会显示在编辑jsp页本身上。

稍微复杂一点的是edit动作,它隐藏了readyAdd、readEdit、insert、update这几个分支,完全用url中的参数或表单中用于过渡的令牌字来判断,保存操作涉及一个manyToOne属性的问题。我会在我的domain包中建一个RelationshipMapping类和一个单例的RelationshipMappingRegistry类,来辅助处理它。


至于扩展点,我想至少有这几个:
propected void populateObject(HttpServletRequest request, Object object, ActionForm form);
protected void populateForm(AbstractEditorForm form, DomainObject object);
 protected void refererData(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) ;

从名字可以看出,populateObject是负责把domain object正确地解析为dto(即ActionForm)的,而populateForm刚好相反,在save前将dto->domain object,这里需要作的只是一些一对多关系,普通的beanUtils就代劳了。第三个方法是edit方法中需要提供的相关字典数据,比如说,在编辑页面中,有一个select,需要一个部门的列表,它需要在上下文中预置。
使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型 直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。 阅读详情

相关推荐

Xilinx实战-深入AXI UART Lite IP核的配置与调试

本文详细介绍了Xilinx FPGA中AXI UART Lite IP核的配置与调试方法,包括Vivado环境下的IP核设置、关键参数优化、寄存器操作及常见问题排查。通过实战案例和代码示例,帮助开发者快速掌握AXI接口的串口通信技术,提升嵌入式系统开发效率。

weixin_29189377的博客 228

我的eclipse版本选择

IDE的选择大多是先入为主,如果一开始你上手了JBuilder,眼中就全是它的好,其缺点也可以包容了,况且高手们都不会对主流工具有任何偏见的。我搞过几年的delphi,按理说应该首选borland的产品,但我第一次搞的J2EE项目,公司是亲IBM系的,websphere + visualAge,后来出了Eclipse,没理由不爱它。现在机器上留着两个版本,同时在用,2.1.2 和 3.0.

青之六号 4489

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2971

eclipse的Spring插件安装备忘

只要可以可视化管理好Bean配置文件,就方便多了。for eclipse 3.0.1首先到eclipse下载站点上(tool)找到GEF3.0.1,安装成功后,在eclipe中打开help>software updates>find and install,选择 search for new features to install. 在打开的界面中,选择new remote site,加入

青之六号 4094

密码学实战:如何利用生日攻击破解哈希函数

本文深入探讨了生日攻击在密码学中的应用及其对哈希函数的威胁。通过分析生日悖论的数学原理,揭示了哈希函数在实际应用中的脆弱性,并提供了防御策略,如升级哈希算法、正确使用加盐技术等。文章结合实战案例,帮助开发者理解如何有效防范此类攻击,确保系统安全。

weixin_42530732的博客 192

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 296

iBatis终于出了2.0.9,解决了N+1查询问题。

新年新气象,庆祝。待我试用。 作者给出的这个n+1 select解决方案,是针对一对多的,他认为一对一内联类属性的映射,通过视图select和lazyload,已经可以方便地解决,所以着重解决的是1:M / M:N的问题,我拿jpetstore中的表作为例子,如下: groupBy="categoryId">                resultMap="Category.productRe

青之六号 3904

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3202

思维导图 - j2ee团队开发规范、框架、培训

脑图工具为FreeMind 8.0,左侧的过程规范主要参照了敏捷方法中的诸多最佳实践,结合了我们的团队情况。1. 编码规范使用了CheckStyle的Eclipse插件,供程序员第一道检查,缩进等采用IDE自带的代码格式化命令。它自带的Sun checks异常严格,进行了大刀阔斧的裁减,直到本人不感到特别不适为止。这个新的规则xml文件也更新到maven的report-plugin中。2. 单元测

青之六号 3711

uniapp - 解决uni.getLocation定位不准有偏差,定位经纬度不准确有几百米误差、获取地图定位有偏差怎么办,已配置高精确度但依旧不精准(uni.getLocation定位不准如何解决)

uni.getLocation,获取当前的地理位置、速度。已经设置altitude高精度,uniapp API获取定位有差异问题解决,获取定位有几百米偏差,uni.getLocation(OBJECT)中使用默认type ”wgs84“会导致定位不准的问题,gcj02,uni.getLocation地图定位不准,获取经纬度错误偏移了几十公里,经纬度的精确度误差,怎么消除经纬度偏差,解决 uniapp uni.getLocation 定位经纬度不准问题,使用定位不准,定位不准误差问题,解决定位不准问题,高德地

✅ 精选推荐文章 1万+

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2747

iBatis 学习 之一 DAO部分

iBatis作者不喜欢在类前加详尽的说明,批评一下.首先看一下包 com.ibatis.dao.client 1 定义了一个声明式接口 Dao2 一个DaoManager接口,它有一个创建Dao实例的工厂方法:  public Dao getDao(Class type); 是为了将用户自己写的Dao接口与sqlMap实现类解藕,通过在dao.xml中指定二者的映射。   public Dao

青之六号 3163

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

Acegi 的扩展

    年刚过,还很懒,这个东东年前都开始关注了,今天把学习成果总结一下。    Acegi,一个安全系统,拦截器和面向接口的编程方式,支持ACL、JAAS基于Spring.我的理解其价值在于:replace Container-Managed Authentication,将安全这一块脱离具体j2ee容器,将来需要迁移时少一些麻烦,它足够强大,可以给web系统甚至cs应用提供足够的安全保护机制。

青之六号 3128

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用struts标签在JSP格式化输出日期型属性值

当bean中有datetime型的属性时,在网页上格式化输出,以前我是使用工具类的静态方法进行转换。现在发现了struts自已有更简单的处理办法,如下:1.在资源文件里添加如下键值(我使用IBM的工具RbManger,很好用的):global.formatDateTimeAll=yyyy年MM月dd日 HH:mm:ssglobal.formatDateTime=yyyy年MM月dd日 HH:m

青之六号 3036

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

spring 分模块开发简单实践

spring 分模块开发背景      我们一般采用spring+struts+ibatis的开发模式,使用spring统管业务bean,当项目很大时,面临一个bean命名冲突问题,如果和struts一样,采取分模块的方式,不同的模块有自己的命名空间,将会避免几个并行开发的子系统或模块共用一套bean配置文件时id产生重名的问题。简单方案     整个系统所使用的公共bean,例如数据源、

青之六号 2999

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

一则spring中使用PropertyEditors 来注入日期型属性的技巧

如题。                                                                       yyyy-MM-dd                               false                                                1981-01-01      

青之六号 2726

pojo+xDoclet生成ibatis映射文件

        XDoclet实现基本原理是,通过在Java代码加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件,在Ejb、hibernate、struts中使用得比较广泛了,ibatis比较草根,没有这个棉袄穿,怎么办呢,大过年的,为了让ibatis也有新衣服穿,我只好弄一个了。如果你不了

青之六号 2564

struts 单元测试

自动化测试可以减缓我们的压力,在重构时增强信心。在J2ee体系中,分层(tier)设计的思想大家都已经比较熟悉了,在持久层和业务层的测试比较简单,使用junit就可以了,但是涉及到web容器,例如对struts部分的测试,就比较麻烦了,我以前也一直是只对service层作单元测试的,即首先保证facade层不出错。我对web层的测试的概念一直认为是作并发性访问压力测试,性能测试的,没想过作功能性的

青之六号 2308

实践struts之token防止回退重复提交表单

动用google,找到一两篇相关文章,实践成功。建一个action基类TokenAction,使用模板方法,如下: public ActionForward execute( ActionMapping mapping,                                                ActionForm form,                    

青之六号 2269

学习appfuse,用xdoclet代码生成

今天继续摆弄ant+xdoclet,颇上瘾,眼下实践成功根据pojo自动生成对应的以下9种东东:1. ibatis的sqlmap配置文件(已在上一篇blog中详尽介绍)2.dao接口3.dao的junit测试类4.dao的ibatis impl类5.struts ActionForm类6.用于新增或修改的jsp页7.struts acion类8.service接口9.service的impl类,用

青之六号 2036

我的使用struts menu动态从数据库建树型菜单设计

关于struts-menu,中文资源只有蓝色天空网站站长的两篇文章广为传播,在此表示感谢。1.“源码分析”见http://champion.ewuxi.com/old/opensource/struts-new/strutsmenu.htm2.“ibatis+少量代码动态建树“见 http://www.ewuxi.cn/ithome/develop/deve_languagedata/20

青之六号 1993

eXtremeTable -

http://www.extremecomponents.org/  让我怀念起了以前delphi控件编程时代,在jsf还没有成熟之前,先拿这个预热吧,超级好用,半小时学会。扩展能力极强。排序、分页、国际化、动态列、日期货币输出格式、导出excel和pdf。让我如何不爱你? 更可贵的是,相比displayTag的一次数据读入来说,它在性能上不输于VauleList。表格&表单,两大b/s开发基本h

青之六号 1897

VS Code + KXApp 开发 iOS 报错排查指南,工程、签名、真机、补全、配置

在 VS Code 里用 KXApp 开发 iOS,报错常不在代码而在环境。本文按失败阶段分五类排查:工程没出现 Xcode 视图(查 .xcodeproj 与 xcode-select)、构建失败(No profiles、Team 签名、CocoaPods 用 .xcworkspace)、真机调试失败(信任、开发者模式、设备未准备好)、没补全或 No such module(等索引、清 clangd 冲突)、设置保存不了(装 xcodeproj gem),每类给现象、日志通道和修法。

2501_91590906的博客 209

GEM5架构解析

kkk12344的专栏 219

【混合缓存】五种同步通道与它们的失效模式:为什么 Pub/Sub 不可靠反而是对的(五)

本文剖析混合缓存同步层的五种实现(Redis Pub/Sub、RocketMQ、Kafka、RabbitMQ、NATS),指出选型关键不在延迟、吞吐或运维成本,而在于“丢、重、乱”三种失效形态。核心结论:同步消息仅传递“失效指令”,而非数据本身,因此“重”与“乱”因幂等性无害,唯有“丢”需兜底。通过分析各通道在消息丢失场景下的表现,揭示其本质差异——真正决定系统可靠性的,是“何时丢”及“靠什么兜底”。最终强调:同步层只需低延迟通知,可靠性由时间上界(如forceExpiryTime)保障,无需通道保证完全可

tantan的小记录 442
上一篇: 七剑与java开源工具
下一篇: Groovy - 舍与得
_chage
博客等级 码龄24年 2粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值