Structs框架原理案例详解 Java( 二 )
getInitParameterNames是这个类的核心 , 主要功能就是将Filter初始化参数名称有枚举类型转化为Iterator 。
接下来 , 看下StrutsPrepareAndExecuteFilter中init方法中dispatcher = init.initDispatcher(config);这是初始化dispatcher的 , 是通过init对象的initDispatcher方法来初始化的 , init是InitOperations类的对象 , 我们看看InitOperations中initDispatcher方法:
public Dispatcher initDispatcher( HostConfig filterConfig ) {Dispatcher dispatcher = createDispatcher(filterConfig);dispatcher.init();return dispatcher;}
创建Dispatcher 会读取filterConfig(核心过滤器中最下面以一个)中的配置信息 , 将配置信息解析出来 , 封装成为一个Map,然后根据上下文和参数Map构建Dispatcher(见源文件Struts2的核心包 , 最重要的类都放在该包中)
private Dispatcher createDispatcher( HostConfig filterConfig ) {//存放参数的MapMap<String, String> params = new HashMap<String, String>();//将参数存放到Mapfor ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext(); ) {String name = (String) e.next();String value = https://www.yf-zs.com/redian/filterConfig.getInitParameter(name);params.put(name, value);}//根据servlet上下文和参数Map构造Dispatcherreturn new Dispatcher(filterConfig.getServletContext(), params);}
dispatcher对象创建完成 , 接着就是dispatchar对象的初始化 , 打开Dispatcher类 , 看到它的init方法如下:
public void init() {if (configurationManager == null) {configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);}try {init_FileManager();//加载org/apache/struts2/default.propertiesinit_DefaultProperties(); // [1]//加载struts-default.xml,struts-plugin.xml,struts.xmlinit_TraditionalXmlConfigurations(); // [2]init_LegacyStrutsProperties(); // [3]//用户自己实现的ConfigurationProviders类init_CustomConfigurationProviders(); // [5]//Filter的初始化参数init_FilterInitParameters() ; // [6]init_AliasStandardObjects() ; // [7]Container container = init_PreloadConfiguration();container.inject(this);init_CheckWebLogicWorkaround(container);if (!dispatcherListeners.isEmpty()) {for (DispatcherListener l : dispatcherListeners) {l.dispatcherInitialized(this);}}} catch (Exception ex) {if (LOG.isErrorEnabled())LOG.error("Dispatcher initialization failed", ex);throw new StrutsException(ex);}}
Structs请求过程源码分析参考链接http://www.cnblogs.com/liuling/p/2013-8-10-01.html
Structs 配置文件加载循序:
3 默认拦截器
struts-default.xml配置文件中定义了一个默认拦截器栈 , 这些拦截器就是动作方法执行之前的要执行的 。常用的有封装用户表单数据到javabean的modelDriven拦截器 , 用于输入验证的validation拦截器 , 等等
4 view和controller之间的交互
从视图页面每次发来的用户请求会产生一些数据 , 每次动作类执行之前 , 核心过滤器StrutsPrepareAndExecuteFilter都会创建两个对象:ActionContext和ValueStack,这两个对象储蓄了动作访问期间用到的所有数据 。这些数据又可以在JSP界面上通过stuct标签和OGNL表达式来取得 。
- ActionContext是一个map数据结构 , 其中的key是一些常见的域对象(application,session,request等) , 而value又是一个map 。也就是说ActionContext是一个大的map包裹着一些小map 。
- ValueStack是一个ArrayList数据结构 , 并且是一个栈结构 , 每次都在栈顶存取数据 。
C与M之间的交互比较简单 , 利用Structs框架提供的拦截器:ModelDriven,即可实现将用户表单提交的数据封装到对应的javabean中 。要点:
- javabean类自己编写 。
- 动作实现ModelDriven接口 。
- 实现抽象方法getModel() 。
