相信大家在做项目的时候都遇到一个问题就是配置文件,模块越多配置的Action也会因此增加很多,所以有的开发人员采用了Struts提供的include标签在一个xml文件引入许多其他模块的配置文件,但是在用SVN的时候,团队中开发也不是很方便,有的人员采用配置config参数,但是哪么多配置文件也是个麻烦问题。要想Struts像Spring一样通过表达式来加载配置文件,是可以的,下面贴上源码:
package com.dt.his.webcnter.util;
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.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.util.location.LocatableProperties;
public class CutomConfigurationProvider extends XmlConfigurationProvider {
//需要解析加载的文件路径
private static final String FILE_PATTERN = "classpath*:config/**/struts_*.xml";
public CutomConfigurationProvider() {
Map<String, String> mappings = new HashMap<String, String>();
mappings.put("-//OpenSymphony Group//XWork 2.1.3//EN",
"xwork-2.1.3.dtd");
mappings.put("-//OpenSymphony Group//XWork 2.1//EN", "xwork-2.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 2.0//EN", "xwork-2.0.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.1.1//EN",
"xwork-1.1.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.1//EN", "xwork-1.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.0//EN", "xwork-1.0.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN",
"struts-2.0.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN",
"struts-2.1.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN",
"struts-2.1.7.dtd");
setDtdMappings(mappings);
}
/**
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.ContainerProvider#needsReload()
*/
@Override
public boolean needsReload() {
return true;
}
/*
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.ContainerProvider#register(com.opensymphony.xwork2.inject.ContainerBuilder,
* com.opensymphony.xwork2.util.location.LocatableProperties)
*/
@Override
public void register(ContainerBuilder containerBuilder,
LocatableProperties props) throws ConfigurationException {
super.register(containerBuilder, props);
}
/*
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.PackageProvider#loadPackages()
*/
@Override
public void loadPackages() throws ConfigurationException {
super.loadPackages();
}
@Override
protected Iterator<URL> getConfigurationUrls(String fileName)
throws IOException {
List<URL> urls = new ArrayList<URL>();
Resource[] resources = getAllResourcesUrl();
for (Resource resource : resources) {
urls.add(resource.getURL());
}
return urls.iterator();
}
/**
* 获取系统中需要搜寻的struts的配置
*
* @return
* @throws IOException
*/
private Resource[] getAllResourcesUrl() {
ResourcePatternResolver resoler = new PathMatchingResourcePatternResolver();
try {
return resoler.getResources(FILE_PATTERN);
} catch (IOException e) {
e.printStackTrace();
}
return new Resource[0];
}
}
在web.xml中配置如下:
<!-- 配置Struts过滤器 -->
<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.dt.his.webcnter.util.CutomConfigurationProvider
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分享到:
相关推荐
处理大文件时,需要考虑内存管理,避免一次性加载整个文件到内存。`Commons FileUpload`库默认会将文件存储在内存中,对于大文件可能会导致内存溢出。可以通过`DiskFileItemFactory`配置临时存储路径,使文件在磁盘...
2. **文件队列管理**:选择的文件会被添加到一个内部队列中,然后按照指定的顺序逐个上传,避免一次性加载大量文件导致的内存问题。 3. **分块上传**:对于大文件,SwfUpload可能支持分块上传,即将大文件分割成小...
此外,为了优化用户体验,你还可以考虑使用流式下载,避免一次性加载整个文件到内存。这在处理大文件时尤为重要。 在实际开发中,还要注意安全性问题,比如防止恶意文件上传,避免路径遍历攻击,以及对下载的文件...
- **性能优化**:对于大数据量的报表,可以考虑分页处理,避免一次性加载大量数据导致内存溢出。 - **错误处理**:在Action中添加异常处理代码,以处理可能出现的报表加载、数据填充或导出过程中的错误。 总的来说...
2. **内存溢出**:大文件上传可能导致内存溢出,可使用流式处理避免一次性加载整个文件到内存。 3. **文件安全**:确保上传的文件类型和大小符合预期,防止恶意文件上传,如脚本注入攻击。 4. **文件重命名**:为...
- **ActionServlet**:作为控制器接收请求,并根据配置文件(struts-config.xml)找到对应的Action。 - **ActionMapping**:配置文件中定义的Action映射,用于确定哪个Action处理特定的请求。 - **ActionForm**:...
为了确保导出过程的性能,通常会使用流式处理,避免一次性加载所有数据到内存。 在实际的代码实现中,可能包含以下几个步骤: 1. 创建Struts2 Action,定义一个导出方法,接收必要的参数。 2. 在Action的导出方法中...
分页功能的实现涉及到报表的内存优化,因为大数据量的报表一次性加载可能会消耗大量内存。JasperReport提供了一些参数来控制分页,例如设置批处理大小,只加载当前页的数据。在Action类中,我们可以根据用户的请求...
- **Action类**:Action是Struts2的核心组件之一,负责处理用户的请求。本节将详细讲解Action类的设计原则和实现方法。 - **配置文件**:struts.xml用于配置Action的映射关系以及其他一些设置。本节将详细介绍如何...
- 为了提高性能,可以考虑使用内存映射文件或分批次处理大文件,避免一次性加载整个文件到内存。 通过上述步骤,开发者可以在 Struts2 应用中轻松实现导入和导出 Excel 功能,使得数据交换变得更加便捷,尤其是在...
在Web容器启动阶段,Struts2会自动加载配置文件,这些文件包含了框架运行所需的关键参数,包括ConfigurationManager、ActionMapper和ObjectFactory等配置信息。ConfigurationManager存储了配置文件的基本信息,而...
只在用户展开节点时加载相应的子节点,而不是一次性加载所有数据。 7. **权限控制**:根据用户角色和权限控制树节点的显示和操作。这可以通过Struts2的拦截器或者在Action中实现。 在实际开发中,MyEclipse5.5可以...
2. Struts2的FilterDispatcher(或者说是StrutsPrepareAndExecuteFilter)拦截请求,根据struts.xml配置文件找到对应的Action。 3. 拦截器链开始执行,每个拦截器按照配置的顺序执行。 4. 当所有拦截器执行完毕后,...
这通常通过在查询时添加LIMIT和OFFSET子句来实现,限制每次加载的数据量,避免一次性加载过多记录导致性能下降。 7. **users.sql**:这个文件很可能是数据库脚本,包含了初始化用户表的SQL命令,用于创建数据库结构...
- **性能优化**: 对于大量数据,考虑分批处理或延迟计算,避免一次性加载所有数据到内存。 - **模板设计**: 可以使用预先设计好的Excel模板,只替换数据部分,提高效率和一致性。 - **异常处理**: 不要忘记捕获和...
在Web应用中,分页是提高用户体验的关键,它允许用户逐页浏览大量的数据,而不是一次性加载所有内容。在Struts2中,我们可以利用Interceptor(拦截器)和Result(结果类型)来实现。通常,我们会创建一个拦截器来...
客户端分页是在浏览器端处理,所有数据一次性加载到客户端,然后通过JQGrid的API实现分页效果;而服务器端分页则是在每次用户切换页码时,向服务器发送请求获取对应页的数据,这样可以减少内存占用和提高页面加载...
控制`struts.xml`配置文件是否在运行时自动重新加载。默认为`false`,但在开发环境下,可能希望设置为`true`,以便于实时更新配置。 #### 二十五、`struts.velocity.configfile` 指定Velocity引擎的配置文件路径。...
在Web开发中,分页是一种常见的需求,它帮助用户更有效地浏览大量的数据,而不是一次性加载所有内容。Struts通过Action类和配置文件(struts-config.xml)来实现这一功能。Action类是业务逻辑的入口,它接收HTTP请求,...
4. **分页原理**:分页是为了解决大量数据一次性加载导致性能下降和用户体验不佳的问题。通常包括两个参数:当前页码和每页记录数。在SSH框架中,我们可以在Action中计算总页数,然后通过Hibernate的Criteria或HQL...