MVC框架-mentawai(5)

来源:互联网 发布:ant编译java 编辑:程序博客网 时间:2024/05/24 01:26

Action 结果

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

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

转发结果

@Overridepublic 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的结果,这对于一个全局过滤器产生一个应用在全局水平的结果很有帮助。

@Overridepublic void loadFilters() {          filter(new AuthenticationFilter()); // 一个全局授权过滤器    on(LOGIN, redir("/jsp/login.jsp"));  //一个全局结果}
原创粉丝点击