极速web开发框架jfinal作者詹波专访 -乐鱼入口

2013-12-06  编辑 wangguo 评论(25条) 有79743人浏览
jfinal是一个基于java的极速web开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、restful,在拥有java语言所有优势的同时再拥有ruby、python等动态语言的开发效率。jfinal项目开发始于2011年初,并于2012年3月开源,采用对商业应用友好的apache 2.0协议。

项目地址:

本期我们采访了jfinal项目的作者詹波,请他来详细介绍这个项目。詹波曾任搜格信息技术有限公司java架构师,北京信息管理科学研究所cto,于2011年联合创办了微格网际科技有限公司,并担任旗下网校网的cto。

先做个自我介绍吧!

我叫詹波,英文名james,程序员一枚。爱好天文、物理、科幻、设计、编程、音乐、游戏、爬山、游泳。从小喜欢研究制造新东西,首次有用的制造是在八岁时独创的灭苍蝇手枪以及全新设计的火药玩具枪。对未知世界有着强烈的好奇心,终极理想是做一名自由发明家,财务自由后计划首先研究空间发电(非永动机)。

jfinal是一个什么样的项目?提供了哪些功能?

jfinal是基于java语言的极速web orm框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、restful。在拥有java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为开发者节约更多时间,去陪恋人、家人和朋友。

jfinal的主要特点如下:

  • mvc架构,设计精巧,使用简单;
  • 遵循coc原则,零配置,无xml;
  • activerecord支持,使数据库开发极致快速;
  • 自动加载修改后的java文件,开发过程中无需重启web server;
  • aop支持,拦截器配置灵活,功能强大;
  • plugin体系结构,扩展性强;
  • 多视图支持,支持freemarker、jsp、velocity;
  • 强大的validator后端校验功能;
  • 功能齐全,拥有struts2的绝大部分功能;
  • 体积小仅180k,且无第三方依赖;

jfinal项目是怎么诞生的?

jfinal始于2011年创业项目的实际需要。创业前曾使用rails开发项目,被rails的开发效率深深吸引,但无奈于rails开发者稀有难招,以及ruby语言固有的缺点,故决心打造jfinal,将静态语言与动态语言两者优点结合起来用于创业项目。

jfinal中的j代表java语言,final有最终的意思,希望jfinal能成为java开发者的最终选择。final还有稳固不变的意思,也因喜欢事物本质,热爱永恒的真理。

jfinal的设计思想和理念是什么?有哪些创新点?

jfinal 遵循大道至简的设计思想。主要创新点:

  • 微内核 全方位扩展架构;
  • db record 模式;
  • cpi模式;
  • activerecord模式java实现方式;
  • api引导式配置;
  • api引导validate;
  • 采用scanner classloader结合jetty实现热加载;
  • 极简设计,核心代码约2000行实现web mvc orm。

介绍一下jfinal的架构?jfinal实现极速开发的原理是什么?又是如何实现的?

jfinal采用微内核全方位扩展架构,全方位是指其扩展方式在空间上的表现形式。

jfinal由handler、interceptor、controller、render、plugin五大部分组成,以action为参照,handler处在扩展的最外围,interceptor处在更贴近action的周围,controller承载action处在扩展的中心,render处于action后端,plugin处于action侧边位置。



jfinal实现极速开发主要是因为走的极简设计风格:零配置、代码量少、开发体验连续、无第三方依赖、概念最少化等等。

要实现极简设计,必须要为架构注入灵魂,系统才有自己的极简性格。设计前先在脑海中形成一整套的极简设计思想,让这套思想融入到灵魂的深处,在行动时每动一个设计念头时以此为指导思想,最后的结果就能如愿。

讲讲项目开发过程的事情,从立项到发布首个版本之间有什么让你印象深刻的事情?

jfinal项目始于2011年3月左右,第一个版本大约两周左右开发完成,再用了一周时间将手头ssh项目切换至jfinal。

这期间最令人兴奋的事情是脑海中不断迸发出新的想法,然后立即将想法变为现实,这段时间更加确信可以通过持续地专注来激发创造力,后续工作中也验证了此法的有效性。

开发过程中你遇到了哪些困难?是如何解决的?

开发过程最大的困难就是写代码实现,想法很快就能有,但实现起来需要花费更多时间,代码极简比仅仅实现功能要困难得多。

解决这些问题,需要对各种因素进行深入透彻分析,权衡得到最优方案。

你每天投入在jfinal项目上的时间大概有多少?是否有其他人参与了项目贡献?

不同时期投入时间不一样,如果工作不紧张,每天两三个小时都没问题。最近几个月工作极忙,一般是在临睡前回复一下热心网友们的问题。有很多热心的网友提了很多建议,也有少部分人在github上提交过代码。

jfinal下一步的计划和目标是什么?

jfinal将一直坚持极简设计风格,在不断优化发展内核的同时,通过扩展的方式加强周边工具设施的建设,进一步提升开发体验。另外jfinal.com大部分构想已经完成,时间允许情况下会开发上线,jfinal.com关注开发者群体,将是完全不一样的模式。

将jfinal开源的初衷是什么?你从开源中得到了什么?在开源方面有什么感悟?

本人是乐于助人的性格,有好东西乐于分享出来。造福于广大的工程师,自己会更快乐,更有成就感。另外开源出来也希望jfinal变得越来越好。

开源给我的感悟是做开源项目需要为其注入思想与灵魂,让其具有鲜明的个性与主张,并且要让更多的人接受并喜欢才能快速发展。乐于分享会使自己变得更快乐、幸福,帮助他人就等于帮助自己!

你怎么看待开源以及国内的开源环境?你最希望对其他打算从事开源的开发者说的话是?

国内大部分工程师大都忙于生计,参与开源相对比较困难,国人对国产开源项目信心不足也是个问题。

建议打算从事开源的开发者在自己喜欢的方向和擅长的领域设定一个目标,尝试做个开源项目,会使你变得更充实、更快乐,及很多意想不到的收获。
  • 大小: 67.4 kb
  • 大小: 82 kb
  • 大小: 12.3 kb


评论 共 25 条
25 楼 2016-01-28 19:04
jfinal首套专业视频教程已经在csdn学院上线 http://edu.csdn.net/course/detail/1968
24 楼 2015-09-20 09:57
第一步jfinal书籍《jfinal极速开发实战》发布

百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f
23 楼 2015-08-02 14:02
fair_jm 写道
cppmule 写道
与play!的实现还是有差距啊。大家怎么看?

play我觉得很明显的好用的地方:
一是routes
二是scala
三是配合akka
四是不在服务器端存session还是用cache

jfinal的路径配置是基于默认约束的 在取path 和 query 参数上都有点麻烦... ...
我的感觉..

  jfinal 的路由是注册才可以使用,没有什么默认约束这一说,query 参数有 getpara系列与 getmodel 系列方法很方便取数据,看一下 jfinal 手册就清楚了。
  至于 scala、akka 这个在jfinal 中直接使用即可。最后服务端 session 对于大部分使用 jfinal 的项目来说都是放 cache 中的,session 只用于小型项目,这些事情 jfinal 并没有限制开发者,按需取用。建议楼主看一下 jfinal 手册,在此下载 http://www.jfinal.com
22 楼 fair_jm 2015-01-31 19:48
cppmule 写道
与play!的实现还是有差距啊。大家怎么看?

play我觉得很明显的好用的地方:
一是routes
二是scala
三是配合akka
四是不在服务器端存session还是用cache

jfinal的路径配置是基于默认约束的 在取path 和 query 参数上都有点麻烦... ...
我的感觉..
21 楼 2015-01-26 15:40
与play!的实现还是有差距啊。大家怎么看?
20 楼 2014-04-12 21:30
[size=large][/size]qsqqwqwqwqwqwa洒洒水
19 楼 2014-04-12 21:17
xuelange 写道
支持

18 楼 2013-12-26 12:00
一直在使用中,绝对值得大力推广
17 楼 2013-12-23 17:49
支持
16 楼 2013-12-21 10:17
支持波波,那些说重复制造轮子的肯定没有接触过jfinal,只不过是人云亦云罢了!
15 楼 2013-12-20 09:54
请不要重复发明轮子,看着跟spring mvc没多大区别
14 楼 2013-12-11 19:46
文档啊文档,赶紧完善文档吧,下载的文档里面只是简单的介绍,应该还有很多内容都没提到吧。
13 楼 2013-12-10 14:07
詹波兄弟,我觉得这个思路挺好,不过离一个完整的框架比还缺少不少东西,是否愿意进一步完善?
12 楼 2013-12-09 17:03
前台jsp界面没有创新的地方吗?还是就用strut2来做吗?这样体现不了一个完美的开发框架啊
11 楼 2013-12-09 15:37
看着还不错
10 楼 2013-12-09 07:06
vice nice. best of luck.
9 楼 2013-12-08 20:28
很不错的@jfinal
8 楼 2013-12-08 13:25
另一个轮子
7 楼 2013-12-07 18:18
楼主帅哥一枚~
6 楼 fair_jm 2013-12-07 11:13
在用着做点小作业 很好用 不错~
5 楼 2013-12-07 09:25
jfinal的理念很好
4 楼 2013-12-07 08:43
支持,看起来技术不错!
3 楼 2013-12-06 20:45
支持波波。
2 楼 2013-12-06 17:23
支持一下波波,beetl也因为jfinal得到很好的推广
1 楼 2013-12-06 17:19
楼主帅哥一枚啊,哈哈

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 忙呀忙

  • window.onpopstate、window.history.pushstate、window.history.replacestate api的区分 window.onpageshow 控制浏览器历史记录的api——window.onpopstate(),每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发 window.history.pushstate(). window.histoey.replacestate() 添加和修改历史记录条目,与..

  • dom中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退。 从html5开始,我们可以开始操作这个历史记录堆栈。   1.history 使用back(),forward(),和go()方法可以在用户的历史记录中前进和后退 前进和后退 后退: window.history.back();

  • 在之前的文章《ajax无刷新加载页面,结合history.state修改url》中,我详细解释了history.pushstate、history.replacestate、history.state以及window.popstate这四个关键元素,并试图建立一个合理的ajax无刷新更换url的页面加载方式。但那之后,我遇到一个比较复杂的问题,集中在state的内容上,本文则来详解state这个要...

  • 今天在看vue-router的时候发现,vue-router源码用到了history.pushstate()和history.replacestate(),故,仔细看一下。 一. 概述 window.history属性指向 history 对象,它表示当前窗口的浏览历史。 history 对象保存了当前窗口访问过的所有页面网址。下面代码表示当前窗口一共访问过3个网址。 window.histo...

  • let url = changeurlparam(location.href, name, value); // 修改 url 参数 history.replacestate(null, null, url); // 替换地址栏不跳转

  • 需求:通过统一认证登录页面跳转过来,会通过url的形式携带token,需要从url中获取到token并存储到本地。问题:由于使用hash的路由模式,会在原始url的末尾拼接"/#/",导致也一直被展示在url上,十分不美观。方案:通过history.replacestate的方式修改url,不会产生页面跳转的问题。

  • vue的路由分为hash和history模式,他俩最直观的区别就是hash路由有一个 # 号,而history是没有的。还有就是: 1. hash支持低版本的浏览器,而history就没有那么友好了 2. (1) hash模式下,它指 # 号之后的所有字符,但是他虽然包含在url中,但是不包含在http请求中。所以改变hash值不会重新加载页面,对传给后端的url没有任何影响,因此不会重新加载页面。它每次改变都会触发hashchange事件,可以通过给window加上hashchang...

  • vue中hash和history区别

  • 一般用来清空url传递的参数不刷新,这样可以少发送一次请求到后台 var url = window.location.href; var valiable = url.split(“?”)[0]; window.history.pushstate({},0,valiable);

  • 最近做项目,发现之前搞的replaceparamval()方法有bug,重新修改后,应该完美了。上代码//url替换指定传入参数的值,paramname为参数,replacewith为新值,isrefresh为是否刷新页面,0表示不需要刷新,这个最牛举例:https://www.aazj.cn/index.html?popenid=757522579上面这个地址js调用方法:replaceparamval("popenid","600",0),就会在地址栏上修改参数popenid=600,不会刷新页面,新地

  • js里面动态修改url地址,但是不想刷新页面 window.history.pushstate({}, 0, window.location.href '?type=china'); 如下,给url添加mode参数,或者修改mode参数 function change{ window.history.pushstate({}, 0, window.location.href.split('?mode=')[0] '?mode=' mode); }

  • window.history.pushstate(null, '修改搜索栏地址','?page=1')

  • https://www.cnblogs.com/ferryinjs/p/4797610.html 一般用来清空url传递的参数不刷新,这样可以少发送一次请求到后台 var url = window.location.href; var valiable = url.split(“?”)[0]; window.history.pushstate({},0,valiable); ...

  • 如何更改当前页面url // 设置当前url setcurrenturl () { if (!!(window.history && history.pushstate)) { // 支持history api if (!(this.$route.query.shopid || gethashurlquery('shopid'))) { histor...

  • 今天做项目的时候突然遇到一个需求,实现js改变地址栏地址而不跳转新页面,上网搜没有搜到我想要的方法,后来自己很奇妙的碰对了,贴出来分享一下 我的背景是从一个页面点击链接跳转到本页面(http://caojiejun.snslearn.com/open/index/openap)时会自动到所要跳转的内容段,这个时候肯定需要它带过来一个参数,在这里即是 apiagreement...

  • 首先需求是这样的: 我在请求地址url上添加了个参数,来判断当前是什么状态,如果参数符合条件,就报错怎么怎么的。 然后要是修改成符合要求之后,那这个页面就应该不报错了,但是url没变,一刷新,还是会提示错误信息。 这就不符合要求啦。 但是,这个页面的url是不变的,ajax请求处理完之后,这个页面是不会刷新的,即使 location.reload()。也不会改变页面的url地址, 怎...

  • 1、hash模式和history模式的区别 表现形式的区别 hash模式路径中带#,#后内容作为路由地址 history模式正常路径 需要服务端配置支持 原理的区别 hash模式基于锚点,以及onhaschange事件,根据路由地址不同呈现不同内容 history模式基于html5中的history api - history.pushstate() ie10以后支持 - history.replacestate() 2、history 模式的使用 需要服务器的支持 单页面应用中,服务端不存在

  •  在project server中想要建立文档和任务之间的关系时失败 今天给系统集成部项目一部的同事讲project的应用的时候,我想要在文档库和任务之间创建一个关系.当我在文档属性的"链接任务"后面单击"选择与此文档相关的项目任务"的时候,系统提示:"没有可用的任务项目没有发布到project server上,或者没有分配给你的任务以及你没有查看任务列表的权限" 我检

  • 1. hash模式 早期前端路由的实现就是基于location.hash来实现,也就是锚点。本质上就是改变window.location的href属性。我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新。这也就是,单页面应用嘛。 hash模式有下面几种特性: url中hash值只是客户的一种状态,也就是说当向服务器发出请求时,hash部分是不会被发送的。 hash值的改变,都会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制hash的切换。 可以

global site tag (gtag.js) - google analytics
网站地图