2018-03-03 10:50

没秒懂, #dictSelect 内部是什么结构? 一旦放到指令下模板输出就是空值了是什么意思?

2018-03-02 16:50

@zhongshg jfinal enjoy 引擎的表达式在与 java 打通的基础上,做了极少的有助于用户体验的增强,例如本贴中的功能不仅支持 {1:'自买', 2:'跟买'}.get(type), 还支持:
{1:'自买', 2:'跟买'}[type]

如果懒得学习这类增强的用法,当成 java 去用也很方便

针对某个语言去写模板引擎,必须要与其语言直接打通的设计理念,这个在 jfinal enjoy 看来是极为自然的事情,可惜 freemarker velocity 之类的并没有这么做

2018-03-02 16:41

补充一下,合理设置 timeToIdleSeconds 的值与 程序中的 MAX_VALUE 值,调整出你自己想要的策略

2018-03-02 16:17

刚看了一下,你的 getter 方法对不上,例如你的 x.pId 实际去调用的时候是:
getPId() 注意p 变成了大写,而你的 getter 方法是小写的 p : getpId()

解决办法极为简单,下面的办法二选一:
1:改正 getter 方法,使其符合 java 规范,也即 get 后面第一个字符变大写
2:改为直接调用方法 #(x.getpId())

2018-03-02 16:14

这个是一直在用的基本功能,注意大小写,注意其中一定要有值

实在拿不准的时候逐步推进输出,例如先如下这个:
#(x.cskus)

确保 x.cskus 确实有值并输出以后,再对其循环:
#for(y : x.cskus)

2018-03-02 11:43

@wumugulu UploadFile[] 数组貌似还不支持,建议用一下 getFiles() 来做,也挺方便的,此外呼出大神 @玛雅牛 看是否能在 jfinal 3.4 中添加这个功能,这个功能是 @玛雅牛 贡献的

2018-03-02 11:40

@rirai 要做这个功能就太耗费性能了,相当于是原来两倍的资源消耗,不建议做

2018-03-02 11:36

用一下 jfinal 中整合的 ehcache,关键配置是下面几个:
name="block"
timeToIdleSeconds="3000"
timeToLiveSeconds="0"

timeToIdleSeconds 为 3000 表示空闲时间达到 5 分钟即清除这个缓存,timeToLiveSeconds 为 0 表示缓存最大存活时间为永远,也就是说缓存清除交由第一个配置 timeToIdleSeconds 来控制

再做个拦截器,得到请求的 ip 地址为 key 值进行一些逻辑操作,大致如下:
String ip = IpUtils.getClientIp(inv.getController().getRequest());
Integer counter = CacheKit.get("block", ip);
if (counter == null) {
counter = 1;
CacheKit.put("block", ip, counter);
inv.invoke();
return ;
}

counter++;
CacheKit.put("block", ip, counter);
if (counter < MAX_VALUE) {
inv.invoke();
} else {
inv.getController().renderJson("msg", "访问太频繁");
}

2018-03-01 17:38

@wumugulu 试试 UploadFile files[] 改成 UploadFile files 看能不能支持

2018-03-01 16:42

先去掉 UploadFile files[] 参数,看看别的普通参数是不是正常工作,这个可以确保你的配置是对的

如果上面一步可以了,将 UploadFile files[] 加回去再试

2018-03-01 16:40

单步调试一下,肯定是某个地方 jfinal 的 request 值被替换掉了

2018-03-01 15:40

写点示例代码,希望怎么来使用

例如是不是希望这样用:
#if( exists( var ) )
...
#end

如果上希望上面的用法,目前可以通过自定义指令来扩展:
scope.exists(key);

2018-03-01 14:17

Long result = Db.queryLong(sql) 就不会报空指针,注意不要用 long 接收值,而要用 Long

2018-03-01 00:30

非常高水平的分享,有很多值得学习的亮点:
1:Service 层应用 cache 的逻辑推理十分合理
2:拦截器中灵活运用了inv.getArgs() 得到用于生成 cache key 的参数值
3:拦截器中灵活运用了 inv.setReturnValue(...) 为业务层设置返回值
4:拦截器中使用 getMethod().getAnnotation(...) 配合自定义注解实现缓存的配置
5:注解配置中使用 enjoy 引擎表达式动态生成结果
6:简洁、优雅、完整的使用 jfinal 各种功能在业务层实现了缓存

这个缓存实现方案非常具有参考价值,建议小伙伴们用在自己的项目中,感谢分享

2018-02-28 17:14

@twzz 那就完全按其它项目来创建,然后手动再创建 jfinal 所需的 Java 类,以及手动改一下 web.xml 中 jfinal 所需的配置,启动方式也按照你以前的经验来,例如用 tomcat 等等

注意看一下文档:
http://www.jfinal.com/doc/1-4