由于struts2、hibernate通过默认配置文件不支持通配符配置,所以下面介绍一下servlet基于spring通配符读取器读取xml的扩展功能。
<!-- 自定义配置文件包路径,可配置多个不同的参数和路径 -->
<context-param>
<param-name>projectPackageName</param-name>
<param-value>com/test/web/*/</param-value>
</context-param>
public class ApplicationListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent servletContext) {
String projectPackageName = servletContext.getInitParameter("projectPackageName");
String classpath = "classpath*:" + projectPackageName + "**" + configName;
Resource[] resources = this.resolver.getResources(classpath);
List configs = new ArrayList();
for (Resource resource : resources){
String file = resource.getURL().getPath();
configs.add(config);
}
//configs可放在全局静态变量中
}
}
1.struts2解析xml扩展点
<!-- configProviders:该参数表示自定义的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,并将这些类名设置成configProviders属性值。若果有多个ConfigurationProvider类,中间用逗号(,)分隔。-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>configProviders</param-name>
<param-value>
com.test.web.ActionConfigProvider
</param-value>
</init-param>
</filter>
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.util.ResourceUtils;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
public class ActionConfigProvider extends XmlConfigurationProvider {
private static Logger logger = Logger.getLogger(ActionConfigProvider.class);
public ActionConfigProvider() {
super();
Map<String, String> mappings = new HashMap<String, String>();
mappings.put("-//OpenSymphony Group//XWork 2.1.3//EN", "xwork-2.3.dtd");
mappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.3//EN", "struts-2.3.dtd");
setDtdMappings(mappings);
}
@Override
protected Iterator<URL> getConfigurationUrls(String fileName) throws IOException {
List<URL> urls = new ArrayList<URL>();
//假设moduleConfigs是静态变量configs中取出已经被扫描到的struts相关的配置文件List
for (String s : moduleConfigs) {
urls.add(ResourceUtils.getURL("classpath:" + s));
}
return urls.iterator();
}
}
2.hibernate解析xml扩展点
<!-- 自定义的xml处理器 -->
<bean id="mappingAutowiring" class="com.test.web.framework.context.MappingAutowiring">
<property name="mappingResources" ref="mappingResources" />
</bean>
<bean id="mappingResources" class="com.test.web.framework.context.MappingFactoryBean" />
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
public class MappingAutowiring implements BeanPostProcessor {
private static Logger log = Logger.getLogger(MappingAutowiring.class);
private String[] mappingResources;
public void setMappingResources(String[] mappingResources) {
this.mappingResources = mappingResources;
}
//IOC实例化每个对象时都会经过此方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LocalSessionFactoryBean) {
((LocalSessionFactoryBean) bean).setMappingResources(this.mappingResources);
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.FactoryBean;
@SuppressWarnings("rawtypes")
public class MappingFactoryBean implements FactoryBean {
private static Logger log = Logger.getLogger(MappingFactoryBean.class);
@SuppressWarnings("unchecked")
public Object getObject() throws Exception {
//假设moduleConfigs是静态变量configs中取出已经被扫描到的hibernate相关的配置文件List
//将List moduleConfigs转为数组返回
return array;
}
public Class<?> getObjectType() {
return String[].class;
}
public boolean isSingleton() {
return true;
}
}
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--<property name="configLocation" value="classpath:hibernate.cfg.xml"/> 这个属性值可不写,被上述类处理过程结果取代-->
</bean>
3.spring解析xml扩展点
<!--返回在web.xml 中参数contextClass自定义类对应的对象这个类,这个类实现了XmlWebApplicationContext。-->
<!--XmlWebApplicationContext继承了AbstractRefreshableWebApplicationContext类中定义的方法protected String[] getConfigLocations(),这个方法默认可以加载contextConfigLocation中定义的xml 文件,如果你重写了这个方法还可以在任意地方加载你想要的xml文件。-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/applicationContext.xml</param-value><!-- 可直接写通配符 -->
</context-param>
<context-param>
<param-name>contextClass</param-name>
<param-value>
com.test.web.framework.context.BeansContext
</param-value>
</context-param>
import java.net.URL;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.web.context.support.XmlWebApplicationContext;
public class BeansContext extends XmlWebApplicationContext {
private static Logger log = Logger.getLogger(BeansContext.class);
private static final String CLASS_PATH_PREFIX = "classpath:";
public String[] getConfigLocations() {
//假设moduleConfigs是静态变量configs中取出已经被扫描到的spring相关的配置文件List
String[] defaultConfigs = super.getConfigLocations();//XmlWebApplicationContext读取默认的contextConfigLocation配置文件
//将moduleConfigs和defaultConfigs数组合并返回。
return locations;
}
protected String[] getDefaultConfigLocations() {
return new String[0];
}
}
分享到:
相关推荐
Jupyter-Notebook
Jupyter-Notebook
高效甘特图模板下载-精心整理.zip
lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance
OpenGL调试工具,适合图形开发者,包括视频开发,播放器开始以及游戏开发者。
全国行政区划shp最新图.zip
全国研究生招生与在校数据+国家线-最新.zip
Jupyter-Notebook
直播电商交流平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本
2000-2020年沪深A股上市公司融资约束程度SA指数-最新数据发布.zip
PPT模版资料,PPT模版资料
CPA注会考试最新教材资料-最新发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文提供了一个完整的职工管理系统的C++源代码。通过面向对象的编程方法,实现了包括创建新职工、查询、增加、修改、删除、排序、统计以及存储和恢复职工数据在内的多个基本操作功能。该系统支持不同的用户角色(如管理员与老板),并通过菜单驱动方式让用户方便地进行相关操作。此外,还包括了错误检测机制,确保操作过程中的异常得到及时处理。 适合人群:有一定C++语言基础,特别是面向对象编程经验的程序员;企业管理人员和技术开发人员。 使用场景及目标:适用于中小型企业内部的人力资源管理部门或IT部门,用于维护员工基本信息数据库,提高工作效率。通过本项目的学习可以加深对链表、类和对象的理解。 阅读建议:建议先熟悉C++的基本语法和面向对象概念,再深入学习代码的具体实现细节。对于关键函数,比如exchange、creatilist等,应当重点关注并动手实践以加强理解。
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
Huawei-HKUST Joint Workshop on Theory for Future Wireless 15-16 September 2022 华为-香港科技大学未来无线理论联合研讨会 Speaker:Jingwen Tong
演出人员与观众疫情信息管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本.pdf