jodd mvc框架 madvoc 教程(3):Actions 其他特点

    在这篇文章中,我们会介绍更多的关于madvoc的action的其他一些特征。

自定义方法注解

        你的许多action方法会被注解上两到三个的@Action注解的值是非常常见的,比如,许多action路径会被映射到GET请求,又有许多映射为 *.do 和POST方法。许多json请求的action会被映射为*.json。所以,当你需要注解一个方法的时候,你必须一次一次的重复着一样的注解。

        幸运的是,madvoc非常聪明。它允许你在不同的默认值上自定义自己的注解。因此,我们不用继承注解,自定义action注解必须包含有相同的默认(@action)节点---即使不是全部。

让我们来为所以的表单创建一个制定一个的注解,这样我就有了扩展名为“.do”同时映射为POST方法:

@Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    public @interface PostAction {

        String value() default "";

        String extension() default "do";

        String alias() default "";

        String method() default "POST";

    }

正如上面所说,没有必要重复定义alias节点,现在,让我们来为一个action方法注解上我们自定义的注解:

@PostAction
    public void someAction() {}

这样等同于以下的代码:

@Action(extension = "do", method = "POST")
    public void someAction() {}

很明显的,自顶一个一个注解可以减少许多重复的代码。

最后,我们MadvocConfig在注册上我们自定义的注解,可以是纯java,也可以是配置文件。

名字替换

        在madvoc的注解中引用一个类的名字或方法的名字是可以的。比如说,当指定一个全路径在一个action方法上面,可以引用默认的扩展,不用再在字符串上给这个方法硬编码。

@MadvocAction
    public class HelloAction {

        @Action("/bonjour-monde.[ext]")
        public void world() {
        }
    }

在这个action路径中,扩展“[ext]”讲会替换madvoc默认的扩展,默认的替换方法如下:

  • [package] - 在包注解(package-level)上替换默认的包;
  • [class] - 在类注解(class-level)上替换默认的类;
  • [method] - 在方法注解(method-level )上替换默认的方法;
  • [ext] - 在方法注解( method-level )上替换默认的扩展名;

action的补充

在默认情况下,如果有一些没有被注册的action路径被请求,madvoc则返回404错误。所有的页面,包括静态的页面,都必须注册它自己的action方法。尤其是一些静态页面,比如说文档等,每个页面都需要一个类和一个返回void的方法。

madvoc提供了一个叫做“supplement actions”的东西来解决了这样的问题,supplement actions是一个action类,它里面有默认的方法,为那些没有注册的,默认后缀的action路径注册了一个action处理器。当没有被注册的路径第一次请求的时候,madvoc会为这个路径注册一个action。但是这个特点必须在madvoc的配置里面打开。

public class MyMadvocConfig extends MadvocConfig {

        public MyMadvocConfig() {
            supplementAction = DefaultActionSupplement.class;
        }
    }

madvoc会为每一个没有被注册的路径(比如:/foo.html)注册上一个增补的action来当做处理器。默认的增补的action都返回void,所以,如果用户访问了/foo.html 则自动直接访问了/foo.jsp。

    注意:使用 supplement actions会有潜在的memory-leak问题。madvoc会默认注册之前所注册过的所有没有被我们注册的路径。一些恶意的用户无限制的请求不存在的不同路径。madvoc则会创建不同的方法来为出来这些路径,虽然每个方法都会在非常小的内存,但是无限制的请求就会导致系统内存消耗完毕。

因为以上的问题,所以在使用supplement actions的时候要非常小心,如果要解决类似的问题,我们可以使用madvoc为我们提供的其他方法 或者 url重写 等技术。

反转action路径映射

默认情况下,madvoc会在action注册的时候解析action的包,类和方法来映射action路径,那是因为在madvoc没有必要在它工作之前就注册所有的action。

madvoc提供反转action映射路径:映射action的路径到action方法。madvoc为每个请求的action路径 尝试着去寻找是否有与之匹配的类和方法。使用这个简单的预定规则,如果有这样的一个类和方法被找到,他们会注册一个方法处理器。

要开启这个功能,必须要设置一下两个地方:

public class MyMadvocConfig extends MadvocConfig {

        public MyMadvocConfig() {
            actionPathMappingEnabled = true;
            setRootPackageOf(IndexAction.class);
        }
    }

一下是ActionPathMapper的action路径映射约定:

这里,html是默认的扩展后缀,‘ext’表示任何非默认的扩展后缀。方法名字“view”和“execute”实际上是在madvoc全局配置里面定义的第一个和第二个默认的action名字。

转载于:https://my.oschina.net/yangfuhai/blog/188195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值