2018-05-23 11:31
传播行为无非是 “当前有没有事务” 这个状态时下一步的动作,可以是加入现有事务,可以是创建新事务
但 spring 的设计太繁琐了,jfinal 的事务设计基本消除了事务传播功能的必要性
注意,在 spring 中使用事务传播是要通过注解或者配置来实现的。那么在 jfinal 中使用 @Before(Tx.class) 或者 Db.tx(...) 顺便就实现了事务传播功能
jfinal 事务设计,当前没有事务,那么 @Before(Tx.class)、Db.tx(...) 就会创建新事务,当前如果有事务,那么就融入已有事务,并且融入后的事务隔离级别自动使用两者的最高值
这个设计已经消解掉了事务传播这个问题,消灭问题比解决问题要高明得多
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-22 22:46
@libofei 只覆盖 Base model , MappingKit , 绝对不会覆盖你的 Model ,因为 jfinal 默认认为你会在 model 中添加自己额外的代码例如 jfinal club 中的 Account Session 类
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 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 极其有用