文档章节

jodd mvc框架 madvoc 教程(4):页面渲染(一)

理工男海哥
 理工男海哥
发布于 2013/12/27 11:01
字数 2076
阅读 454
收藏 1
点赞 0
评论 0

Action Result

Action Result 是action方法的一个返回值。返回的对象提供一个string结果,也就是这个对象的toString()的值。返回的String的格式如下:

result string = <result_type>:<result_value>

  • result_type - 返回的结果类型。
  • result_value - 返回值:使用来创建结果路径。

返回类型决定了madvoc选择哪个“结果处理器”来处理返回的结果。 返回值是用来创建相应路径。

返回值的类型又如下:

result path = <action_path_no_ext>.<result_value>

  • action_path_no_ext - action的路径,不包含扩展名;
  • result_value - 返回值的 toString() 的值.
结果类型处理器 使用一个或者这些值的组合来处理action的结果。结果的对象,结果的值,响应的路径。这让madvoc灵活的处理这些结果。

action也可以返回void,这会触发返回值类型处理器处理一个空的结果,返回null也是一样的效果。

完整的结果响应路径

当返回值以“/”符号开始的时候,madvoc会认为这是一个完整的响应路径,所以,返回的值也就是响应的路径。

使用dispatch分发结果

Servlet分发是默认的返回结果类型,这个结果处理器加上扩展名“jsp”来创建页面的名字和路径。如果这个页面没有找到,分发器(dispatcher)会从后边开始删除一个单纯,然后继续寻找,以此类推,知道找到页面。

以下是一个hello world的例子:

@MadvocAction
    public class HelloAction {

        @Action
        public String world() {
            return "ok";
        }
    }

这个action映射的路径是:/hello.world.html,现在这个结果,有一个明确的假定结果类型:dispatch。返回的结果是ok,madvoc会根据ok去寻找页面,寻找顺序如下:

  • /hello.world.ok.jsp
  • /hello.world.jsp
  • /hello.jsp

分发器(dispatcher)会依次去寻找以上的页面,如果都没有找到,则返回404错误。

使用redirect重定向响应页面

Servlet 重定向很简单:返回值 指定 重定向URL,一般情况下,返回值以全路径(“/”开头)重定向URL:

@MadvocAction
    public class HelloAction {

        @Action
        public String world() {
            return "redirect:/index.html";
        }
    }

URL重定向可以包含所有必需的参数在里面,说到这个,jodd提供了一个小巧的工具创建url和编码url参数。

此外,也可以注入action的属性到url的参数里面去:

@MadvocAction
    public class OneAction {

        String value;

        @Action
        public String execute() {
            value = "173";
            return "redirect:/index.html?value=${value}";
        }
    }

以上的代码,如果请求路径:/one.html 则会跳转到/index.html?value=173 去。

URL转发(结果链)

结果链(chain result)和转发类似,只不过结果链是在madvoc内部完成,二转发是在servlet容器里面完成。这里我们可以理解为结果链就是转发。结果链类型处理器会使用返回的结果当做下一个action的路径,约束下一个action执行在第一个action之后(包括所有的拦截器)。以下例子说明这个类型结果:

@MadvocAction
    public class HelloAction {

        @Action
        public String chain() {
            return "chain:/hello.link.html";
        }

        @Action
        public void link() {
        }
    }

第一个action会映射到;/hello.chain.html。当第一个action执行完毕之后,madvoc会继续执行第二个action,也就是: /hello.link.html。当发送的action被执行,它的执行和外面直接请求过来的结果是一样的,这两者没有什么不同。

第一个action可以使用request,session等各种不同的作用域来给第二个action发送自己的逻辑数据。

使用move移动结果

        URL重定向的主要问题是 如果传参的话必须通过url的get请求的方式传参,这就需要完全的,准确的把我们要传的参数拼接成url格式。虽然jodd有很多很好的工具来帮助我们打到这个需求,但是这并不是最好的,可维护性高的,可视化的,优雅的解决方案。

        移动结果类型处理器 除了它在重定向之前存储当前的action到session之外 和 重定向相似。重定向之后,madvoc发现被存储的action,然后把action数据注入到request属性中。因为这样,所有来之action的数据相对目标action来说都变成了可视化的数据。这样,我们就从硬编码到url参数中解放出来了。

        要理解“moving”移动action最好的方法是和上面的redirect分发做个比较。这个目标的action非常简单,而且有一个value输入(属性value注解上@In):

// Target action
    @MadvocAction
    public class TwoAction {

        @In
        String value;

        @Action(alias = "two")
        public void view() {
            System.out.println(value);
        }
    }

现在,请求这个action,这个例子会显示这个action的两个版本:一个是使用“redirect”的结果,另一个是使用“move”的结果:

// Version #1: action that uses redirection to target
    @MadvocAction
    public class OneAction {

        String value;

        @Action
        public String execute() {
            value = "173";
            return "redirect:/<two>?value=${value}";
        }
    }
// Version #2: action that uses moving to target
    @MadvocAction
    public class OneAction {

        @Out
        String value;

        @Action
        public String execute() {
            value = "173";
            return "move:/<two>";
        }
    }

这两个action作用完全一样,但不同的地方也非常明显:第二个action值为结果准备了数据而没有对url进行改变。

使用none:不响应结果

        有一些 当数据需要直接当做流的形式作为HTTP响应 情况,因为这样,action方法为负责发送完整的响应,action也可以返回“none:”,这个返回类型不会执行任何额外的结果处理代码。因此,action负责发送返回结果数据。这个结果类型处理器不会带走任何的结果数据,结果数据是被忽略的。

使用结果对象

action与直接响应一起工作的时候,action需要直接的请求到http的请求(request)和响应(response),虽然他们能简单的注入到action类实例对象中去,这样,类与servlet接口就变成了“硬链接”:它不能容易的在外边的容器被初始化。

这个结果处理器的目的是分开这个处理为两部分:准备数据和真实数据传递。这样达到离开HTTP servlet的“干净”的action类的目的。

发送一些二进制数据作为输出的例子是很常见的,比如显示图片和文件下载。虽然使用“none:”类型处理器可以直接的发送二进制内容,但是在实际中,这是没有进过慎重考虑的。

现在,madvoc提供了两个方法来打到我们的需求,第一个很明显,就是使用action方法来准备二进制数据,然后把这个数据保存起来,结果类型处理器把这些数据返回给客户端。以下是一个自定义类型和访问二进制的例子:

@MadvocAction
    public class RawAction {

        byte[] bytes;

        @Action
        public RawResultData view() {
            bytes = ...        // create byte array somehow
            return "foo:bytes";
        }
    }

这里,一些结果类型处理器(例子中是foo)使用反射和读取所有属性字段的方式来标示数据(例子中的是byte)和返回数据 的方式来处理action的对象。当然,这仅仅是一种方案。还有很多方法来处理这个情况,比如使用注解来代替返回值等。

        madvoc提供了另一个更方便的处理方式来代替这种返回一个字符串的方式。action可以返回任何类型对象,这个要看 结果类型处理器 如何来处理返回的结果值,结果路径 和结果对象。到目前为此,所有的结果类型处理器都只是用了结果值(object的toString())和结果路径。但是结果类型处理器可以进一步来返回整个object对象。去理解这个最好的办法是是用以下的方法来重构上面的例子。

@MadvocAction
    public class RawAction {

        @Action
        public RawResultData view() {
            byte[] bytes = ...     // create byte array somehow
            return new RawResultData(bytes);
        }
    }

RawResultData 

        RawResultData 只是一个对二进制数据的简单封装 来把 二进制数据返回给客户端。它是和二进制数据类型处理器一起工作的。RawResultData 已经重写了toString() 方法 返回 “raw:”,所有的action方法要做的就是准备byte数据,然后以RawResultData返回。

总结

以下的表格是对的ResultMapper 总结。



© 著作权归作者所有

共有 人打赏支持
理工男海哥

理工男海哥

粉丝 819
博文 36
码字总数 35675
作品 5
昌平
其他
jodd mvc框架 madvoc 教程(1):Actions 概述

jodd的madvoc是一个使用Coc和注解(annotations)的实用的mvc框架,主要用来简化web应用开发。它有着 使用简单,学习曲线小,容易扩展等特点,同时不用实用额外的xml配置,actions是一些简单...

michaely ⋅ 2013/12/25 ⋅ 1

Jodd 3.3.4 发布,常用 Java 工具包

Jodd 3.3.4 发布,这是一个维护版本,大部分是 bug 修复,也有稍许改动: RemoveSessionFromUrlFilter and JDateTime.isInDayLightTime() were added. HtmlStapler servlet now returns cont......

oschina ⋅ 2012/06/13 ⋅ 0

Jodd 3.6.7 发行说明,Java 常用工具包

Jodd 3.6.7 是个非常与众不同的版本,虽然主要是 bug 修复,但是 Java 升级到了 Java 7。 新特性: [vtor] Added message to validation annotation. [util] Added method to parse internet...

oschina ⋅ 2015/11/19 ⋅ 10

Jodd 3.6.5 发布,Java 常用工具包

Jodd 3.6.5 发布,更新内容如下: [http] now accepts local path on 30x. [http] Added default headers to . [madvoc] Fixed action string in case of proxified classes. [servlet] Res......

oschina ⋅ 2015/03/24 ⋅ 10

Jodd 3.6 发布,Java 常用工具包

Jodd = tools + ioc + mvc + db + aop + tx + html + json [2014-09-05] 更新日志 [新增] Json 序列化反序列化模块 [更改] Lagarto 依据规范解析 HTML. [更改] Props 每次取值时解析宏. [更改...

zqq90 ⋅ 2014/09/06 ⋅ 10

Jodd 3.6.4 发布,Java 常用工具包

Jodd 3.6.4 发布,此版本现已提供下载:src="http://jodd.org/download/jodd-3.6.4.zip" href="http://jodd.org/download/jodd-3.6.4.zip">http://jodd.org/download/jodd-3.6.4.zip。 主要更......

oschina ⋅ 2015/02/23 ⋅ 13

Jodd 3.6.7 发布下载,Java 常用工具包

Jodd 3.6.7 发布下载,已经在 GitHub tagged Jodd 3.6.7: src="https://github.com/oblac/jodd/archive/v3.6.7.zip" href="https://github.com/oblac/jodd/archive/v3.6.7.zip">https://git......

oschina ⋅ 2015/11/11 ⋅ 8

Java 常用工具包--Jodd

Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大! Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb Jodd 被分成众多模块,按需选择,其...

匿名 ⋅ 2009/06/25 ⋅ 20

Jodd 3.4.3 发布,常用 Java 工具包

Jodd 3.4.3 增加了 @PetiteProvier. Petite 人工注册更加顺畅,Petite 初始化方法可在三个生命周期点中调用;DbOom 支持缓存和一对多关系;改进 HTTP 对编码和字符集的支持;改进 Madvoc 动作...

oschina ⋅ 2013/04/19 ⋅ 3

Jodd 3.4.2 发布,常用 Java 工具包

Jodd 3.4.2 版本最大改动就是全新的 HTTP 客户端,另外该版本最终改用了 Gradle,包含了 ASM 4.1 源码,增加了 BeanCopy 工具,移除过时的编译器包,JDateTime 增加了 Period 类,Madvoc 提供...

oschina ⋅ 2013/02/25 ⋅ 12

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 39分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 58分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部