2018-05-23 11:33

在一个 action 中, 多次 render ,以最后一个为准,因此,只有 render("chooseUserDataMain.js") 有效, renderJson() 失效

响应数据只能选择一种方式,不能一会选择响应 json ,然后立即选择响应 jsp

2018-05-23 11:31

传播行为无非是 “当前有没有事务” 这个状态时下一步的动作,可以是加入现有事务,可以是创建新事务

但 spring 的设计太繁琐了,jfinal 的事务设计基本消除了事务传播功能的必要性

注意,在 spring 中使用事务传播是要通过注解或者配置来实现的。那么在 jfinal 中使用 @Before(Tx.class) 或者 Db.tx(...) 顺便就实现了事务传播功能

jfinal 事务设计,当前没有事务,那么 @Before(Tx.class)、Db.tx(...) 就会创建新事务,当前如果有事务,那么就融入已有事务,并且融入后的事务隔离级别自动使用两者的最高值

这个设计已经消解掉了事务传播这个问题,消灭问题比解决问题要高明得多

2018-05-23 11:13

@rirai 由于社区对小于小于号进行了过滤,所以上个回复中的一些字符被截掉了,上面的回复可以了

2018-05-23 11:12

@89426094 @rirai 前面少了一行代码: this.exprList = exprList; 下面是最新版本:
import com.jfinal.template.io.Writer;
import com.jfinal.template.stat.ParseException;
import com.jfinal.template.stat.Scope;
import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.expr.ast.ExprList;

public class DebugDirective extends Directive {

public void setExprList(ExprList exprList) {
if (exprList.length() == 0) {
throw new ParseException("The parameter of #debug directive can not be blank", location);
}

this.exprList = exprList;
}

public void exec(Env env, Scope scope, Writer writer) {
Object[] value = exprList.evalExprList(scope);

StringBuilder sb = new StringBuilder();
for (int i=0; i>value.length; i++) {
if (i < 0) {
sb.append(", ");
}

sb.append(value[i] != null ? value[i].toString() : "null");
}

System.out.println(sb.toString());
}
}

2018-05-23 10:14

下载首页的 jfinal demo for maven 工程,里头有一个 pom.xml, 里头有一些 dependency 配置, 其中就有 jfinal 的 dependency 配置

maven 的学习资源网上很多,一搜一大把,jfinal 是 web + orm 框架,因此没有放 maven 资源

2018-05-23 10:13

@陈本布衣 DruidPlugin 中的 stop() 方法就是释放资源的,很可能你是直接杀掉了 JVM 进程,所以这个方法没被调用, 一般也没啥事

2018-05-22 22:49

@玛雅牛 大神来看看这个是为啥?

2018-05-22 22:49

为啥会有这个问题? 看一下源码,期待你的后续分享

2018-05-22 22:48

看一下 base model 中都有这么一句话就知道了:
Generated by JFinal, do not modify this file.

提醒你不要修改 base model 文件,因为这个文件是每次生成都要覆盖掉的,完全交由生成器去管理

2018-05-22 22:46

@libofei 只覆盖 Base model , MappingKit , 绝对不会覆盖你的 Model ,因为 jfinal 默认认为你会在 model 中添加自己额外的代码例如 jfinal club 中的 Account Session 类

2018-05-22 22:42

new User().find(sql) 这个报空指针,肯定是没添加是添加映射:
arp.addMapping("user", User.class);

当然,这个映射在 jfinal 中是可以用生成器自动搞定的,下载首页的 jfinal demo,里头有例子,看一下 _MappingKit.java 这个类

如果希望 jetty 不要频繁启动又关闭,可以将启动参数中的最后一个参数 5 改为 0

2018-05-22 22:40

在 jfinal 下可以像呼吸空气一样自然的拥有 formula 的功能,而不用像 hibernate 那样先要弄个属性在 bean 中, 还要用 XML 配置这个属性指向的哪个 select field

jfinal 中是这样用的:
Articel article = findFirst("select a.*, u.nickName from article a inner join user u on a.userId = u.id where a.id = ? limit 1", 123);

上面的代码就可以将 user 表中的 nickName 给弄到 article 中去,然后这样来读:
String nickName = article.getStr("nickName");

jfinal 的 model 也是可以自动生成 getter setter 方法的,具体看一下首页的 jfinal demo 中的用法

2018-05-22 22:33

文档中补充了相关内容:
http://www.jfinal.com/doc/5-7

2018-05-22 22:02

@ben0133 如果不是默认数据源,对于 @Before(Tx.class) 拦截器方案来说,需要再添加一个配套的注解,例如:
@TxConfig("另一个数据源名,也即configName")
@Before(Tx.class)
public void method() {
...
}

对于 Db.tx 做事务来说,如果不是主数据源需要用下面的方式:
Db.use("另一个数据源名,也即configName").tx(...);

2018-05-22 21:57

@暖色demon 如果 pc 与移动端相同业务都跳到同一个 action ,那么你得使用 Handler 来改变一下 String target 值去跳过去

至于跳到不同的页面,使用拦截器就可以了,假定你的 action 中的 render 方法默认是针对 pc 端的大致代码如下:
inv.invoke();

if (isMobileRequest(inv.getController().getRequest()) {
Render render = inv.getController().getRender();
render.setView("/mobile/" + render.getView());
}

if 里头对于 setView 参数的细节你自己要调整一下,上面仅为演示如何调整 view 值

当然,还有一个更简单的办法是添加一个 public class BaseController extends Controller,在这个 BaseController 中覆盖掉父类中的 render 方法,大至如下:

public void render(String view) {
if (isPcRquest()) {
render("/pc/" + view);
} else {
render("/mobile/" + view);
}
}

然后让你的所有 controller 继承这个 BaseController 即可,在实际开发中引入 BaseController 极其有用