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¶m2=foo
.on(SUCCESS, redir("/congrats.jsp"));
// 重定向到 http://www.myapp.com/MYCONTEXT/Book.show.mtw?param1=blah¶m2=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")); //一个全局结果
}