灵活的视图切换及导向

系统 1762 0

  在基于请求转发型的MVC框架中,给用户提供一个简单、灵活的视图切换及页面导向功能是非常关键的。作为EasyJWeb特性介绍系统的一篇文章,本篇主要介绍EasyJWeb中的页面切换及导向机制。EasyJWeb引入了纯模板的机制,通过其提供结构清晰的Module、Command、Page等结构,从而能实现非常简单灵活的视图切换及导向。
1、快捷方法,使用最简单的方式满足你80%的视图切换及页面导向需求
  在AbstractCmdAction中,提供了forward及go方法来满足不同的页面导向需求。下面给出具有代表性的视图切换及页面导向示例:
forward(“list”)-转到本模块中的list命令处执行;
forward(“person.new”)-转到person模块中的new命令执行;
forward(“new”,”person”)-与forward(“person.new”)相同;
page(“list”)-直接使用逻辑名称为list模板来作当前命令的输出;
go(“list”)-开启一个全新的request请求,执行当前模块的list命令;
go(“person.list”)-开启一个全新的request请求,执行person模块的list命令;
go(“list”,”person”)-与go(“person.list”)相同;
go(“list?parentId=5”)-开启一个全新的request请求,执行list命令,并往action中传递parentId参数。

2、视图切换及对象
  EasyJWeb中的页面结果是由Page来代表的,当前只提供了三种类型的Page,即template、html及null。其中template代表模板页面,html代表导向页面,null表示不返回信息。可以通过每一个Action中的execute方法中的Module参数,来读取配置

public   void  doEdit()
{
}

在当前模块的Page。
如return module.finadPage(“list”);
也可以在Action中直接构造一个Page对象来进行视图的切换及导向。
如 return new Page(“index”,”/news/index.html”);

3、聪明的AbstractPageCmdAction
  在AbstractCmdAction的基础上,EasyJWeb提供了另外一个对视图具有自动识别能力的AbstractPageCmdAction。该类能通过应用“惯例代替配置”来智能判断程序中要使用的视图模板,甚至不需要书写方法签名也可以调用视图模板。
如一个空签名的command方法:

  该方法中虽然没有一句代码,也没有明确的视图切换或转向。但AbstractPageCmdAction会根据惯例原则,自动选择edit.html文件作为视图模板。
  另外针对下面的 url:person.ejf?cmd=new 或/ejf/person/new
假如PersonAction中没有doNew方法,则AbstractPageCmdAction会根据惯例原则,优先考虑/views/person/目录中是存存在new.html文件,若存在,则将直接返回该模板,即不用写java方法,也能产生动态页面。

  作为一个应用实践之一,在我们开发一般的WEB应用中,我们习惯于把前台及后台分开,比如所有前台展示的放在一个模块Module(即Action)中。网站前台经常会有非常多的页面,而这些页面或多或少都会包含相同或相似逻辑的动态内容,此时若针对每一个页面都写一个Command来处理,显得很麻烦。可以借助Velocity的标签,以及AbstractPageCmdAction中的视图界面智能选择功能,不用写java方法,即加载各种动态页面。
  下面是EasyJF官方网站NewsAction中的代码,类似这样的代码同也用于很多EasyJF开源团队所开发的开源及商业项目中:

public   class  NewsAction  extends  AbstractPageCmdAction  {
 
private  NewsUtil newsUtil;
 @InjectDisable
 
private  Map utils  =   new  HashMap();
 
public   void  setNewsUtil(NewsUtil newsUtil)  {
  
this .newsUtil  =  newsUtil;
 }

 
public   void  setUtils(java.util.Map utils)  {
  
this .utils  =  utils;
 }


 
public  Object doAfter(WebForm form, Module module)  {
  form.addResult(
" nu " , newsUtil);
  form.addResult(
" NU " , newsUtil);
  java.util.Iterator it 
=  utils.entrySet().iterator();
  
if  (it  !=   null {
   
while  (it.hasNext())  {
    Map.Entry en 
=  (Map.Entry) it.next();
    form.addResult((String) en.getKey(), en.getValue());
   }

  }

  
return   super .doAfter(form, module);
 }

}


 

/news.ejf?cmd=index
/news.ejf?cmd=technic
/news.ejf?cmd=download
  可以这么说,前台诸多的动态页面,都不需要书写Java代码,就能实现动态内容生成。如果你借助一些基础引擎,比如EasyJF开发的CMS引擎来或者是自己构造一些引擎,完全可以实现不用写Java代码,就能开发出功能比较强的Java Web应用。比如建一个站点、建论坛、百科、Blog、全文检索等。
4、重定向输出流
假如你希望你Action的执行结果不要直接输出的浏览器上,而是直接输出到服务器上的一个文件中保存起来(生成静态html是我们在建大型网站中所必须的),或者是输出到互联网上的某一个终端或结点。EasyJWeb给你提供了最简单解决方案,你随时可以根据需要对Action执行结果进行重定向,比如下面的Action中,我们可以把输出结果指定到服务器上d:\myapp\news.html文件中。

public   void  doNews() {
java.io.Writer writer
=   new  OutputStreamWriter( new  FileOutputStream( new  File( " d:\myapp\news.html " )), " UTF-8 " );
ActionContext.getContext().setCustomWriter(writer);
// 执行news命令的一系列逻辑
page(“news”); // 使用news模板来输出结果
}

 

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1752356


灵活的视图切换及导向


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论