jFinal的controller学习笔记

参考:https://www.jianshu.com/p/ca4c6ee1fc12

 

流程:

1.

初始化的时候,把业务上的controller遍历,利用反射把controller类的信息封装为Action类,

并构建了 k-targer,v-action的mapping

2.

运行时,根据web.xml的配置,依次找到处理类信息处理链的链首节点 ActionHandler,

3.

在 ActionHandler 中

3.1: Action action = actionMapping.getAction(target)

3.2: new Invocation(...).invoke()

3.3: render(...)

 

TODO:还没有弄清http request 过来,第一个处理请求是哪个类?

 

分析:

在web.xml中配置

<filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>configClass</param-name> <param-value>net.dreamlu.common.WebConfig</param-value> </init-param> </filter>

 

JFinalFilter中的init()方法中,

handler = jfinal.getHandler(); // 开始接受请求

 

 

Jfinal的init(JFinalConfig jfinalConfig, ServletContext servletContext)方法中,

调用了 initHandler();(实际里这里还有另一个重要步骤 initActionMapping())

private void initHandler() {

ActionHandler actionHandler = Config.getHandlers().getActionHandler();

if (actionHandler == null) {

actionHandler = new ActionHandler();

}

actionHandler.init(actionMapping, constants);

handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);

}

 

最后一句调用 HandlerFactory.getHandler,

/**

* Build handler chain

*/

@SuppressWarnings("deprecation")

public static Handler getHandler(List<Handler> handlerList, Handler actionHandler) {

Handler result = actionHandler;

for (int i=handlerList.size()-1; i>=0; i--) {

Handler temp = handlerList.get(i);

temp.next = result;

temp.nextHandler = result;

result = temp;

}

return result;

}

在这个方法里,返回值是Handler,并不是List<Handler>。利用Handler的next属性,实行了链表结构。返回值的Handler实际是一个HandlerChain的链首节点ActionHandler。

 

在action的handle方法中,处理最开始的httpServletRequest

/**

* handle

* 1: Action action = actionMapping.getAction(target)

* 2: new Invocation(...).invoke()

* 3: render(...)

*/

public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled)

 

在这个handle方法里,注释说明了流程

1: Action action = actionMapping.getAction(target)

2: new Invocation(...).invoke()

3: render(...)

 

回到前面,actionMapping 的产生。

( actionHandler.init(actionMapping, constants);的参数actionMapping)

 

private void initActionMapping() {

actionMapping = new ActionMapping(Config.getRoutes());

actionMapping.buildActionMapping();

Config.getRoutes().clear();

}

 

在buildActionMapping()里做了一系列反射相关的而操作 ,构建主要是构建了Action这个类,然后把key-value 放到了mapping里。

 

Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, route.getFinalViewPath(routes.getBaseViewPath()));

if (mapping.put(actionKey, action) != null) {

throw new RuntimeException(buildMsg(actionKey, controllerClass, method));

}

 

转载于:https://my.oschina.net/u/2382040/blog/3062465

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值