enjoy引擎怎么实现类似于Struts2的s:action标签的功能

enjoy引擎怎么实现类似于Struts2的s:action标签的功能,是在前段直接写#(function)吗,这样如果函数里面有rend(XXX.html)能直接嵌入到前段里面不?

评论区

JFinal

2019-05-10 16:54

功能是一定可以实现的,就是不知道 struts 的 s:action 的具体功能是什么

JFinal

2019-05-10 16:54

我猜你可以在模板中使用一下 #render(...) 以及 #include(...)

好好学习1111

2019-05-10 17:08

@JFinal s:action的作用就是在前端动态执行action,然后把执行生成的界面返回,又嵌入到前端。我举个例子 就是后台传递list参数,而一个hotel有多个图片(他们是两个表),这时后台想一次性把这些参数传到前端好像不怎么好实现。所以我就想前端进行hotel遍历的时候获得hotel的主键,然后直接在前端调用函数动态查询它所有的图片,查询之后把得到的结果嵌入进去。我之前用的freemaker模板引擎好像没有这个功能。困扰蛮久了

好好学习1111

2019-05-10 17:12

@JFinal render能直接调用后台的函数吗?我在文档里面好像没见到。

JFinal

2019-05-10 17:34

这个功能实现起来很容易,在 enjoy 之下扩做一个 #action 指令即可,然后这么来用:
#action("/blog/list")

具体实现有两种方式:
1:同步方案
让 #action 指令先得到目标 action 内容,再将内容直接输出,最简单粗暴的代码为:
public class ActionDriective extends Directive {
public void exec(Env env, Scope scope, Writer writer);
String action = exprList.eval(scope).toString();
String actionResult = HttpKit.get("localhost" + action);
write(writer, actionResult);
}
}

2:异步方案
让 #action 指令只生成一断 ajax 异步请求后端 action 的 js 代码,让其异步加载 html 片段,纯粹生成一段 js 代码而已,以下是一段示意性代码
$.ajax(action, {
type: "GET"
, cache: false
, dataType: "html"
, success: function(ret) {
// 得到当前位置的父标签,然后将 ajax 返回值插入进来
$(this).parent().append(ret);
}
});

在 action 指令内部生成以上 js 代码是极其容意的,js 代码的具体细节还需要你自行调整,以上仅为示意

最后配置一下:
engine.addDirective("action", ActionDirective.class);

从用户体验的角度来说,使用异步方案为好

好好学习1111

2019-05-10 18:12

@JFinal 感谢大佬,受教了!

JFinal

2019-05-10 19:36

@好好学习1111 记得搞定后回来分享一下,在分享频道:
jfinal.com/share

Dreamlu

2019-05-11 19:27

s:action 的源码里其实就是封装了一个Dwr 的 ajax。

好好学习1111

2019-05-12 13:47

@JFinal 好的,已反馈

好好学习1111

2019-05-12 13:47

@Dreamlu 感谢指点!