从JDiy-2.5版开始,我们提供了对freemarker的支持,用户可以很方便的使用freemarker来做展现层模板.大家来看下面几个例子.
在之前的旧版中,我们只能使用jsp来做展现层,使用JDiyAction编写一段代码,并转到jsp视图上,action方法看上去就像下面这样:
//...相关代码略 public void actionMethod(){ //您的action业务代码 forward("/WEB-INF/view/page1.jsp");//forward到展现层 } //...相关代码略
而如果您升级JDiy到2.5以上,您会发现JDiyAction的这个forward静态方法变成了@Deprecated(即这个方法被标注为“废弃”),所谓标记为废弃的方法(或者废弃类)的意思就是奉劝大家不要再继续使用它了。虽然在目前的情况下,您继续使用它没有任何问题,但是废弃的方法极有可能从以后的新版本中删除。为了避免以后升级出现兼容问题,您新开发程序的时候,要尽量避免使用这些废弃方法。那么既然是废弃方法,自然有更好的方法来代替它。
您可以在新版本中直接通过return String的形式来代替forward. 所以,您可以写成像下面这样:
//...相关代码略 public String actionMethod(){ //您的action业务代码 return "/WEB-INF/view/page1.jsp"; //forward到展现层 } //...相关代码略
和原来的写法比较一下,这样子是不是更加方便了呢?首先,我们把actionMethod前面的返回类型由void改成了String,让这个方法返回一个字符串,而字符串的内容就是要forward到展现层的jsp页面地址。
再来看一下,我们要实现页面重定向,您可以写成这样:
//...相关代码略 public String actionMethod(){ //您的action业务代码 return "redirect:/index.jd"; //redirect网页重定向 } //...相关代码略
只需要加上"redirect:"前缀,即可实现页面重定向.
使用Freemarker:
接着上面的例子,假如我们现在要改用freemarker来处理页面显示,我们将以上代码改成如下:
//...相关代码略 public String actionMethod(){ //您的action业务代码 return "/WEB-INF/view/page1.ftl"; //请求转至freemarker模板去处理显示 } //...相关代码略
JDiy会根据您返回的文件类型,自动匹配jsp页面或者freemarker模板(扩展名为*.ftl).
使用JsonObject:
好了,再进一步,假设这个方法是给客户端js程序ajax异步调用的,它只需要返回一个json数据就可以了(不需要页面),那再把代码改成像下面这样:
//...相关代码略 public JsonObject actionMethod(){ //您的action业务代码 return new JsonObject() .set("result","success") .set("msg", "操作成功!"); //直接返回JsonObject } //...相关代码略
注意actionMethod前面的返回类型由String变成了JsonObject,表明此方法仅返回JsonObject对象,再看里面的return 代码,我们通过new关键字构造了一个新的JsonObject(JsonObject类位于org.jdiy.json包中);并为这个JsonObject设置了两个属性result和msg,注意两处set的写法,大家熟悉吧?没错,就像JDiy框架的Rs对象一样的链式编程风格(连着写减少代码量)。这样就可以直接返回Json给客户端啦~~参考JDiy-API帮助文档得知,set方法的第二个参数是Object型的,也就是可以设置任何类型的对象(如int, boolean,Date, Map, JsonArray等等).
新的疑问:如果这个actionMethod方法内部会根据条件判断,既有可能返回到jsp(或ftl),又有可能直接返回JsonObject又怎么办呢?这个就更简单了,您只需要将actionMethod前面的返回类型改为Object即可,就像下面这样:
//...相关代码略 public Object actionMethod(){ //您的action业务代码 if(fail){ return new JsonObject() .set("result","fail") .set("msg", "操作失败!"); //直接返回JsonObject }else{ return "/WEB-INF/view/result.ftl";//转freemarker } } //...相关代码略
对于void无返回,或者返回值为null的action方法,JDiy将忽略对返回的后续处理,您仍旧可以通过app或取request, response等对象,进行其它操作.
更多有关于JDiyAction和JsonObject方面的知识,
请参见JDiy-API帮助文档: http://www.jdiy.net/jdiy-doc/