2020-03-25 16:41

@jiahaokkk jfinal 开源 8 年多,迭代 9 年多, 大量开发者天天在用, 社区需要对用户负责

2020-03-25 15:00

建议使用 jfinal undertow,比你现在用的 jetty-server 要方便太多了:
https://jfinal.com/doc/1-2

web.xml 都不需要了,不存在配置错误的问题

2020-03-25 12:56

@绿色的小苹果 只要你的项目部署在外网,有外网 ip 地址或者域名, 任何爬虫、黑客都可以这样来访问

2020-03-25 12:44

代码没贴全,修改本贴进行修改

2020-03-25 12:43

@Code_Cat hash 出来的东西,如果还能再解密,那就没有什么意义了

hash 与加密完全是两回事, hash 的目的就是为了不能还原,也就是不能被解密

只有这样,你在腾迅、百度、jfinal.com 上注册时经过 hash 后的密码,才无法被反向解密,只能正向碰撞式破解。如果你的密码足够复杂则可以认为是无法破解

想知道 hash 的具体用法,加入 jfinal 俱乐部,获取本网站的源码,里头的注册、登录就是 HashKit 的完美实践:
http://jfinal.com/club

2020-03-25 12:24

configEngine(Engine me) 中不建议配置:
me.setBaseTemplatePath(...);

因为这个配置是留给非 web 环境以及 me.setToClassPathSourceFactory() 两种情况下使用的:
https://jfinal.com/doc/6-11

你希望配置的这个 "_view" 值,完全可以在 configRoute(Routes routes) 中通过下面的方法配置:
routes.setBaseViewPath("/_view");

注意,如果 Routes 被拆分过,要在各自的 routes 中都配置一次:
setBaseViewPath("/_view");

2020-03-25 12:19

@himans 我估计你用的是 oracle,所以从数据库查出来直接就是 BigDecimal 类型

当前的 enjoy 不支持定制 Arith.java 的行为,当前可能最好的办法是你在后台通过 java 代码先计算出这个值,然后 html 中输出一下:
BigDecimal budget = sum.getBigDecimal("budget");
BigDecimal expense = sum.getBigDecimal("expense");
BigDecimal percent = budget.divide(expense, 这里用上自己实际需要的参数);

// 这里将 percent 再放回 record 对象中,便于在 html 中输出
sum.set("percent", percent);

html 中的输出方式:
#number(sum.percent, "#.##%")

注意上面第三行代码中的 divide 方法,可以指定 scale 与舍入方式,例如:
budget.divide(expense, 4, RoundingMode.HALF_UP);

以上 divide 中的 4 可以保留四位小数, RoundingMode.HALF_UP 即为四舍五入

2020-03-25 10:52

me.setToClassPathSourceFactory() 是去jar 包和 Class Path 下读文件,而你的 html 仍然放在了 webwebapp 下

2020-03-24 21:22

@小风yy 抛异常的原因是:
1:Db.find(Db.getSql("demo.customer")); 查出来的字段是实时的,也就是说你添加了字段 remark1 以后,上面的代码再执行时,会获取到 remark1 这个字段的值

2:ActiveRecordPlugin 在启动时,会对所有映射的 Model 进行初始化,这个过程会从数据库获取字段名

3:出于安全性考虑,Model._setAttrs(...) 这个方法会检测放入的字段是否存在,而这时使用的字段是前面第二步在启动时初始化决定的

4:由于添加了 remark1 这个字段, Model._setAttrs 检测时发现这个字段在内存中不存在,抛出异常

知道了原理,根据情况解决一下。

其实我在前面的回复中已经给出了几种解决办法,就看你用不用

2020-03-24 20:30

@小风yy 添加字段就是动态改变数据表结构

你的项目正在运行中,但你为表添加了字段,不抛异常才是错的

2020-03-24 20:19

为什么要查询出来用 Record, 然后 update 的时候再用回 Model ?

这种用法太奇怪了

要么全用 Record , 要么全用 Model

Record 也可以保存:
Db.save("customer", records.get(0));


当前你这种用法之下,如果仅仅是希望不出现异常的话,将
new Customer()._setAttrs(...)
改成
new Customer().put(...) 即可

put 方法不检查你的字段是否存在,就不会报异常。但这种用法你自己要注意是否有安全隐患,为什么要动态动改数据表的结构?

2020-03-24 19:01

这里有几点说明:
1:#(sum.expense / sum.budget) 这种用法,sum.expense 与 sum.budget 变量的值取决于其本身的类型,这个一定要通过调试搞清楚,到底是 float 还是 double 类型

2:#(10396.08 / 954095.26) 这种用法,其中的 10396.08 与 954095.26 常量会被 enjoy 转换成 Double 类型

所以,确定 sum.expense 与 sum.budget 变量的类型是关键,如果这两个变量的类型都是 Double 的话,那输出结果应该是完全一样的

通过上面的推断, sum.expense 与 sum.budget 变量的类型应该不是 Double

2020-03-24 18:45

@himans 我发现你的 #number 指令传递的 format 表达式不对,改成下面用法试一下:
#number(sum.expense / sum.budget, "#.##%")

不是 "0.00%", 而是 "#.##%"

注意要用 #number 指令来测试

2020-03-24 18:40

具体的类在 com.jfinal.template.expr.ast.Arith.java

2020-03-24 18:39

@himans
需要调试 enjoy Arith.java 的计算细节,你那正好有这个测试用例

希望你能就你当前碰到的这些数值在 Arith.java 内调试,看每一步计算的结果,到底哪一步与预期不符

希望你继续反馈这个问题