easyjweb服务启动之后,便可接受请求。当一个请求到达时:
一、
过滤器CharsetFilter根据web.xml中配置对编码方式进行转化request.setCharacterEncoding(encoding),若用get方式提交表单,该功能无效,需要在程序中手动处理。
二、
中心处理器ActionServlet根据配置处理*.ejf或/ejf/*形式的请求。保存request和response到ActionContext,并设置Local;初始化DefaultRequestProcessor,并执行处理
三、
利用PathMappingRulerImpl解析request①;配置国际化,默认资源路径为/WEB-INF/applicationResources/,根据客户设置或者从request中获得local
四、
通过webConfig查询module(根据module的name或alias)②;
从request中读取个参数③并创建WebForm(直接实例化WebForm或者根据配置form获得,此处为前者)保存参数;
根据module创建相应的Action(在container中查找,不存在则默认创建,已过时②);
将action,module,form保存于WebInvocationParam对象,以WebInvocatio保存在ActionContext中。
五、
执行全局拦截器(配置文件,目前只支持无参方法执行);
执行module的前置拦截器,需要实现BeforeInterceptor接口,实现before(Object target,Method method,Object[] args)方法,其中target为action,method为null,args[0]=WebInvocationParam
处理AutoToken,如果有配置,用于防止重复提交:需从form中提取com.easyjf.easyjweb.token得到令牌,并检测是否合法④
执行action.execute()方法(详见execute详解)并保存form数据到property中,并用addResult保存到resultMap中
执行module的后置拦截器,如果验证出错(Errors.hasError())且模板有配置验证,则查找并返回自动验证页面(name为input的页面,无则是请求页面)
六、
根据page的type执行页面跳转:
1、template或string
合成模板⑤,执行回调(用于Ajax调用,Ajax章节详解),然后根据uri执行RequestDispatcher跳转
2、null
空结果集页面,表示不返回任何结果集
3、action
处理action类型的Page对象,对于该类型对象,会记录已经跳转的次数,并在跳转次数达到框架设置的最大跳转次数后抛出FrameworkException。如果能继续传递该跳转,会根据page的url样式构建一个新的pathRuler对象,并将当前的WebForm和pathRuler对象一起传递给process方法重新执行下一个action。
4、forward
根据page的url直接执行dispatch跳转
5、其他,如html
执行response.sendRedirect(page.getUrl());
注:
①
解析请求url核心方法PathMappingRulerImpl:doPathParse
url有3种形式,解析得到module,[cmd,param]
1、/xx.ejf(classic_pettern),去掉后缀即可得module,其余参数由容器解析
2、/module/cmd/param,第一种url的变形
3、/easyajax/ajaxCall,ajax请求形式,解析出module=easyajax,command=ajaxCall
②
代码中由不存在时的判断,则根据url路径生成IWebAction全名(/hello-->默认action路径.HelloAction,/hello/test-->*.Hello_testAction),并初始化module对象。该方法已过时,默认路径下的Action崽初始化的时候也应该被扫描,如注入等操作才能进行
③
1、有文件上传(contentType.startsWith("multipart/form-data"))且为post方式,先创建临时目录,在
2、contentType为text/xml型
用request.getReader()按行读取,以"xml"名保存在textElement
3、通过request.getParameterNames()获得参数保存在textElement
④
检测令牌是否合法,并清空令牌值。判断令牌是否合法 如果Session中保存有令牌并且在提交的请求中令牌和Session中的令牌相等的话,返回true
如果Request中没有Session对象,返回false 如果session中没有token,返回false
如果session中的token和请求中的token不一致,返回false
⑤
合成模板:
1、page的type是string类型且page的content不为空,则利用velocity根据content初始化模板
否则解析模板名字,查询模板缓存,若不存在则利用velocity初始化模板
2、将form中resultMap、创建上下文所需的全局工具⑥、session、request、errors加载到上下文
3、执行velocity模板合成DefaultPageVender:mergeTemplate
⑥
创建上下文所需全局工具:HtmlUtil、CommUtil、TagUtil、i18n、lang、html、AUTH、ROLE等,见PageVenderSupport:createUtilContext方法。