MVC框架-mentawai(5)

Action 结果

每个Mentawai action都会返回一个字符串结果,用于应用管理器(application manager)建立一个对应的结果。例如,你可能允许一个action产生两种结果:一种是通过jsp模板产生的HTML,另一种是通过Ajax渲染的json形式的Ajax请求。action并不关心它的输出(output)是如何展示到显示层,它只是检查客户端的HTTP请求头并返回响应的结果。

如果不想每个action都做检查,不如添加一个全局的过滤器

转发结果

@Override
public void loadAction() {  

    action("/Hello", HelloAction.class, "hi")  
        .on(SUCCESS, fwd("/jsp/hello.jsp"));  
}

重定向结果

// 重定向到 http://www.myapp.com/MYCONTEXT/congrats.jsp?param1=blah&param2=foo
.on(SUCCESS, redir("/congrats.jsp"));  

// 重定向到 http://www.myapp.com/MYCONTEXT/Book.show.mtw?param1=blah&param2=foo
.on(SUCCESS, redir("/Book.show.mtw")); //会带有上下文和任意的action输出值 

// 重定向到来自action的动态URL,也可以追加任意输出参数
.on(SUCCESS, redir()); // url由action动态产生
// action必须:
output.setValue(Redirect.REDIRURL_PARAM, theUrlToRedir);
// 或简写为:
redir(theUrlToRedir);

// 如果输出带有参数
// 如果没有添加就不会带有参数
output.setValue("param1", "blah");
output.setValue("param2", "foo");

// 重定向到 http://www.myapp.com/congrats.jsp
.on(SUCCESS, redir("//congrats.jsp")); // 不带上下文(很少使用)

你也可以重定向到一个action配置,Mentawai将会从ActionConfig对象中获取URL

ActionConfig helloAction = action("/Hello", HelloAction.class, "hi")
    .on(SUCESS, redir("/jsp.hello.jsp"));

action(UserAction.class, "add") // 与此行代码相同 action("/User", UserAction.class, "add")
    .on(SUCCESS, redir(helloAction)); // <=== 将会产生重定向 http://www.mysite.com/MYCONTEXT/User.add.mtw 

流 结果
你可以返回一个图片或一个二进制文件

// in the action:

public class ImageAction extends BaseAction {  

    public String send() {  

        byte[] image = getImageBytesSomehow();  

        output.setValue(StreamConsequence.STREAM, image);  
        output.setValue(StreamConsequence.CONTENT_LENGTH_KEY, image.length);  

        // 或简写为
        stream(image, image.length);           

        return SUCCESS;  
    }  
}

// 应用管理器写法:

.on(SUCCESS, stream("image/jpg"));

从输入流中获取文件,你可以如下操作:

// 在action中:

public class PDFAction extends BaseAction {  

    public String execute() {  

        FileInputStream fis = new FileInputStream("review.pdf");  

        // FileInputStream在响应中不设置大小

        output.setValue(StreamConsequence.STREAM, fis);
        output.setValue(StreamConsequence.FILENAME, "review.pdf");  

        // 或者简写为:
        stream(fis, "review.pdf");     

        return SUCCESS;  
    }  
}  

// 在应用管理器中:

.on(SUCCESS, stream("application/pdf"));

Ajax结果
Ajax非常重要,会在单独的章节中进行讲解,下面是基本用法:

// 在action中:

public class TestAction extends BaseAction {  

    public String autoCompleter() {  

        String sourceInput = input.getStringValue("sourceInput");  

        Map<Integer, String> map = new LinkedHashMap<Integer, String>();  

        if(sourceInput.startsWith("a")) {  

            map.put(1, "a. Somebody with id 1");  
            map.put(2, "a. Somebody with id 2");  
            map.put(3, "a. Somebody with id 3");  

        } else if(sourceInput.startsWith("b")) {  

            map.put(4, "b. Somebody with id 4");  
            map.put(5, "b. Somebody with id 5");  
            map.put(6, "b. Somebody with id 6");  

        } else {  

            map.put(7, "*. Somebody with id 7");  
            map.put(8, "*. Somebody with id 8");  
            map.put(9, "*. Somebody with id 9");  
        }  

        ajax(map);  

        return SUCCESS;  
    }     
}  

// 在应用管理器中:

.on(SUCCESS, ajax()); // 默认的Ajax结果将会将map渲染为JSON

设置全局结果
你也可以设置一个检查所有action的结果,这对于一个全局过滤器产生一个应用在全局水平的结果很有帮助。

@Override
public void loadFilters() {      
    filter(new AuthenticationFilter()); // 一个全局授权过滤器
    on(LOGIN, redir("/jsp/login.jsp"));  //一个全局结果
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值