2016-10-18 17:29

简单地说,restufl 是一种软件架构的风格,而此风格之中有很多的概念,设计思想,核心思想在于对资源的抽象,也就是以数据为中心去做设计,数据之上的复杂多变的业务,仅仅是对数据的不同操作、组合、展现方式而已,抓住了数据为核心这个根本,就抓住了 restful 的关键

而 url 风格并不是 restful 的重点,数据结构才是关键

2016-10-18 17:25

这个问题比较大,我只能说核心的:
1:restful 的核心是资源的抽象,首先将各种概念抽象成资源
2:在抽象资源的基础之上,一切事务都看成是对资源的操作,例如,你有一个 account 账号资源,注册操作就是添加一条 account 数据,激活就是将 accout.isReged字段从 0 变成 1等等
3:有很多文章误导,以为 url 的风格是 restful 论文推荐的风格,项目就是 restful 的了,这是错误理解了 restful 本质的结果
4:restful 是一种架构风格,与 url 的风格在本质上是无关的,很多框架,以为将对资源的操作放在 http 请求头中就是 restful,例如使用这种风格 GET /account 、POST /account
5:jfinal 提倡 restful 的关键思想,提倡对资源的抽象,但唯独 url 风格与建议的风格有稍许不同,例如 jfinal 是将对资源的操作放在 url之中的,例如: /account/add、/account/save、/account/delete/id 等等
很多框架就被这个 url 套死了,以为 url 不是论文建议的风格就不是 restful,错误地认为 url 风格是 restful 的关键

2016-10-18 17:08

url 中传递中文字符,需要转码,这个与 jfinal 完全无关,是 http 规范,去 google 一下相关的资料即可

2016-10-18 16:58

@Noobs jfinal 的做法考虑了更多的应用场景,尤其是为了让开发者在写代码的时候体验更好

2016-10-18 16:53

@Noobs 用如下几行代码做个测试,可以验证我前面贴出的 jfinal 源码:
String timeStampPattern = "yyyy-MM-dd HH:mm:ss";
String s = "2011-11-22 9:8:7";
Date d = new SimpleDateFormat(timeStampPattern).parse(s);
System.out.println(d);
会看到输出结果中有 09:08:07 数据,证明时分秒是在的

2016-10-18 16:48

如果表单域中不方便让格式满足 "yyyy-MM-dd HH:mm:ss" 这个格式,可以在提交时用 js 先干预并转换一下,然后才是真正的提交

2016-10-18 16:47

建议你在 TypeConverter.java 中设置一个断点,调试一下,看是哪步转换没走 timestamp 这个分支,极有可能是格式不对

2016-10-18 16:46

失去时分秒并不是这个原因引起的,因为 getModel 方法最底层利的 TypeConverter.java 这个类进行的转换,注意看一下里面有关对 Date 的转换源代码,会先判断你字段的长度,然后优先会转成 Timestamp

所以解决方案极其简单,让表单中提供的 time 满足这个格式:"yyyy-MM-dd HH:mm:ss"

以外我再将 jfinal 这部分源码copy来此,你一看便知,与类型无关:
if (type == java.util.Date.class) {
if (s.length() >= timeStampLen) {
return new SimpleDateFormat(timeStampPattern).parse(s);
}
else {
return new SimpleDateFormat(datePattern).parse(s);
}
}
注意看这个 if 语句,先是优先转换为 timestamp

2016-10-18 16:38

最后还忘了说了有一点,该处理方式,你仍然可以 setXxx(new Timestamp(new Date().getTime()); 因为 Date 是 Timestamp 的父类,所以完全没有阻止你使用 Timestamp,所以叫有百利无一害

2016-10-18 16:36

timestamp 的处理方式,简单来说是 java.sql.Timestamp 创建方式并不支持 new Timestamp(),你必须写很多代码来创建它,同时 new Date() 可以代替这些代码

2016-10-18 16:35

因为 java.util.Date 是 java.sql.Timestamp 父类,你可以对这类字段直接 setXxx(new Date()),而不用去苦哈哈去创建一个 Timestamp 对象,得这样写:
timestamp = new Timestamp(new Date().getTime()); 然后再
setXxx(timestamp) 在功能上与 jfinal 现在的做法是一样的,何必舍简求繁?

生成器的扩展极其简单,直接创建继承类,覆盖掉父类的相关方法即可,jfinal 所有生成器是面向扩展设计的,所有属性与方法是 protected 的,继承即可扩展

2016-10-18 16:27

不可以不继承,struts 2 用过三年多的时间,他的可以不继承 ActionSupport 的搞法,理想上是去除去框架的依赖,但是这样搞却要去依赖 ActionContext 这样的东东

这种对框架的 “必要” 的依赖是逃不掉的,在某一个地方暂时性的逃掉了,但在后面某处必然要补回来,例如通过 ActionContext.getContent() 这样的静态方法给补回来,出来混迟早要还的

所以, jfinal 并不避讳让用户的代码有轻量的依赖,例如,你的控制层可以是继承 Controller,而你希望的可独立运行于其它环境的控制层完全不需要依赖 jfinal,所以在 jfinal 的世界观里面,对框架的绑定在某个地方必不可少,并且是使用框架所提供功能的必要手段,但你可以将需要独立的地方独立出来,例如业务层,可以与任何框架毫无依赖关系

2016-10-18 16:05

@hjcscscs 正确,就是这样

2016-10-18 11:57

3:注意页面 form 表单的提交按钮的 typ 类型是常规的 submit:type="submit"

jquery form 这个工具的关键功能就是:页面要提交的表单,按照常规的非 ajax 的方式去组织,例如提交铵钮是 submit 而不是 button 类型,然后 jquery form 通过 $(...).ajaxForm(...) 这行代码可以接管提交这个动作,将你的普通表单提交直接改变成 ajax 提交

jquery form 的核心价值在于将你的普通表单提交自动转化成 ajax 提交