`
Small嗳TT
  • 浏览: 11591 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

TT随笔五 Nutz自定义视图以及提示信息的统一管理

 
阅读更多

首先先来讲讲上个章节的,修正了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的视图实在给力!

 

源码还是传不上去,明天传,睡觉去了,明天还得上班呢~~

  • 大小: 20.1 KB
  • 大小: 5.7 KB
  • 大小: 5.2 KB
  • 大小: 5.5 KB
  • TT.zip (3.6 MB)
  • 下载次数: 31
分享到:
评论

相关推荐

    nutz的freemarker视图插件

    - 在Nutz项目中添加`nutz-freemarker-plugin.jar`库,配置Nutz的MVC模块,指定视图解析器为Freemarker。 - 配置Freemarker的配置文件(如`freemarker.properties`),设置模板路径、缓存策略等。 2. **模板解析**...

    在Nutz[1.b.38]中使用视图对关联数据表的操作

    9. **UserManageSystemView**:这个文件名可能是示例中的用户管理系统视图,它可能涉及到用户信息和系统权限的关联展示,具体实现细节可能在博客中有所阐述。 综上所述,通过Nutz框架使用视图,可以有效地处理关联...

    nutz框架使用手册.zip

    Nutz MVC允许开发者自定义路由规则,支持RESTful API,提供了模板引擎和视图解析机制。 4. **Nutz插件和扩展**:Nutz框架允许开发者通过插件机制来扩展其功能,如缓存管理、任务调度、安全控制等。手册会介绍如何...

    nutz需要的jar包

    本篇文章将详细探讨Nutz框架中所需的jar包以及它们在项目中的作用。 首先,Nutz的核心jar包是`nutz-core`,它包含了框架的基础组件,如依赖注入(IOC)、面向切面编程(AOP)等。这些组件使得开发者可以通过简单的...

    nutz代码生成器

    NutzCodematic是一款基于Nutz框架的代码生成器...通过自定义模板,还能保证生成的代码符合团队的编码规范,使得项目代码风格统一。总的来说,Nutz Codematic是Nutz框架开发者的得力助手,值得在实际项目中尝试和应用。

    nutz学习资料2

    标题“nutz学习资料2”表明这是一份关于Nutz框架的学习资源集合,Nutz是一个基于Java的轻量级框架,旨在提供全面的MVC支持和企业级开发工具。通过这个压缩包,我们可以期待深入理解Nutz框架的核心特性和使用方法。 ...

    nutz_redis集成依赖包

    为避免这些问题,建议使用最新稳定版的Nutz和Redis客户端,同时确保所有依赖都在同一项目管理工具中统一管理。如果遇到冲突,可以通过排除特定版本或使用`&lt;dependencyManagement&gt;`标签来控制全局依赖版本。 6. **...

    nutz应用示例

    在这个项目中,我们可以看到一个基本的Nutz应用是如何构建的,以及如何与MySQL数据库进行交互。 首先,Nutz框架的核心是其MVC(Model-View-Controller)模式,它简化了Web应用的结构,使得代码更易于维护和扩展。...

    nutz搭建的MVC框架

    Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...

    ztree与nutz简单使用

    zTree的核心功能是构建动态的树形结构,它支持多层节点、自定义图标、异步加载以及丰富的事件处理。在网页端,zTree可以用于文件管理、组织架构展示等多种场景。要使用zTree,首先需要在HTML文件中引入zTree的CSS和...

    nutz 缓存

    总结来说,Nutz框架的缓存机制提供了一套全面的解决方案,包括DAO层的自动缓存、多种缓存策略、自定义缓存实现以及丰富的缓存事件,帮助开发者优化系统性能,提升用户体验。通过学习和应用Nutz缓存,开发者可以更好...

    nutz-1.r.61-发布包

    这个文件提供了Nutz 1.r.61版本的源代码,对于开发者来说,这是一个宝贵的资源,可以深入理解Nutz框架的内部实现,方便进行问题排查或自定义扩展。 5. **Nutz-1.r.61-manual.pdf 和 Nutz-1.r.61-manual.rtf** 这...

    nutz 文件上传例子

    综上所述,"nutz 文件上传例子" 主要涵盖了使用 Nutz 框架进行文件上传的基本操作,包括配置、接收文件、处理文件以及利用 `nutz.plugin.multiupload` 插件进行更复杂的上传场景。在实际开发中,还需要关注文件安全...

    nutz迷你项目

    7. **异常处理**:Nutz提供了统一的异常处理机制,方便进行错误信息的收集和反馈。 通过学习和实践“Nutz迷你项目”,开发者不仅可以掌握Nutz的基本用法,还能了解到如何将这些组件整合进实际项目,提升开发效率。...

    nutz生成javabean工具.zip

    要掌握Nutz Codematic,你需要了解Nutz的基本概念,以及如何配置和调用代码生成工具。可以通过阅读Nutz Codematic的官方文档,参与社区讨论,或者查看示例项目来学习。 总的来说,"nutz生成javabean工具.zip"中的...

    nutz简单综合实例----通过html网页对数据库进行管理操作(MVC,Ioc,Dao)

    【标题】"nutz简单综合实例"涉及到的是一个使用Nutz框架进行Web开发的应用示例,这个示例展示了如何通过HTML网页对数据库进行管理操作,实现了Model-View-Controller(MVC)、Inversion of Control(IoC)以及Data ...

Global site tag (gtag.js) - Google Analytics