您的位置:首页 > 其它

JFinal如何分层?想了好久都没搞明白,贴一波大神的理解

2018-01-30 16:20 239 查看
JFinal如何分层?

JFinal 项目通常建议至少 MVC 三层,Controller 是控制层,只做这几件事:

1:使用 getPara 系列方法获取请求参数

2:使用得到的 para 做为参数(如果有需要的话),调用业务层

3:将业务层调用的结果利用 setAttr 存入 request

4:render

    Model 是业务层,除了封装业务以外主要注意如下几点:

1:sql 通常需要写在业务层,controller 中不要写 sql

2:可以根据引入单独的业务层

3:Model 中的业务方通常不要是 static 方法,业务通常是对当前对象而言的,而非全局。例如有个订单 model为 Order,那么判断该订单是否已经支付则为  order.isPaid(),而非 Order.isPaid(order)

    View 是视图层,主要注意如下问题:

1:只读取并展现数据,绝对不要有业务逻辑,也不要有复杂的逻辑控制

2:当展现逻辑很复杂时,可以建立相应的 Helper 类来辅助生成 String

3:对于通用的view层辅助类,可以创建通用的工具类,全局共享使用

4:界面布局一定要使用 layout,极大减少代码冗余提升开发效率,具体可见jfinal_demo项目

   Validator 可以当做是独立于 MVC 之外的一层,起安全保护作用。访问数据库时验证用户是否重复属于业务层的事。

    关于项目模块简单划分方式:

1:根据需求设计好数据库表

2:通常根据数据库表建好相应的包以及类,例如有 user、blog两张表,那么建好 com.xxx.user、com.xxx.blog两个包,然后在各自的包下建好UserController、User、BlogController、Blog等等类。

3:访问的路由正好是表名: "/user" 、"/blog",这正好是 restful 风格。

4:对于不存在表名但需要的功能,可以抽象出资源名,然后做 controller、model

(摘自:http://www.jfinal.com/feedback/296)

jfinal 项目建议分为 MVCS 四层结构:

1:M (Model)层用 jfinal 2.2 生成,model 中不要使用 static Xxx dao 这样的对象,避免新手误用,model 中只放一些与字段状态相关的方法,例如 User 这个 model 你可以针对 status 字段,放一个 public boolean isStatusOk() 这样的方法

2:V (View)层就是展现层,尽可能只去展现数据,避免复杂逻辑

3:C (Controller)是控制层,只负责得到前端参数,转调业务层,render。避免写业务逻辑,绝不可写数据库查询之类的代码

4:最最核心是 S (service)业务层,基本上来说, 95% 以上的代码要写在这里,只要是对数据库的操作代码也全部写在这里。如果业务层以外需要操作数据库,那么也要先在业务层去创建方法,然后再让业务层以外去转调这个业务层代码,这样可实现尽可能大的代码重用

5:事务控制,我个人习惯于使用 Db.tx(...) 来做,如果要用拦截器,建议使用业务层拦截器,控制层坚持只做我前面 3 中所说的事情

6:只在需要的时候使用接口、抽象类,业务层在绝大部分情况下不需要使用接口,直接是 XxxService.java 就可以了

model 中不要创建 dao 对象以后,将 dao 对象创建在 service 层中这样来:private static Xxx dao = new Xxx(); 记得是 private,这样就防止其它业务插手本业务的事情

业务层:

public class XxxService {

public static final XxxService me = new XxxService();

final Xxx dao = new Xxx();

public Ret justDoIt(...) {

if (...)

return Ret.error("msg", "xxxx");

....

return Ret.ok(key, value);

}

}

这样做以后,外界可以这样调用:XxxService.me.justDoIt(...); dao 对象仅供 XxxService 内部使用,而且由于 me 对象是 static 的,所以内部所有其它的属性和方法都不要弄成 static 的

此外,如果用到业务层 AOP,将 new XxxService() 改成 Duang.duang(XxxService.class) 即可

package分类

出处:http://blog.csdn.net/u012995856.

config是JFinal的项目配置

controller是控制器

handler可以设置全局处理器,例如判断用户请求中是否直接请求

FreeMarker的模板文件ftl或者html的后缀,重定向到404

interceptor拦截器,例如后台admin的每项操作拦截判断admin是否有权限或者是否已经登录

model.base用于JFinal的Generator生成器自动生成数据库映射基础模型类

model用于继承基础模型类的dao操作

routes用于设置单独路由配置,例如大项目可单独设计后端路由AdminRoutes、前端路由FrontRoutes

service作为controller与model的层,处理业务逻辑

test用于项目测试

utils用于公共的工具类,例如apache poi的word在线生成打印工具

validate用于后端验证,比前端JS验证安全、靠谱

String username = user.getStr("user");//获取User数据表中字段为user的值。

String password = user.getStr("password");//获取User数据表中字段为password的值。

String sql = User.user.getSql("getUser");//将sql赋值为

public map<string,object> login

Map是以键值形式存储数据,有点类似于数组。

public是一个访问修饰符

map<string,object>中string是它的键,存储的类型为String

object是它的值,object为所有数据类型的父类,就是说可以存储任何类型的数据,调用时,可以进行转型

login是它的方法名

完整的应该是

public map<string(键),object(值)> login(){

//定义一个map,通过put进行赋值,返回

    return map;

}

Description Resource Path  Location Type

Dynamic Web Module 3.0 requires Java 1.6 or newer.

那么为什么demo和手册里面都有Model.dao这样的用法呢。

有2个好处。

1 让做数据访问时候api调用简洁快速。

2 理论上省内存,因为每一次数据访问的时候使用的是同一个对象。

但是从目前的情况来看起带来了不好的后果,很多新手有误用的情况,用静态的dao对象来承载数据并持久化,这是一个错误的用法,是非线程安全的。

简单的说,只有到选择model做数据访问的时候才能使用静态dao对象来调用api,其他做实体承载数据的,必须new Model().
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JFinal