在基于请求转发型的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模板来输出结果
}
posted on 2007-08-22 09:46
简易java框架 阅读(770)
评论(1) 编辑 收藏