jfinal技术框架解析教学提纲.docx

上传人:b****8 文档编号:12365863 上传时间:2023-06-05 格式:DOCX 页数:16 大小:23.90KB
下载 相关 举报
jfinal技术框架解析教学提纲.docx_第1页
第1页 / 共16页
jfinal技术框架解析教学提纲.docx_第2页
第2页 / 共16页
jfinal技术框架解析教学提纲.docx_第3页
第3页 / 共16页
jfinal技术框架解析教学提纲.docx_第4页
第4页 / 共16页
jfinal技术框架解析教学提纲.docx_第5页
第5页 / 共16页
jfinal技术框架解析教学提纲.docx_第6页
第6页 / 共16页
jfinal技术框架解析教学提纲.docx_第7页
第7页 / 共16页
jfinal技术框架解析教学提纲.docx_第8页
第8页 / 共16页
jfinal技术框架解析教学提纲.docx_第9页
第9页 / 共16页
jfinal技术框架解析教学提纲.docx_第10页
第10页 / 共16页
jfinal技术框架解析教学提纲.docx_第11页
第11页 / 共16页
jfinal技术框架解析教学提纲.docx_第12页
第12页 / 共16页
jfinal技术框架解析教学提纲.docx_第13页
第13页 / 共16页
jfinal技术框架解析教学提纲.docx_第14页
第14页 / 共16页
jfinal技术框架解析教学提纲.docx_第15页
第15页 / 共16页
jfinal技术框架解析教学提纲.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

jfinal技术框架解析教学提纲.docx

《jfinal技术框架解析教学提纲.docx》由会员分享,可在线阅读,更多相关《jfinal技术框架解析教学提纲.docx(16页珍藏版)》请在冰点文库上搜索。

jfinal技术框架解析教学提纲.docx

jfinal技术框架解析教学提纲

JFinal技术架构浅析

1.1空间架构

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

个空间架构由 Handler、Interceptor、Controller、Render、Plugin 五大部分组

成。

每个部分都是基于接口实现的,支持完整的自定义,使用灵活,扩展性强。

空间架构图。

Handler

Interceptor

Controller

Render

Plugin

1.2逻辑架构

框架的逻辑架构非常简单,就是一个经典的MVC模式演化、大致分成以下6个步骤:

1.2.1Http

包括 HttpServletRequest、HttpServletResponse,即客户端请求与响应

1.2.2Filter

所有请求的拦截器,相当于是一个闸口

1.2.3Handler

请求处理器,是对所有请求的公共处理,在这里我们可以做权限控制、安全验证等。

它是一个责任链模式变种,由初始配置的Handler以及框架默认的ActionHandler

构成一个链条,依次执行。

1.2.4Action

动作处理器,它是一个AOP+Command模式变种。

由 ActionInvocation进行调度,

先执行拦截器,最后执行具体方法。

 

1.2.5Model

模型层。

在这个层面包括实体模型的定义、DB+ActiveRecord模式数据库操作的支持、从请求中解析出对应参数构造Model实例,可以把它看成是DAO。

1.2.6Render

渲染层。

负责将服务端的数据组装成客户端需要的数据格式,然后response到客户端。

支持多种视图的渲染:

FreeMark、Jsp、VELOCITY以及自定义。

HttpServletRequest

HttpServletResponse

JFinalFilter(所有请求的拦截器) 

Interceptorn(拦截器) 

Method(具体的方法) 

ActionActionInvocation(动作调度器) 

ActionHandler(动作处理器) 

Handler(处理器)  

Handler ModelInjector(模型构造器)

Model(模型定义)

DB(数据库操作工具)

Render(渲染器) 

JSPFreeMarkVeloCity自定义View

1.3代码架构 

1.3.1包结构

1.3.2包简介

Aop:

拦截器 

Config:

通用配置 

Core:

核心处理,主要是Controller的调度 

Ext:

扩展包 

Handler:

全局处理器I18N:

国际化 

util:

一些工具类

Log:

日志类 

Plugin:

插件处理 

Render:

渲染处理,比如对于FreeMark的支持 

Server:

服务器 

Token:

令牌 

Upload:

文件上传处理 

Validate:

验证处理,主要是数据持久化时的验证

 

1.4运作原理

我们从一次新增页面的add 操作请求来看:

 

1.首先是客户端点击新增按钮,提交一个新增请求,请求中会带上服务端处理地址url

2.所有请求都会被 JFinalFilter拦截,然后调用Handler 进行详细处理 

3.Handler是一 个链条形式的调用,包括0-n个自定义Handler,

  以及最后一个ActionHandler,依次执行,当然可以自定义跳出。

4.进入ActionHandler后,首先会根据请求的target 从缓存的ActionMapping 

中映射获取到具体操作对应的Action对象,这个对象里面封装了方法名、方法

上面的拦截器,方法所在的Controller,controller上面的拦截器等。

然后

根据Action以及Controller实例构造出ActionInvocation。

 

5.接下来通过ActionInvocation的 invoke进行具体处理,这是一个明显的 

  Command模式的实现。

首先是拦截器的调用,拦截器调用中会重新回调

  ActionInvocation的invoke,当拦截器调用完毕后,会调用当前操

  作的method

6.当进入具体controller的新增方法时,调用基类getModel(Systemparam.class);

  这个方法会从request中解析出所需要的数据,通过反射设置给具体的 

  Model实体类,最终通过ActiveRecord来进行数据存储.

7.最后是页面渲染render

核心代码简介

我们还是从一次新增请求的流程来看涉及到的核心类有哪些

 

本身就是一个Http的过滤器,主要有3个方法

2.1.1init(初始化)

在服务器启动时执行一次,负责初始化框架的全局配置

2.1.2destory(销毁)

在服务器停止时运行一次,负责销毁框架的全局配置

2.1.3doFilter(拦截)

拦截所有的客户端请求,处理具体逻辑

2.2JFinalConfig

是一个API引导式配置接口,供使用者自定义实现。

里面主要配置常量、配置路由、配置处理器、配置插件、配置拦截器。

2.2.1Config

自定义配置执行的调度器

2.3JFinal

初始化框架全局配置的调度器,由它来负责调用各个组件的初始化接口。

包括

 path、Handler、Action、Render、ActiveRecord、Const、i18n等。

另外它

还提供了启动内置服务器Jetty的api

2.4Action

即一个具体的动作,比如新增、修改、删除等,你也可以称之为方法。

它包含以

下内容:

controllerClass、controllerKey、actionKey、method、methodName、interceptors、viewPath

2.4.1ActionMapping

初始化请求url与Action的映射关系,是Controller的解析器,最终的产出物是生成一个个actionKey以及与之对应的Action对象。

2.4.2ActionInvocation

动作调度器,负责调用各个拦截器以及具体的方法

2.4.3ActionKey

自定义的注解,用于自定义action的路由规则

2.5Handler

通用的全局处理器

2.5.1ActionHandler

动作处理器,负责分析请求,找到对应的Action并执行

2.5.2HandlerFactory

全局Handelr的工厂,负责生成一个handler链

2.6Render

渲染器

2.6.1RenderFactory

渲染器的工厂类,负责构造出各种视图的渲染器

2.6.1.1FreeMarkerRenderFactory

FreeMarkerRender

2.6.1.2

JspRenderFactory

JspRender

2.6.1.3

VelocityRenderFactory

VelocityRender

2.7Iplugin

插件

2.7.1C3p0Plugin、DruidPlugin

数据源插件

2.7.2EhCachePlugin

缓存插件

2.7.3ActiveRecordPlugin

model初始化插件 

2.7.3.1AutoTableBindPlugin

自动绑定model与数据库表的插件 

2.7.3.2TableInfoBuilder

负责初始化model与数据库表的映射关系 

2.7.3.2.1TableInfo 

存储的即映射关系,包括tableName、primaryKey、columnTypeMap 

2.7.3.3Model

所有Model的基类,封装了通用的数据库操作的方法 

2.7.3.3.1ModelInjector 

从请求中构造出model实例的工具类 

2.7.3.4Db、DbKit

通用的数据库操作工具类

2.7.4SpringPlugin

负责与spring框架进行集成

2.7.5QuartzPlugin、Cron4jPlugin

任务调度插件

2.7.6ConfigPlugin

配置文件插件

2.8Routes

路由规则

2.8.1MyRoutesUtil

自动绑定Controller的工具类

2.9Controller

所有Controller的基类,封装了通用的方法

2.10拦截器

Interceptor

2.10.1Before

自定义拦截器的注解,配合拦截器实现类使用,实现热插拔拦截的功能

2.10.2Tx

事务处理的拦截器

2.11Validator

服务端的校验器,供用户自定义实现

2.12服务器接口

IServer

2.12.1JettyServer

内置的jetty服务器实现

2.13MultipartRequest

对于文件上传的处理

3.详细介绍

这里暂时只介绍几个核心的内容

3.1初始化

初始化在服务器启动时进行,入口即在JFinalFilter中,下面讲最重要的2项初

始化过程

3.1.1控制器的初始化

控制器的初始化包括2个方面,1个是路由,1个是action。

路由仅仅是初始化得到一个path—ControllerClass的映射。

Action的初始化则是将Controller中每个方法进行封装。

 

Action的初始化依靠ActionMapping的buildActionMapping方法实现,

下面是实现过程,当然我们首先得明白actioin初始化目标是方法:

 

1.获取不需要初始化的方法的名称,主要是基类Controller里面封装的一些通用方法 

2.获取全局拦截器 

3.遍历前面初始化好的路由,也就是每个自己写的业务Controller 

4.解析每个Controller的拦截器 

5.反射获取到每个Controller里面的所有方法,进行遍历 

6.排除掉不需要的,剩下的方法首先解析出方法上面的拦截器 

7.进行Action的构造newAction(controllerKey,actionKey,controllerClass, method,methodName,actionInters,routes.getViewPath(controllerKey)); 

8.最后用一个actionKey与Action进行映射,然后全局缓存住,这个actionKey即为客户端调用这个方法的唯一钥匙

从上面可以看出,jfinal中实际上是不保留对于Controller的初始化信息的,它的单位只有1个,就是Action(动作or方法)。

在我看来,这样的组织有点不合理,个人觉得应该是Controller保留,Action依附在Controller中,这样才是最合理的,而且全局的和类的成员将不需要重复出现在每个Action中。

客户端请求过来之后,应该首先执行全局方法,再获取到Controller,执行类方法,最后获取对应Action,执行具体动作。

 

3.1.2Model初始化

对于model的初始化,最终结果就是获取TableInfo对象这个对象里面包含表名、主键名、实体名以及1个columnTypeMap,这个map里面存放的是

数据库列名与该列数据类型Class的映射入口也是JfinalFilter的init方法

这里的TableInfo的list就是我们使用Jfinal的config需要初始配置的,

3.1.3自动初始化实体的实现

编写了一个AutoTableBindPlugin插件类,通过查询出所有继承自Model的实体类,然

后通过解析TableBind这个自定义注解,获取表名以及主键名

3.2Jdbc是如何与连接池插件集成的

比如我们原先使用的proxool,hibernate就支持与之整合。

亦或者spring中默认使用的c3p0。

连接池,说白了就是用来管理数据库连接的,比如最大允许多少连接数,最长连接时间等等,那么我们自己写的jdbc,怎么来整合它获得它所提供的功能呢?

其实和简单,我们只需要将数据库连接交由连接池去托管即可:

 

1.自定义一个类,比如叫C3p0Plugin,它负责与连接池的整合衔接,其实就是根据数据库

的配置,生成一个javax.sql.DataSource即可,这个DataSource对象必须是连接池的,比如要整合C3p0,那么就必须DataSourcedataSource=newComboPooledDataSource();dataSource.setJdbcUrl(jdbcUrl);dataSource.setUser(user);dataSource.setPassword(password);

 2.所有需要使用到数据库Connection的地方,全部通过C3p0Plugin中的DataSource获

取,获取方法为dataSource.getConnection()。

这样就完成了将数据库连接纳入连接池的工作

3.3声明式事务是如何实现的

框架的事务是通过注解来支持的,spring也是如此,即在需要事务的方法上面加上事务

特有的注解,比如这就是所谓的声明式事务。

要讲它是如何实现的,那么就必须先明白注解是怎么起作用的。

 

1.注解的意义注解的诞生就是为了解放xml的冗繁,从这一点可以看出,其实它最核心的功能就是为了配置。

当然它还有其他一些作用,比如功能聚簇。

实体的映射xml文件其实就应该与实体在一起的。

 

2.自定义注解自己定义一些需要使用到的注解,这个简单的应用还是比较简单的,

这里不多说

3.注解解析

注解的核心作用既然是配置,那么肯定是需要解析的,而且这种固定式的配置,显然只需要解析一次即可。

Jfinal中是在Filter的init方法中进行注解的解析工作的。

它会将方法以及方法上面的注解的映射关系都解析好缓存起来4.注解应用当调用到具体该方法时,首先会从缓存中获取该方法上面的注解,然后根据具体的注解内容进行相关的处理,比如这里的Tx.class,就是一个事务处理的拦截器,那么就会调用事务处理的操作。

这里是一个递归调用方式:

ActionInvocation调用invoke方法Invoke方法中调用各个拦截器的拦截方法interceptIntercept方法中会通过传入的ActionInvocation对象回调invoke方法继续处理这样如下的事务操作就可以囊括整个方法的执行了,这就是个命令模式。

3.4DB+ActiveRecord

DB的话很简单明了,就是一个数据库操作工具类,ActiveRecord说白了就是在我们的model中加入了数据库操作的能力。

比如add、remove、update。

这些通用的处理,JFinal在中统一交由最上层的基类Model进行,我们的实体类继承自Model,就拥有了该能力。

3.5表单数据自动绑定是怎么实现的

Jfinal中一个表单的新增,后台只需要写如下代码即可完成,它是如何实现的

1.表单页面

首先我们看下这个表单页面,注意3个输入域的name属性,都是blog.xxx,这里实际上就是设置了值与实体属性之间的映射关系了2.服务端从request中获取到所有的值,过滤出其中blog属性,缓存到Model基类的attrs这个map中3.最后通过Record的add方法进行新增。

3.6关于路由 

3.6.1ioc

这里的路由就相当于我们原先seam框架的ioc了,不过它功能更简单一些,需要在初始的时候进行配置,也就是页面与Controller之间的映射关系。

3.6.2如何去除路由配置

很简单,使用我们原先的注解的方式即可。

自定义一个Controller的注解,比如Name,然后解析初始化到全局配置中即可。

3.6.3自动绑定controller的实现

原理与我们原先猜想的一样 

1.自定义了一个RouteBind注解,然后每个Controller进行绑定

2.编写了一个工具类MyRoutesUtil

该工具类将webinf/classes目录下面所有的.class二进制文件查找出来,然后通过反射和解析注解生成jfinal的Routes

3.在服务器启动的时候进行初始化即可

3.7拦截器

Jfinal中所有的拦截都通过Interceptor实现,根据位置大致可以分成以下几种

3.7.1全局拦截器

在config中进行注册

3.7.2类拦截器

在类上面通过注解注册

3.7.3方法拦截器

在方法上面通过注解注册

3.8插件机制

插件的机制主要就是一个基于接口动态扩展实现的架构,最顶层是一个IPlugin。

其实说白

了,它就是一个全局性配置的扩展实现。

3.8.1插件的注册

在自定义实现的JfinalConfig中进行配置

3.8.2插件运行

所有插件的运行都是在服务器启动的时候进行一次,具体是在Config类中的如下方法:

3.8.3插件停止

停止即在服务器关闭时JfinalFiler的destroy中进行

3.9缓存 

3.9.1EcachePlugin

框架本身内置了Ecache这个插件,可以直接使用,只需要在JfinalConfig中进行注册即可

3.9.2MemcachedClient

另外还有1个分布式缓存的实现,具体可以参照MemcacheTool

4如何使用

4.1拦截器

参照上面的3.7

4.2控制器

编写一个普通java类,继承Controller,类上面使用注解进行路由绑定

@RouteBind(path="/power")publicclassPowerContrallerextendsBaseController

4.2.1调用controller的方法

1.页面进来的时候默认会走index方法,这个实现在ActionMapping 

2.调用指定方法默认调用controller中方法的方式为/controllername/methodname比如上面的路径,power为controller的路由注解、list即为方法名字。

但是也可以通过ActionKey这个注解来进行自定义,比如如下就将list方法名改成了hello。

@ActionKey(value="hello")

publicvoidlist(){}

4.3数据库操作

Jfinal中数据库的增删改查都可以通过Db这个工具类或者实体对象进行。

也就是所谓的DB+ActiveRecord方式。

里面的数据库方法基本涵盖了所有需要的,而且它支持POJO形式的操作。

4.4参数获取

后台获取请求中的参数,都是通过基类Controller中封装好的getPara…方法进行。

4.5如何实现事务

框架的事务是方法级别的,在需要实现事务的方法上面使用注解@Before{Tx.class},加上事务Tx的拦截器即可。

4.6如何实现文件上传

前端用一个js上传控件,后台有通用的FileController支持处理比如前端用的swf的上传控件

后端:

5后续扩展改进

5.1懒加载

主要是针对Model以及Controller的初始化,使其支持懒加载的实现,最后可以通过devMode参数来进行控制

 

2003年,全年商品消费价格总水平比上年上升1%。

消费品市场销售平稳增长。

全年完成社会消费品零售总额2220.64亿元,比上年增长9.1%。

5.2带参数方法的支持

在前端需要能够调用服务端带参数的方法,参数能够直接绑定到方法上面

参考文献与网址:

5.3如何实现多数据源

多数据源的实现主要在于事务的控制上面,大家看下这个事务拦截器的实现:

这里DbKit.getDataSource获取到的是一个静态的全局框架性数据源的定义,显然是唯一的。

但是我们可以对其进行改造,只需要这里事务可以从当前使用的数据源进行控制即可达到目的。

(一)创业机会分析

秘诀:

好市口+个性经营5.4集群与负载均衡

 

(2)物品的独一无二Session的信息可以采用分布式的memcache来支持共享。

而无状态的框架架构可以支持集群与负载均衡的实现

5.5前端的技术选型

(三)DIY手工艺品的“自助化”

§8-2购物环境与消费行为2004年3月20日目前js控件库准备采用jQuery-eazyUI与dwz中的一个,模板则使用freeMark或者jsp来进行,具体情况需

为了解目前大学生对DIY手工艺品制作的消费情况,我们于己于人2004年3月22日下午利用下课时间在校园内进行了一次快速抽样调查。

据调查本次调查人数共50人,并收回有效问卷50份。

调查分析如下:

要等到实际尝试测试后确定

“漂亮女生”号称全国连锁店,相信他们有统一的进货渠道。

店内到处贴着“10元以下任选”,价格便宜到令人心动。

但是转念一想,发夹2.8元,发圈4.8元,皮夹子9.8元,好像和平日讨价还价杀来的心理价位也差不多,只不过把一只20元的发夹还到5元实在辛苦,现在明码标价倒也省心省力。

5.6Webservice支持

 

综上所述,DIY手工艺品市场致所以受到认可、欢迎的原因就在于此。

我们认为:

这一市场的消费需求的容量是极大的,具有很大的发展潜力,我们的这一创业项目具有成功的前提。

restful方式,还是传统的webservice。

这个个人觉得可以放到后面去考虑,实现肯定不是问题的。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2