easyjweb请求过程

easyjweb服务启动之后,便可接受请求。当一个请求到达时:


1、

  • 过滤器CharsetFilter根据web.xml中配置对编码方式进行转化request.setCharacterEncoding(encoding),若用get方式提交表单,该功能无效,需要在程序中手动处理。
  • 中心处理器ActionServlet根据配置处理*.ejf或/ejf/*形式的请求。保存request和response到ActionContext,初始化DefaultRequestProcessor

2、

  • 利用PathMappingRulerImpl解析请求url,解析得到module,[cmd,param]。url有三种形式:
    • /xx.ejf(classic_pettern),去掉后缀即可得module,其余参数由容器解析
    • /module/cmd/param,第一种url的变形
    • /easyajax/ajaxCall,ajax请求形式,解析出module=easyajax,command=ajaxCall
  • 配置国际化,默认资源路径为/WEB-INF/applicationResources/,根据客户设置或者从request中获得local

3、

  • 通过webConfig查询module(根据module的name或alias),从request中读取个参数并创建WebForm(直接实例化WebForm或者根据配置form获得,此处为前者)保存参数;
  •  根据module名在container查找相应的Action,将action,module,form保存于WebInvocationParam对象,以WebInvocatio保存在ActionContext中。

4、

  • 执行全局拦截器;
  • 执行module的前置拦截器,需要实现BeforeInterceptor接口,实现before(Object target,Method method,Object[] args)方法,其中target为action,method为null,args[0]=WebInvocationParam
  • 处理AutoToken,如果有配置,用于防止重复提交:需从form中提取com.easyjf.easyjweb.token得到令牌,并检测是否合法
  • 执行action.execute()方法,保存form数据到property中,并用addResult保存到resultMap中
  • 执行module的后置拦截器,如果验证出错(Errors.hasError())且模板有配置验证,则查找并返回自动验证页面(name为input的页面,无则是请求页面)

5、

根据page的type执行页面跳转:

  • template或string:合成模板,执行回调,然后根据uri执行RequestDispatcher跳转

page的type是string类型且page的content不为空,则利用velocity根据content初始化模板,否则解析模板名字,查询模板缓存,若不存在则利用velocity初始化模板

将form中resultMap、创建上下文所需的全局工具(HtmlUtil、CommUtil、TagUtil、i18n、lang、html、AUTH、ROLE等,可在html页面中直接调用,如$html.forward("list"))、session、request、errors加载到上下文

  • null: 空结果集页面,表示不返回任何结果集
  • action:处理action类型的Page对象,对于该类型对象,会记录已经跳转的次数,并在跳转次数达到框架设置的最大跳转次数后抛出FrameworkException。如果能继续传递该跳转,会根据page的url样式构建一个新的pathRuler对象,并将当前的WebForm和pathRuler对象一起传递给process方法重新执行下一个action。
  • forward: 根据page的url直接执行dispatch跳转
  • html:执行response.sendRedirect(page.getUrl());

你可能感兴趣的:(Ajax,Web,框架,velocity,webform)