Struts2框架流程详细分析
- 格式:doc
- 大小:829.00 KB
- 文档页数:32
/topic/128973struts2表单标签1、struts资源文件中文解决方法在命令行中输入以下命令native2ascii -encoding gb2312 ApplicationResources.properties ApplicationResourcesgbk.properties第一个文件为资源文件,第二个为新生成的文件,将新生成的文件拷入工程就可以了2、开发struts2流程1.创建web工程2.拷贝commons-fileupload-1.2.1.jar,commons-logging-1.0.4.jar,freemarker-2.3.13.jar,ognl-2.6.11.jar,struts2-core-2.1.6.jar,xwork-2.1.2.jar,放入web-inf--lib中3.在web.xml文件中添加struts2的核心Filter,过滤客户端发送过来的请求,代码如下<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>org.apache.struts2.dispatcher.FilterDispatcher为struts2中提供的一个控制器4.创建struts.xml文件,放在src目录下.代码如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="strutsqs" extends="struts-default"></package></struts>5.在src目录下创建一个类,创建几个属性及对应的get,set方法6.创建public String execute() throws Exception方法,7.在struts.xml文件中添加如下代码:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="strutsqs" extends="struts-default"><action name="login" class="ers.action.LoginAction"><result name="success">/Main.jsp</result><result name="failed">/Login.jsp</result></action></package></struts>3、创建拦截器:1.创建类继承AbstractInterceptor,覆盖intercept方法,代码如下public String intercept(ActionInvocation invocation) throws Exception {LoginAction action=(LoginAction)invocation.getAction();String result=invocation.invoke();return null;}2.在struts.xml文件中配置如下<package name="strutsqs" extends="struts-default"><interceptors><interceptor name="myInterceptor" class="ers.interceptor.LoginInterceptor"> <param name="name">简单拦截器</param></interceptor></interceptors><action name="login" class="ers.action.LoginAction"><result name="success">/Main.jsp</result><result name="failed">/Login.jsp</result><result name="input">/Login.jsp</result><interceptor-ref name="myInterceptor"></interceptor-ref></action></package>也可以创建拦截器栈<interceptors><interceptor name="myinterceptor1"class="com.haitian.bbs.interceptor.MyInterceptor"></interceptor> <interceptor name="myinterceptor2"class="com.haitian.bbs.interceptor.MyInterceptor2"></interceptor> <interceptor-stack name="stack1"><interceptor-ref name="myinterceptor2"></interceptor-ref><interceptor-ref name="myinterceptor1"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors>4.标签中引用资源文件内容<s:textfield name="age" key="regist.age" value="%{getText('regist.password')}"></s:textfield><s:select list=”#{‘1’:getText(‘sex.man’),’0’:getText(‘sex.women’)}”<s:text name=”bel”/>5.创建资源文件在src下创建messageResource_zh_CN.properties文件在src下创建struts.properties文件,添加struts.custom.i18n.resources=messageResource_zh_CN 6.Action中访问servlet APIActionContext ctx=ActionContext.getContext();ctx.getApplication()获得application对象ctx.put(“”,””);//相当于request.setAttribute(“”,””);ctx.getSession()//获得session对象get(Object key);//类似于调用HttpServletRequest的getAttribute(String name);方法Map getApplication();返回一个Map对象,该对象模拟了应该的ServletContext实例Map getSession();返回一个Map对象,该Map对象模拟了HttmpSession实例Map getParameters();获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap方法Void setSession(Map session);直接传入一个Map实例,将实例里的key-value对转换成session的属性名\属性值HttpServletRequest request=ServletActionContext.getRequest();7.Action访问资源文件Action 继承ActionSupport调用this.getText(“ername”);Jsp访问资源文件<s:text name=”bel”/>8.资源文件_各国代码资源文件命名格式:baseName_language_country.propertiesLocale[] localeList=Locale.getAvailableLocales();for(int i=0;i<localeList.length;i++){System.out.println(localeList[i].getDisplayCountry()+”=”+localeList[i].getCountry()+””+localeList[i ].getDisplayLanguage()+”=”+localeList[i].getLanguage());}9.将struts.xml分开在struts.xml中添加如下代码,将其它配置文件导入<struts><include file=”struts-part1.xml”/>..</struts>被包含的配置文件是标准的struts2配置文件,一样包含dtd 信息、strut2配置文件的根元素,此时struts.xml文件中不能再定义action10全局结果result<global-results><result name="">/te.jsp</result></global-results>11模型驱动1创建一个JavaBean,生成setter,getter方法2创建action类实现ModelDriven接口12.创建拦截器1创建类继承AbstractInterceptor,覆盖intercept(ActionInvocation invocation)方法2. ActionContext ac=arg0.getInvocationContext();Map session=ac.getSession();获得session对象Object obj=session.get(“CURRENTUSERBEAN”);//获得session中是否存在此对象If(obj==null)没有登陆过Return “login”;ElseReturn invocation.invoke();3.LoginAction la=(LoginAction)invocation.getAction();获得被拦截的Action 实例4.String result=invocation.invoke();调用execute方法,将拦截方法返回的字符串做为拦截器的返回值或者返回其它字符串,此字符串与struts.xml文件中的result标签中的结果对应。
配置ActionStruts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。
该方法如下:public String execute() throws ExceptionStruts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:public String xxx()在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。
开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。
1.Action映射:action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
action元素的完整属性表例如:<action name="user" class="erAction"><result name="success">/user.jsp</result></action>2. 使用method属性在配置action时,我们可以通过action元素的method属性来指定action调用的方法,所指定的方法,必须遵循与execute方法相同的格式。
Struts2入门初步需掌握1.struts2概述2.struts2环境搭建(第一个struts2的应用程序)3.struts.xml文件配置详解4.struts2请求的URL的搜索路径的顺序概述5.struts2工作原理概述6.struts2指定多个配置文件7.struts2动态方法调用8.使用通配符定义action一:简介Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
二:环境搭建搭建Struts2环境时,我们一般需要做以下几个步骤的工作:1.找到开发Struts2应用需要使用到的jar文件.下载官网:/download.cgi#struts221解压后:开始学习使用依赖的最基本的jar 包2:编写Struts2的配置文件解压其中一个案例在此目录下找到struts.xml 文件先拷贝到项目的src 下。
再对起进行修改。
删除剩余如下代码:[html]01.<?xml version ="1.0"encoding ="UTF-8" ?> 02.<!DOCTYPE struts PUBLIC 03."-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN" 04."/dtds/struts-2.3.dtd"> 05.06.<struts> 07.08. </struts>无法加载插件。
struts2.Struts2课件1Mvc与servlet1.1 Servlet的优点1、是mvc的基础,其他的框架⽐如struts1,struts2,webwork都是从servlet基础上发展过来的。
所以掌握servlet是掌握mvc的关键。
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。
3、程序员可以对servlet进⾏封装。
Struts2就是从servlet中封装以后得到的结果。
4、市场上任何⼀个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运⾏机制很关键。
1.2 Servlet的缺点1、每写⼀个servlet在web.xml中都要做相应的配置。
如果有多很servlet,会导致web.xml内容过于繁多。
2、这样的结构不利于分组开发。
3、在servlet中,doGet⽅法和doPost⽅法有HttpServletRequest和HttpServletResponse参数。
这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。
4、如果⼀个servlet中有很多个⽅法,则必须采⽤传递参数的形式,分解到每⼀个⽅法中。
2重构servlet针对servlet以上的特点,我们可以对servlet进⾏重构,使其开发起来更简单。
更容易,更适合团队协作。
重构的⽬标:1、只写⼀个serlvet或者过滤器,我们这⾥选择过滤器。
2、不⽤再写任何的servlet,这样在web.xml中写的代码就很少了。
3、原来需要写serlvet,现在改写action。
4、在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。
5、在过滤器中通过java的反射机制调⽤action。
6、详细过程参照cn.itcast.action包中的内容3Struts2介绍1、struts2是apache组织发明的开源框架。
1.1通过代码实例跟我学Struts2框架从入门到精通——在Struts2框架中实现国际化的Web应用实例(第2部分)1.1.1体验三种不同形式的资源文件加载的顺序1、系统加载的顺序首先以“类文件”为优先,其次为“包”文件、最后才是“全局”资源文件。
2、如果在三种资源文件中都没有提供对应的Key的提示信息resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success.noexist");将出现下面的“错误”(没有显示正确的提示信息)。
3、如果在三种资源文件中都提供有相同的Key但不同的提示信息——能够区分加载的顺序(1)在Action类范围内的资源文件中的提示信息为strutsweb.login.success=\u767B\u9646\u6210\u529F\uFF08\u5728Action\u7C7B\u8303\u56F4\u FF09strutsweb.login.success=登陆成功(在Action类范围)(2)在包资源文件中页提供相同的key的提示信息strutsweb.login.success=\u767B\u9646\u6210\u529F\uFF08\u5728Action\u7C7B\u8303\u56F4\u FF09strutsweb.login.success=登陆成功(在包范围内的信息)(3)在全局资源文件中提供相同的key的提示信息strutsweb.login.success=\u767B\u9646\u6210\u529F\uFF08\u5728Action\u7C7B\u8303\u56F4\u FF09strutsweb.login.success=登陆成功(在全局范围内的资源信息)(4)测试因此,以类资源文件为优先。
(5)再删除类资源文件中的下面的信息strutsweb.login.success=\u767B\u9646\u6210\u529F\uFF08\u5728Action\u7C7B\u8303\u56 F4\uFF09因此,其次是以包资源文件。
struts2 s2-048原理一、概述Struts2 S2-048是Struts2框架中常见的一个错误码,主要涉及到Action 的执行过程。
该错误的出现通常意味着Struts2在处理请求时出现了问题,需要进行深入的分析和排查。
二、原理介绍1. Action执行流程:当一个请求到达Struts2框架时,首先会进行相应的验证和过滤,然后将其传递给相应的Action。
Action是Struts2的核心组件之一,负责处理业务逻辑并返回结果。
在默认情况下,Struts2会按照配置文件中定义的流程来执行Action,即遵循execute()方法的返回值来确定后续的处理。
2. S2-048出现原因:S2-048错误的出现通常是由于Action的execute()方法返回了一个未被定义的异常类型,或者返回了null,导致Struts2的执行流程出现了异常。
此外,配置文件中的错误配置也可能导致该错误的出现。
3. 排查方法:出现S2-048错误时,首先要查看具体的错误信息,了解错误的详细情况。
然后,可以通过检查Action的代码和配置文件,找出可能的问题所在。
常见的排查方法包括查看日志、跟踪请求流转、对比正常情况下的行为等。
三、示例分析以下是一个可能出现S2-048错误的示例代码:Action类:```javapublic class MyAction extends ActionSupport {private String myVariable;public String execute() {try {// some business logic herethrow new Exception("Some business exception");} catch (Exception e) {// handle exception and return null or other result typereturn null;}}}```在上述代码中,execute()方法中抛出了一个异常,但并没有定义该异常的类型,导致Struts2在处理请求时出现了S2-048错误。
基于Struts 2框架的数字化学习资源服务平台的设计与实现摘要:远程教育过程中数字化学习资源不断增加,原有的资源服务模式和平台已无法满足要求,既浪费存储空间又容易导致出错,迫切需要高效的数字化学习资源服务平台。
介绍了MVC思想和Struts2基本体系,对数字化学习资源服务平台进行设计,基于Struts2框架开发了数字化学习资源服务平台,通过系统分层设计达到松散耦合,提高了系统可维护性和可扩展性。
关键词:MVC Struts2;数字化学习资源;数字化学习资源服务平台;远程教育1MVC思想与Struts2框架MVC是Model-View-Controller的简称,是一种设计模式。
MVC 思想是将一个应用分为三部分:Model(模型)、View(视图)和Controller(控制器),这三个部分实现了功能模块和显示模块的分离,以最少的耦合协同工作,提高应用的可扩展性和可维护性。
1.1Struts2框架Struts2是以WebWork优秀的设计思想为核心,吸收Struts1的部分优点建立的一个MVC框架,Struts2应用框架是一种基于MVC设计模式的优秀应用框架。
Struts2体系如图1所示。
Struts2框架主要由三部分组成:核心控制器FilterDispatcher,业务控制器和业务逻辑组件。
(1)核心控制器FilterDispatcher。
该控制器作为一个Filter运行在Web应用中,负责拦截所有用户请求,如果用户请求以action结尾,请求将被转入Struts2框架处理。
(2)业务控制器。
业务控制器是用户实现Action类的实例,该类中包含一个excute方法,当处理完用户请求后,根据处理结果不同,excute方法返回不同字符串,每个字符串对应一个视图名。
(3)模型组件。
Java应用中的模型组件通常指系统的业务逻辑组件,用户请求最终由模型组件负责处理。
Struts2框架的大概处理流程为:①浏览器发送请求;②核心控制器FilterDispatcher根据请求决定调用合适的Action;③拦截器链自动对请求应用通用功能;④调用Action的excute方法,该方法获取请求参数,执行数据库操作;⑤Action的excute方法处理结果输出到浏览器中,既支持JSP也支持FreeMarker、Velocity等。
Sturuts2第一节、Struts2介绍Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
Struts2对Struts1进行了巨大的改进。
主要表现在如下几个方面: 在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO。
线程模型方面:Struts1的Action是单实例的,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。
这使程序难于测试。
Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
绑定值到视图技术:Struts1使用标准的JSP,Struts2使用"ValueStack"技术。
struts框架详细介绍Struts是一个开源的Java Web应用程序开发框架,可以帮助开发者构建可扩展的、高性能的Web应用程序。
它遵循了Model-View-Controller(MVC)设计模式,通过将业务逻辑、表示逻辑和用户交互进行分离,使得应用程序更易于开发、测试和维护。
下面是关于Struts框架的详细介绍。
1.MVC设计模式:Struts采用了MVC设计模式,将应用程序的不同组成部分进行分离。
- Model层负责处理数据和业务逻辑。
在Struts中,开发者可以使用JavaBean、EJB、Hibernate等技术作为Model层的实现。
- View层负责展示数据和用户界面。
Struts提供了JSP(JavaServer Pages)作为主要的View技术,也可以使用Velocity、Freemarker等模板引擎。
- Controller层负责接收用户请求、处理业务逻辑以及将结果返回给View层。
Struts的Controller层使用ActionServlet来处理请求,它根据配置文件中的映射规则将请求转发给合适的Action类进行处理。
2.核心组件:Struts由以下几个核心组件组成:- ActionServlet:负责接收和处理来自客户端的请求,并根据配置文件中的映射规则将请求转发给合适的Action类进行处理。
- Action类:实现了业务逻辑的处理,接收请求和返回结果。
开发者需要继承Action类,并覆写其中的execute(方法来实现自定义的业务逻辑。
- ActionForm:用于封装请求参数并传递给Action类进行处理。
ActionForm可以与表单元素进行绑定,从而方便地获取和验证用户输入。
- ActionMapping:配置文件中的一项规则,用于将请求URL映射到具体的Action类和方法。
- ActionForward:配置文件中的一项规则,用于指定请求处理完成后需要跳转到的页面。
StrutsPrepareAndExecuteFilter实现了Filter接口 init方法为初始化入口 StrutsPrepareAndExecuteFilter init方法 1. public void init(FilterConfig filterConfig) throws ServletException { 2. //初始化辅助类 类似一个Delegate 3. InitOperations init = new InitOperations(); 4. try { 5. // FilterHostConfig 封装了FilterConfig参数对象 6. FilterHostConfig config = new FilterHostConfig(filterConfig); 7. //LoggerFactory配置加载 8. //如果没有web.xml 没有配置“loggerFactory”参数 尝试org.apache.commons.logging.LogFactory 9. //如果失败 使用JdkLoggerFactory 10. //TODO SPI 11. init.initLogging(config); 12. //TODO 创建Dispatcher 注册加载器 执行加载器 创建容器 解析xml 13. Dispatcher dispatcher = init.initDispatcher(config); 14. init.initStaticContentLoader(config, dispatcher); 15. //预处理类 请求处理时才会真正用到 16. //1.主要负责在每次请求 创建ActionContext 清除ActionContext 17. //2.当接收到一个请求时 通过uri查找 ActionConfig 创建ActionMapping 18. prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); //处理请求 Delegate 19. execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); 20. //空实现 留作扩展 21. postInit(dispatcher, filterConfig); 22. } finally { 23. init.cleanup(); 24. } 25. }
InitOperations 类似与一个Delegate 主要负责实例化Dispatche 再把初始化操作转交给Dispatche init处理 1. public Dispatcher initDispatcher( HostConfig filterConfig ) { 2. //创建Dispatcher 3. Dispatcher dispatcher = createDispatcher(filterConfig); 4. //核心方法 Container容器的创建 xml解析在此方法发生 5. dispatcher.init(); 6. return dispatcher; 7. } 8. 9. private Dispatcher createDispatcher( HostConfig filterConfig ) { 10. Map params = new HashMap(); 11. for ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext(); ) {
12. String name = (String) e.next(); 13. String value = filterConfig.getInitParameter(name); 14. params.put(name, value); 15. } 16. return new Dispatcher(filterConfig.getServletContext(), params); 17. } Dispatcher init方法 1.针对配置文件 注册不同的加载器 保存到ConfigurationManager类中的一个变量中 2.创建容器 解析xml 1. public void init() { 2. //创建配置操作管理类 , 会保存元素加载器 3. if (configurationManager == null) { 4. configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME); 5. } 6. try { 7. /**初始化各种形式加载器,保存到ConfigurationManager#containerProviders Map集合中 8. 没有真正执行加载 解析逻辑*/ 9. //org/apache/struts2/default.properties属性文件 里面定义了一系列struts常量 10. init_DefaultProperties(); // [1] 11. //web.xml配置的 config参数 [配置多个用","分开] 12. //如果没有该参数 默认为 struts-default.xml[框架级],struts-plugin.xml[框架级],struts.xml[系统级别] 13. //根据文件名称 创建加载器 加载xml主要有一下两个解析器 14. //XmlConfigurationProvider[xwork.xml], 15. //StrutsXmlConfigurationProvider[struts相关配置文件]配置元素加载器 16. init_TraditionalXmlConfigurations(); // [2] 17. //struts.locale 注册 18. init_LegacyStrutsProperties(); // [3] 19. //实例化 我们自定义的加载器 保存到containerProviders集合中 20. // web.xml configProviders参数 多个用","分开 21. //配置器必须是ConfigurationProvider接口的实例 22. //TODO SPI 23. init_CustomConfigurationProviders(); // [5] 24. //web.xml配置的init-param参数 加载器 最终会保存到Container容器中 25. init_FilterInitParameters() ; // [6] 26. //TODO 根据我们在struts.xml定义的 常量 选择插件类 27. //比如集成spring 会用到org.apache.struts2.spring.StrutsSpringObjectFactory 28. init_AliasStandardObjects() ; // [7] 29. /** 执行加载器 */ 30. //TODO 创建容器 解析xml 真正执行加载器方法 31. Container container = init_PreloadConfiguration(); 32. //执行当前Dispatcher对象 依赖关系注入 33. container.inject(this); 34. //额外动作 35. init_CheckConfigurationReloading(container); 36. init_CheckWebLogicWorkaround(container); 37. } catch (Exception ex) { 38. if (LOG.isErrorEnabled()) 39. LOG.error("Dispatcher initialization failed", ex); 40. throw new StrutsException(ex); 41. } 42. } ConfigurationManager 主要管理 创建的各种加载器 1. public class ConfigurationManager { 2. protected static final Logger LOG = LoggerFactory.getLogger(ConfigurationManager.class); 3. //配置元素管理器 4. protected Configuration configuration; 5. protected Lock providerLock = new ReentrantLock(); 6. //创建的xml加载器会保存到次集合中 7. private List containerProviders = new CopyOnWriteArrayList(); }
Dispatcher的 createConfigurationManager方法 1. protected ConfigurationManager createConfigurationManager(String name) { 2. //name - > struts 3. return new ConfigurationManager(name); 4. }
1.default.properties 属性文件加载器 1. private void init_DefaultProperties() { 2. //保存到ConfigurationManager加载器集合中 3. configurationManager.addConfigurationProvider(new DefaultPropertiesProvider()); 4. }
2.创建struts相关文件加载器 StrutsXmlConfigurationProvider 1. private void init_TraditionalXmlConfigurations() { 2. //web.xml 配置的config 3. String configPaths = initParams.get("config"); 4. if (configPaths == null) { 5. //如果没有配置 默认 struts-default.xml,struts-plugin.xml,struts.xml 6. configPaths = DEFAULT_CONFIGURATION_PATHS; 7. } 8. String[] files = configPaths.split("\\s*[,]\\s*"); 9. for (String file : files) { 10. if (file.endsWith(".xml")) { 11. if ("xwork.xml".equals(file)) { 12. configurationManager.addConfigurationProvider(createXmlConfigurationProvider(file, false)); 13. } else { 14. //struts xml加载器 15. //StrutsXmlConfigurationProvider 16. configurationManager.addConfigurationProvider(createStrutsXmlConfigurationProvider(file, false, servletContext)); 17. } 18. } else { 19. throw new IllegalArgumentException("Invalid configuration file name"); 20. } 21. } 22. } 23. protected XmlConfigurationProvider createXmlConfigurationProvider(String filename, boolean errorIfMissing) { 24. return new XmlConfigurationProvider(filename, errorIfMissing); 25. } 26. protected XmlConfigurationProvider createStrutsXmlConfigurationProvider(String filename, boolean errorIfMissing, ServletContext ctx) { 27. return new StrutsXmlConfigurationProvider(filename, errorIfMissing, ctx); 28. }