2019-05-10 15:34

js 处在前端,而模板引擎的动作全在后端,本质上来说 js 无法与后端模板引擎交互

js 只能是在等待后端模板引擎的数据吐出来以后,对吐出来的数据进行处理

一般有两种用法:
1:js 写在模板文件中,也就是 html 中,例如:
var value = #(value);
alert(value);

以上的 #(value) 在后端模板引擎渲染的时候会替换成一个具体值,例如 123,然后渲染完成的 html 到浏览器以后, js 可以通过 alert(value) 进行输出

2:js 发送 ajax 请求,后端 render 吐出来数据,然后 js 拿到数据后使用数据,例如:
下面的 js 代码是即将要上将的新版本 jfinal.com,ajax 动态获取 document 的 content
function clickDoc(event) {
// console.info(event);
event.preventDefault(); // 取代 return false 防止页面跳转

var menu = event.target.id;
var url = "/doc/ajaxContent/" + menu;
$.ajax(url, {
type: "GET"
, cache: false
, dataType: "html"
, success: function(ret) {
// 替换掉右侧文档内容
$("#ajaxContainer").replaceWith(ret);
}
});
}

下面的代码是后端模板引擎吐出 html 数据:
public void ajaxContent() {
Integer mainMenu = getInt(0);
Integer subMenu = getInt(1);
Document doc = srv.findById(mainMenu, subMenu);
if (doc != null) {
setAttr("doc", doc);
render("_content.html");
} else {
renderError(404);
}
}

而上面 ajaxContent() 中使用的 render("_content.html") 是文档页面除去左侧的 menu 后的所有 html 数据

新版本会在下周一或者周二发布,到时候可以参考一下

这里有必要强调一点,js 与模板引擎的运作有一个先后,模板引擎吐数据总是在前,js 使用数据总是在后,它们永远无法同时交互,只能一前一后

2019-05-09 19:51

@zz210891470 数据库字段名是什么,能否完全对得上,如果对不上的话,可以用 jfinal 生成器生成 setter 方法,并且使用 getBean 代替 getModel

2019-05-09 17:48

form 表单的 input 域的 name 没有给出来,没人猜到是什么

2019-05-09 17:46

如果一定要让 #date 指令很方便智能化处理 Date 与 String ,可以用一个 Shared method 扩展,大致如下:
public class MyDateSharedMethod {
public Date toDate(String dateStr) {
return 这里将 dateStr 自行转化成 Date;
}

public Date toDate(Date date) {
// 这里原值返回
return date
}
}

然后配置一下:
engine.addSharedMethod(MyDateSharedMethod.class);

用的时候这样:
#date(toDate(startDate));

这样用的时候,无论你的 starDate 是一个 Date 还是一个纯 String ,都会被正确处理

2019-05-09 17:44

是原样输出,右键点击浏览器,查看生成的 html ,可以看到是 2019-05-09

而不是 2015

输出指令会原样输出字符串 #(...)

注意,不要粗心搞错成 #date(...) 指令,这里专指 #(...)

#date 指令不支持输出 String,这样是错误的 :
#date("2019-5-1")

2019-05-08 19:38

First name: #escape(firstName)
Last name: #escape(lastName)
Maiden name: #escape(maidenName)

当然,你也可以通过扩展 OutputDirectiveFactory 改变输出指令的行为,让 #(...) 自动支持 escape

还可以通过配置别名指令减少代码输入量:
engine.addDirective("esc", EscapeDirective.class);

用的时候可以这样:
#esc(firstName)

2019-05-08 19:33

#escape(...) 即可

2019-05-08 19:25

升级到 3.5 或者更高的版本即可

如果不想升的话,按照这个来解决:
http://www.jfinal.com/share/979

强烈建议升级到 jfinal 最新版

2019-05-08 17:51

单步调试进入 Db.use 方法,看看里面的变量是如何变化的

2019-05-08 17:49

@杜福忠 空合并表达式应该也可以的,赞

2019-05-08 17:48

建议指令名称由 parad 改为 paradef,以免看错,这个分享挺有用

2019-05-08 17:46

@你妹啊 必然可以,直接访问 jsp 是直接走的 jetty、tomcat,与 jfinal 无关

2019-05-08 17:38

使用 jetty-server 或者 tomcat 开发支持 jsp:
https://www.jfinal.com/doc/1-6

《dependency》
《groupId》org.eclipse.jetty《/groupId》
《artifactId》jetty-jsp《/artifactId》
《version》9.2.26.v20180806《/version》
《scope》provided《/scope》
《/dependency》

在代码中使用 renderJsp("xxx.jsp") 即可支持 jsp

jfinal undertow 不支持 JSP

2019-05-08 15:57

在使用的时候是不是引入一个 BaseController extends Controller,在 BaseController 中覆盖掉 getBean 方法?