2017-08-31 17:36

@ttjs2013 在 spring 中获取 request 这个早就忘了,spring 是一定有一种回调方式,让你自己的代码做初始化的,建议找找相关资料

此外,你可以通过 JFinalViewResolver.engine.addSharedObject(....) 等方法来配置在 spring 用到的这个 engine 对象,只要找个合适的初始化回调的地方就可以了

你是怎么解决的在模板中得到 request 数据的,如何配置的?

2017-08-31 17:33

第一个问题, getSession() 默认是调用转调了 HttpServletRequest 的 getSession(),而这个方法在 session 没有被创建时,会默认给你创建一个,所以永远不可能为 null 值,这个行为是 java web 规范,所以与 jfinal 毫无关系

你可以通过 getSession(false) 让 HttpServletRequest 在 session 不存在时不去创建 session,但是这也不太保险,因为你要确保所有地方是 getSession(false) ,否则不管登录没登录,只要 getSession() 都不可能是 null 值

第二个问题是个纯前端的事, jfinal 是后端框架,是没法干预到前端的事的,只要你将 html、js、css 处理好就可以了

2017-08-31 17:29

jspstudy 不了解,没法帮到你

始终记住一件事:jfinal 开发的项目是标准的 java web 项目或者普通的 java 项目,以前你的所有 java web 配置、部署、开发的相关积累直接用上就好,不要特殊看待 jfinal 开发出来的项目

因此,使用以前你已掌握的常规方法部署就好

2017-08-31 17:26

Controller 刚被 new 出来的时候 request 还没有被注入进去,自然就无法使用

不要在 controller 构造方法中使用 request 对象,用拦截器就好

2017-08-31 17:23

如果场景比较容易的话,还可以用下面的方式使用:
#for ( img : (post.images).split(",") )
#(img)
#end

因为 jfinal 模板引擎与 java 是直接打通的,你的 post.images 如果是一个 String 型的话,直调用它的 split 方法即可

2017-08-31 17:21

超级好使,感谢分享 ^_^

2017-08-31 17:08

spring 的 view 扩展应该是默认就可以读取 requset.setAttribute(...) 属性的,如果确实不可以读取,添加一下如下的配置:
exposeRequestAttributes = true

由于回复不支持 xml 标记,上面的配置改成 propertye name="setExposeRequestAttributes" value="true" 即可,记得搞定后回来再反馈一下

contextPath 可以设置为 sharedObject,这样就不会污染 request 中的 attribute 了,拿到 JFinalViewResolver 对象,然后调用一下 addSharedObject(...) 将 contexPath 添加进来就可以了

contextPath 对于一个启动后的项目来说一直是不变的一个常量,所以在 request 里面是线程安全的

2017-08-31 09:57

@2B的It青年 table name 还可以为 null 和 empty? 从来没碰到过这种 table

2017-08-30 18:36

@吃桃子的松鼠 就是说 queryInt、queryColumn、queryLong 这类返回 int 、long 返回值的 sql 中的 select 只能是一个字段例如:
Db.queryInt("select count(*) from xxx"),而不能是
Db.queryInt("select count(id), title from xxx")
这种返回多个字段的 sql 显然无法使用 int、long 去接收值

2017-08-30 17:50

@麻言 所以,有几乎超过 50% 的问题是与 jfinal 毫无关系的,尤其是前端的问题

2017-08-30 17:50

这个细心点,单步调试一下即可解决,现有信息量完全看不同有啥问题

2017-08-30 17:49

把这个拦截器搞成全局拦截器,然后里面添加这样一个逻辑:
if (isLogin()) {
inv.invoke(); // 放行
} else {
inv.getControler().redirect("/login"); 重定向到登录页面
}

最后,在跳去登录页面那个 action 的方法上清除一下这个拦截器:
@Clear(LoginInterceptor.class)
因为登录 action 不能被拦截器,否则连登录页面都进不去了

jfinal.com 全套代码在加入俱乐部以后可立即下载,节省很多时间: jfinal.com/club

2017-08-30 17:31

enjoy 渲染出来的值可以让 js 去用,反之则不行,例如:
alert('#(message('+v+'))');
上面代码中的 v, 仅仅会被 enjoy 看成是一个表达式的标识符而已,前方的 var v ="123" 是否存在完全感知不到,因为模板引擎的工作模式只能顾指令和表达式,此外的一切都只当成是纯文本

简单说,在模板引擎看来,一切 js 代码内容全是纯文本。 知道了上述原理,就知道了 js 中的所有东东是不可能让 enjoy 感知到的

2017-08-30 11:43

貌似只有 jetty 高版本才支持,所以建议升级一下高版本的,只需要模仿 jfinal 内置的 jetty 代码就可以了,具体办法有很好的参考示例:
https://my.oschina.net/myaniu/blog/470050

2017-08-30 11:41

如果你用的是 jfinal 的 model就好办了,用一下这两个便捷方法:
1:model.keep(x, y, ...) 只保留指定的属性
2:model.remove(x, y, ...) 只去除指定的属性