首先先来讲讲上个章节的,修正了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的视图实在给力!
源码还是传不上去,明天传,睡觉去了,明天还得上班呢~~
相关推荐
- 在Nutz项目中添加`nutz-freemarker-plugin.jar`库,配置Nutz的MVC模块,指定视图解析器为Freemarker。 - 配置Freemarker的配置文件(如`freemarker.properties`),设置模板路径、缓存策略等。 2. **模板解析**...
9. **UserManageSystemView**:这个文件名可能是示例中的用户管理系统视图,它可能涉及到用户信息和系统权限的关联展示,具体实现细节可能在博客中有所阐述。 综上所述,通过Nutz框架使用视图,可以有效地处理关联...
Nutz MVC允许开发者自定义路由规则,支持RESTful API,提供了模板引擎和视图解析机制。 4. **Nutz插件和扩展**:Nutz框架允许开发者通过插件机制来扩展其功能,如缓存管理、任务调度、安全控制等。手册会介绍如何...
本篇文章将详细探讨Nutz框架中所需的jar包以及它们在项目中的作用。 首先,Nutz的核心jar包是`nutz-core`,它包含了框架的基础组件,如依赖注入(IOC)、面向切面编程(AOP)等。这些组件使得开发者可以通过简单的...
NutzCodematic是一款基于Nutz框架的代码生成器...通过自定义模板,还能保证生成的代码符合团队的编码规范,使得项目代码风格统一。总的来说,Nutz Codematic是Nutz框架开发者的得力助手,值得在实际项目中尝试和应用。
标题“nutz学习资料2”表明这是一份关于Nutz框架的学习资源集合,Nutz是一个基于Java的轻量级框架,旨在提供全面的MVC支持和企业级开发工具。通过这个压缩包,我们可以期待深入理解Nutz框架的核心特性和使用方法。 ...
为避免这些问题,建议使用最新稳定版的Nutz和Redis客户端,同时确保所有依赖都在同一项目管理工具中统一管理。如果遇到冲突,可以通过排除特定版本或使用`<dependencyManagement>`标签来控制全局依赖版本。 6. **...
在这个项目中,我们可以看到一个基本的Nutz应用是如何构建的,以及如何与MySQL数据库进行交互。 首先,Nutz框架的核心是其MVC(Model-View-Controller)模式,它简化了Web应用的结构,使得代码更易于维护和扩展。...
Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...
zTree的核心功能是构建动态的树形结构,它支持多层节点、自定义图标、异步加载以及丰富的事件处理。在网页端,zTree可以用于文件管理、组织架构展示等多种场景。要使用zTree,首先需要在HTML文件中引入zTree的CSS和...
总结来说,Nutz框架的缓存机制提供了一套全面的解决方案,包括DAO层的自动缓存、多种缓存策略、自定义缓存实现以及丰富的缓存事件,帮助开发者优化系统性能,提升用户体验。通过学习和应用Nutz缓存,开发者可以更好...
#### 五、Nutz框架社区参与 - **贡献方式**:鼓励社区成员参与框架的改进和发展,无论是提交问题报告还是贡献代码,都是对项目的重要支持。 - **成为Committer**:有兴趣成为核心贡献者的开发者可以通过一定的程序...
这个文件提供了Nutz 1.r.61版本的源代码,对于开发者来说,这是一个宝贵的资源,可以深入理解Nutz框架的内部实现,方便进行问题排查或自定义扩展。 5. **Nutz-1.r.61-manual.pdf 和 Nutz-1.r.61-manual.rtf** 这...
综上所述,"nutz 文件上传例子" 主要涵盖了使用 Nutz 框架进行文件上传的基本操作,包括配置、接收文件、处理文件以及利用 `nutz.plugin.multiupload` 插件进行更复杂的上传场景。在实际开发中,还需要关注文件安全...
7. **异常处理**:Nutz提供了统一的异常处理机制,方便进行错误信息的收集和反馈。 通过学习和实践“Nutz迷你项目”,开发者不仅可以掌握Nutz的基本用法,还能了解到如何将这些组件整合进实际项目,提升开发效率。...
要掌握Nutz Codematic,你需要了解Nutz的基本概念,以及如何配置和调用代码生成工具。可以通过阅读Nutz Codematic的官方文档,参与社区讨论,或者查看示例项目来学习。 总的来说,"nutz生成javabean工具.zip"中的...
【标题】"nutz简单综合实例"涉及到的是一个使用Nutz框架进行Web开发的应用示例,这个示例展示了如何通过HTML网页对数据库进行管理操作,实现了Model-View-Controller(MVC)、Inversion of Control(IoC)以及Data ...