首先先来讲讲上个章节的,修正了2个bug:1、自读字段不用disabled而是用readonly;2、修正了parseAttr默认值覆盖当前值的bug。
上个章节的效果图补在这:
这个章节,由于我考虑到的是,我在后台进行操作时可能需要给后台反馈许多信息,例如操作的成功与否、是否出现程序异常等,而这些信息都需要通过CtrlResult的实例返回,这样才能够正确的与我前台封装的控件挂上勾来。但是如果我们每次都手动的new一个CtrlResult的实例,然后去设置值,未免显得有些太粗糙了,在加上异常信息的处理,每次都去try catch之后再包裹信息,多烦啊。
因此,nutz默认为我们提供的json视图已经不能满足我的需求了。于是我用了nutz的自定义视图。我写的时候,其实只是把nutz源码中的json的视图拿过来做做修改而已。
我定义了两个视图(只贴主要部分):
public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws IOException { if(obj!=null){//如果不为空 if(obj instanceof TPager) {//分页数据 CtrlResult cr = new CtrlResult(); cr.setValue(obj); Mvcs.write(resp, cr, format); }else {//直接返回当前数据。 Mvcs.write(resp, obj, format); } }else{//void形式时,返回提示信息“操作成功!” CtrlResult cr = new CtrlResult(); cr.setMsg("操作成功!"); Mvcs.write(resp, cr, format); } }
public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws IOException { if(obj!=null){ CtrlResult cr = new CtrlResult(); if(obj instanceof RuntimeException){//运行时异常 cr.setMsgType(CtrlResult.MSG_TYPE_ERR); cr.setValue(obj); RuntimeException re = (RuntimeException) obj; cr.setMsg(re.getMessage()); }else{ cr.setMsgType(CtrlResult.MSG_TYPE_ERR); cr.setValue(obj); Exception re = (Exception) obj; cr.setMsg(re.getMessage()); } Mvcs.write(resp, cr, format); }else{ Mvcs.write(resp, data, format); } }
public View make(Ioc ioc, String type, String value) { type = type.toLowerCase(); if (VIEW_EXCEPTION.equals(type))//异常 if (Strings.isBlank(value)) return new ExceptionView(JsonFormat.compact()); else return new ExceptionView(Json.fromJson(JsonFormat.class, value)); else if (VIEW_SUCCESS.equals(type))//成功 if (Strings.isBlank(value)) return new SuccessView(JsonFormat.compact()); else return new SuccessView(Json.fromJson(JsonFormat.class, value)); return null; }
然后在MainModule中修改annotation配置:
@Modules(scanPackage=true) @Views(TViewMaker.class) @Ok("success") @Fail("exception") @IocBy(type=ComboIocProvider.class, args={ "*org.nutz.ioc.loader.json.JsonLoader", "cfg/ioc/", "*org.nutz.ioc.loader.annotation.AnnotationIocLoader", "com.tt" }) @SetupBy(value=TSetup.class) public class MainModule { }
这样,在成功情况下,我的ctrl可以不设置返回值,那么前台默认提示“操作成功!”
@At("/create") public void create(@Param("..")Curd curd){ //插入操作 }
如果返回值为TPager,我将视为分页数据,因此为自动为其包裹在CtrlResult实例中:
@At("/query4Page") public TPager query4Page(){ List<Curd> list = new ArrayList<Curd>(); for(int i = 0; i < 10; i++){ Curd curd = new Curd(i, "name" + i, "address" + i, i); list.add(curd); } return new TPager(list, list.size()); }
除以上情况,我将直接将对象返回给前台。
为了方便返回成功状态下的CtrlResult实例,在TUtils中封装了getOk方法。
当系统的提示信息一多时,如果用String写死在每段业务代码中的话,那么后期维护起来肯定会吐血的,所以建议要嘛通过配置文件管理,要嘛通过数据库管理。严禁直接写死在代码中(我目前在写的一些例子可能还是会出现直接写死的情况,1是做测试而已比较懒,你们不能学的哈;2、是为了写博客的时候方便大家直接了解意思,喷我吧~~)。至于是采用文件还是数据库,这个可能就要看具体的项目要求了,因此我定义了一个IMsgLoader接口:
/** * DESC:通过信息编码获取到对应的提示信息,并为占位符填充相应信息。 * @author Small * @Email 536762164@qq.com * @since 2013-5-20 * * @param msgCode * @param args * @return */ public String getMsg(String msgCode, Object... args);
默认的,我定义了一个通过properties文件配置消息码的,采用了ResourceBundle实现,具体代码我就不贴了。然后在cfg.ioc下面新增一个app.js,用来放置一些注入实例,在其中添加对IMsgLoader的注入:
msgLoader : { type : "com.tt.pub.msg.impl.MsgLoader4Prop" }
如果要切换实现方式,只需要在这个配置中改就可以了。
接着,我将msgLoader缓存在TCache中,设置的代码在TInit中实现。然后在TUtils中实现了getMsg方法,用于公共获取消息。这部分实现之后,我们就可以来设计一个属于自己的异常类了。
异常类我定义为MsgException:
public class MsgException extends RuntimeException { /** * */ private static final long serialVersionUID = 1L; /** 消息码 */ protected String msgCode = ""; /** 传参 */ protected Object[] args; /** * @param e 异常类 * @param msgCode 消息码 * @param args 传参 */ public MsgException(Throwable e, String msgCode, Object... args){ super(e); this.msgCode = msgCode; this.args = args; } /** * @param msgCode 消息码 * @param args 传参 */ public MsgException(String msgCode, Object... args){ this.msgCode = msgCode; this.args = args; } /** * Desc:获取消息。 * @author Small * @Email 536762164@qq.com * @since 2013-5-20 * * @return */ public String getMsg(){ return TUtils.getMsg(msgCode, args); } public String getMessage(){ return TUtils.getMsg(msgCode, args); } }其实也就是重写了getMessage方法,这时候就与ExceptionView中的内容相结合了。我们用这个异常类来返回我们的业务异常提示信息。
通常我们在进行一些业务操作时,会进行一些判断,如果判断不通过则终断并返回给前台信息。在没有这个异常类前,我们可能会这么处理:
public CtrlResult oper(){ //TODO 业务操作1 if(用户不存在) return 用户不存在 //TODO 业务操作2 return 成功 }但是这种操作会产生很多问题,代码量多时一回事,有时还得自己做事务回滚操作。
于是我们有了通过异常的解决方案:
public CtrlResult oper(){ //TODO 业务操作1 if(用户不存在) throw new MsgException("用户不存在"); //TODO 业务操作2 return 成功 }
如此,通过异常我们就可以很容易来操作了。但是这还不满我意。于是我在TUtils中定义了一个pass方法。当第一个参数为ture时表示通过,否则将抛出异常:
public static void pass(boolean judge, String msgCode, Object... args){ if(!judge){ throw new MsgException(msgCode, args); } }
获取你们会觉得有些多余,但这是我个人的习惯,觉得这样挺好理逻辑的,个人相对比较喜欢这样的代码:
public CtrlResult oper(){ //TODO 业务操作1 TUtils.pass(用户存在, "用户不存在"); //TODO 业务操作2 return 成功 }
当然,你有权不按我这么做,也可以喷我哈~~
至此,今天的内容就结束了。值得说的是,nutz的视图实在给力!
源码还是传不上去,明天传,睡觉去了,明天还得上班呢~~
相关推荐
员工晋升管理制度.doc
内容概要:本文详细探讨了将阶梯式碳交易机制和电制氢技术应用于综合能源系统的热电优化方法。首先介绍了阶梯式碳交易的建模方式,通过分段线性化处理碳排放成本,使模型能够更好地反映现实中的碳市场价格波动。接着讨论了电制氢技术的应用,包括电解槽、甲烷反应器和氢燃料电池的具体实现及其在系统中的角色。此外,还提出了热电联产(CHP)系统中热电比动态调整的方法,提高了系统的灵活性和经济效益。文中提供了详细的MATLAB和CPLEX代码示例,展示了如何将这些复杂的技术和政策机制融入优化模型中。 适合人群:从事综合能源系统优化的研究人员、工程师以及对低碳技术和能源管理感兴趣的学者。 使用场景及目标:适用于需要进行低碳转型的企业和机构,旨在通过引入先进的碳交易机制和氢能技术,降低碳排放并提高能源利用效率。目标是在满足能源需求的同时,减少环境影响并降低成本。 其他说明:文中提到的优化模型不仅关注技术实现,还强调了经济性和环保效益之间的平衡。通过合理的参数设置和求解器配置,可以在不影响系统性能的前提下显著提升优化效果。
内容概要:本文详细介绍了7电平模块化多电平换流器(MMC)的闭环控制系统仿真,重点探讨了外环和内环控制、电容电压平衡、二倍频环流抑制以及载波移相调制等关键技术。作者通过MATLAB、Python和Verilog等多种编程语言实现了各个控制模块的具体算法,并分享了调试过程中遇到的问题及解决方案。实验结果显示,该系统能够将直流电压纹波控制在0.8%以内,环流幅值降至额定电流的3%以下,具有较强的鲁棒性和稳定性。 适合人群:电力电子工程师、高校师生及相关研究人员,特别是对MMC仿真感兴趣的初学者和技术爱好者。 使用场景及目标:适用于研究和开发高效稳定的MMC系统,特别是在高压直流输电领域的应用。主要目标是提高系统的稳定性和效率,减少电容电压失衡和环流震荡等问题。 其他说明:文中提供了详细的代码实现和调试技巧,有助于读者深入理解和掌握MMC闭环控制的关键技术和实践经验。同时,作者还提出了一些优化方向,如加入模糊控制器进一步提升系统性能。
2. 亚马逊【官方选品方法论】《五三选品法》.pdf
员工职业生涯规划表、能力开发需求表
内容概要:本文详细介绍了利用MATLAB实现的小波阈值降噪技术,涵盖三种主要方法:自定义阈值、智能推荐阈值以及分层精细处理。首先,通过生成带噪信号作为实验对象,展示了如何使用硬阈值和软阈值进行去噪。接着,探讨了智能推荐阈值的方法,如贝叶斯估计法,能够自动确定最优阈值。最后,深入讲解了分层处理的技术,通过对不同层次的细节系数分别设定阈值,达到更好的降噪效果。文中还提供了大量MATLAB代码实例,帮助读者理解和实践。 适合人群:具有一定MATLAB基础并希望深入了解小波变换理论及应用的研究人员和技术人员。 使用场景及目标:适用于各种含有噪声的数据处理任务,特别是机械振动信号、音频信号等领域。目标是提高信号质量,增强后续数据分析的有效性和准确性。 其他说明:文中强调了参数选择的重要性,如小波基的选择、分解层数的设定等,并给出了具体的调试建议。此外,还提到了一些常见的错误及解决办法,便于初学者快速上手。
集团关怀活动方案.doc
辞退面谈与赔偿金计算P23.pptx
月度招聘报表.xlsx
内容概要:本文详细介绍了基于容积卡尔曼滤波(CKF)和滑膜控制(SMC)的永磁同步电机(PMSM)无传感器控制技术。首先阐述了CKF的工作原理及其在状态估计中的优势,包括状态预测、量测更新和状态后验分布的计算。接着讨论了滑膜控制的设计思路和实现方法,强调其在快速响应和鲁棒性方面的特点。文中还提供了Python和Matlab的代码示例,展示了这两种控制方法的具体实现。通过仿真和实验结果表明,该方法在转速估计和控制精度方面表现出色,具有广泛的应用前景。 适合人群:从事电机控制系统设计的研究人员和技术人员,尤其是关注高精度、高动态性能的无传感器控制方案的专业人士。 使用场景及目标:适用于需要高精度、高动态响应的电机应用场景,如工业自动化、航空航天等领域。主要目标是提高电机控制系统的精度和鲁棒性,降低系统成本和复杂度。 其他说明:文中提到的CKF和SMC方法不仅限于理论探讨,还包括了详细的代码实现和实验数据支持,有助于读者深入理解和实际应用。此外,文中还提到了一些优化技巧,如启动阶段误差补偿和高级CKF版本的选择,进一步提升了系统的性能。
解聘职员申请表-模板.doc
内容概要:本文详细介绍了如何使用MATLAB对并联机器人进行仿真实现,涵盖了运动学建模、动力学分析和轨迹跟踪控制三大方面。首先,通过定义关键参数和几何法求解逆运动学,建立了Delta并联机器人的运动学模型。接着,利用牛顿-欧拉法推导动力学方程,考虑了惯性力、重力等因素的影响。最后,采用PD+前馈控制方法实现轨迹跟踪,并通过仿真验证了控制效果。文中还提供了具体的MATLAB代码示例,帮助读者更好地理解和应用相关理论。 适合人群:对机器人技术感兴趣的科研人员、高校学生及工程技术人员。 使用场景及目标:适用于研究并联机器人的运动特性、优化控制系统性能、验证新算法的有效性等场景。目标是掌握并联机器人的建模与控制方法,提高仿真能力。 其他说明:文章强调了仿真过程中需要注意的问题,如奇异位形、数值稳定性等,并给出了相应的解决方案。同时,鼓励读者动手实践,通过调整参数和改进算法来深入探索并联机器人的行为特征。
新员工入职引导及融入管理办法
内容概要:本文详细介绍了光伏系统中最大功率点跟踪(MPPT)技术的一种常见实现方式——扰动观察法及其仿真模型的构建。文章首先阐述了扰动观察法的基本原理,即通过不断改变光伏电池的工作点并观察功率变化来逐步逼近最大功率点。接着,提供了具体的Python和MATLAB代码实现,展示了如何在MATLAB的Simulink环境中搭建光伏系统仿真模型,包括使用内置或自建光伏电池模型。文中强调了自建光伏电池模型的优势,如可根据实际情况调整参数,使仿真结果更为精确。此外,还讨论了仿真过程中可能出现的问题及解决方案,如电压振荡、误判和响应速度等,并通过视频解释进一步增强了理解和实用性。 适合人群:对光伏发电技术和MPPT算法感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解光伏系统工作原理、掌握MPPT算法实现方法的研究人员;希望通过仿真验证和优化光伏系统性能的工程师;以及对光伏技术感兴趣的学习者。 其他说明:文章不仅提供了详细的理论讲解和技术实现步骤,还包括了实际案例分析和视频教程链接,便于读者更好地理解和实践。
内容概要:本文详细介绍了对称修正梯形加速度规律插补算法的推导与仿真实现。传统梯形加速度模型在加减速转换时会产生冲击,而对称修正梯形加速度通过引入过渡段使加速度变化更加平滑。文中首先推导了算法的基本原理,包括加速和减速阶段的分段处理方法,并给出了Python代码示例用于模拟加速阶段的速度变化。接着,利用MATLAB进行了仿真验证,展示了速度曲线的平滑过渡特性。此外,还讨论了实际应用场景中的参数选择和注意事项,如伺服电机的扭矩限制以及高阶多项式的使用风险。通过对机械臂的实际测试表明,该算法能够显著降低末端振动幅度,提高运动控制的精度和平稳性。 适合人群:从事运动控制、数控加工等相关领域的工程师和技术人员,尤其是希望深入了解加速度规律插补算法及其优化的人群。 使用场景及目标:适用于需要优化运动控制系统的场合,特别是那些对平稳性和精度有较高要求的应用,如机器人、数控机床等。目标是减少机械冲击,提升设备运行的稳定性和可靠性。 其他说明:文中提供了详细的数学推导和代码实现,帮助读者更好地理解和应用这一算法。同时提醒读者在实际应用中应注意参数的选择和硬件限制,确保算法的有效性和安全性。
基于51单片机protues仿真的番茄计时器(仿真图、源代码、AD原理图、流程图、视频) 设计一个番茄计时器。使用番茄工作法(番茄工作法是一种时间管理方法),选择一个待完成的任务,将番茄时间设为45分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后进行短暂休息一下(5分钟),然后再开始下一个番茄。每4个番茄时段再多休息5分钟。 按键1:单击设置45分钟倒计时,双击设置5分钟休息倒计时。 按键2:单击音乐播放,双击暂停。按键3:复位按键。 所需硬件:3个按键,1个动态数码管,1个蜂鸣器。 仿真图、源代码、AD原理图、流程图、视频
内容概要:本文详细介绍了利用CST进行可重构超表面的设计与仿真方法,涵盖材料建模(如二氧化钒和石墨烯)、相位调控(如涡旋相位阵列)以及联合仿真技巧。文章提供了多个MATLAB和CST脚本实例,帮助解决仿真过程中常见的难题,如材料参数调整、相位纯度计算、联合仿真中的索引顺序问题等。此外,还分享了一些实用的仿真优化技巧,如参数扫描、场分布配色方案等。 适合人群:从事超表面研究的科研人员和技术开发者,尤其是有一定CST和MATLAB使用经验的研究者。 使用场景及目标:适用于希望深入了解并掌握超表面建模与仿真的研究人员,目标是提高仿真效率和准确性,特别是在可重构超表面的设计和优化方面。 其他说明:文中提供的代码片段和技巧可以直接应用于实际项目中,有助于加速实验进程并获得更精确的仿真结果。同时,文章强调了仿真过程中需要注意的关键细节,避免常见错误。
内容概要:本文详细介绍了利用COMSOL软件研究相控阵聚焦声压分布的技术方法。首先探讨了压力声学-频域模块的作用及其在构建几何模型中的应用,接着深入讲解了相位差设置对声波叠加效果的影响。文中还展示了不同频率和聚焦深度下声压分布的变化情况,并提供了具体的代码示例用于理解和实施。此外,文章强调了网格划分、边界条件设置以及优化求解过程的重要性,旨在提高仿真效率和准确性。 适合人群:从事声学研究、超声成像、无损检测等领域科研工作者和技术人员。 使用场景及目标:①掌握COMSOL中压力声学-频域模块的基本操作;②学会根据不同应用场景调整相位差以达到理想的声压分布;③理解频率和聚焦深度对声压分布的具体影响;④提升仿真模型的精度和计算效率。 其他说明:文章不仅提供了理论知识,还包括大量实用的操作技巧和注意事项,如相位差公式的正确使用、网格划分策略、边界条件设置等,有助于读者快速上手并在实践中不断改进。
人力资源部门内训:员工关怀浅探