最近工程从Struts2.3.18升级Struts2.5.2导致相关联的插件都需要升级到相同版本,其中tiles的变化最大。

1、web.xml上

  • listener
org.apache.struts2.tiles.StrutsTilesListener
  • context-param
新增tiles资源位置定义参数:org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG

2、tiles.xml 资源声明改成使用value指定!!

由:
<definition name="web.standard.layout.witherror" template="layout.jsp">
<put-attribute name="header">header.jsp</put-attribute
</definition>
改为:
<definition name="web.standard.layout.witherror" template="layout.jsp">
<put-attribute name="header" value="header.jsp"></put-attribute
</definition>

3、默认会加载/WEB-INF/tiles.xml

这样tiles升级基本完成。


下面介绍自定义tiles资源搜索功能:

从org.apache.struts2.tiles.StrutsTilesInitializer源码:

  @Override
protected ApplicationContext createTilesApplicationContext(ApplicationContext preliminaryContext) {
ServletContext servletContext = (ServletContext) preliminaryContext.getContext(); if (servletContext.getInitParameter(DefinitionsFactory.DEFINITIONS_CONFIG) != null) {
LOG.trace("Found definitions config in web.xml, using standard Servlet support ....");
return new ServletApplicationContext(servletContext);
} else {
LOG.trace("Initializing Tiles wildcard support ...");
return new StrutsWildcardServletApplicationContext(servletContext);
}
}

上可得知当在web.xml上自定义了tiles的资源文件位置的话使用ServletApplicationContext进行资源文件的查找。但是一般工程都是使用通配符的形式或者使用spring的文件路径定义的方式配置文件,例如:

file:/WEB-INF/tiles.xml,classpath:/com/cml/test/*/resource/.tiles.xml

此时需要自己拓展了,使用spring的ResourcePatternResolver进行资源查找。

1、第一步,自定义listener

public class WildcardTilesListener extends AbstractTilesListener {

    private static final Logger LOG = LogManager.getLogger(WildcardTilesListener.class);

    @Override
protected TilesInitializer createTilesInitializer() {
LOG.info("Starting Struts Tiles 3 integration ...");
return new WildcardInitializer();
} }

2、第二步 自定义StrutsTilesInitializer

public class WildcardInitializer extends StrutsTilesInitializer {
private static final Logger LOG = LogManager.getLogger(WildcardInitializer.class); @Override
protected ApplicationContext createTilesApplicationContext(ApplicationContext preliminaryContext) {
ServletContext servletContext = (ServletContext) preliminaryContext.getContext();
return new WildcardApplicationContext(servletContext);
} @Override
protected AbstractTilesContainerFactory createContainerFactory(ApplicationContext context) {
LOG.trace("Creating dedicated Struts factory to create Tiles container");
return new StrutsTilesContainerFactory();
} }

将tiles文件搜索的ApplicationContext更改为自定义的WildcardApplicationContext

3、第三步 继承ServletApplicationContext实现通配符资源文件搜索

public class WildcardApplicationContext extends ServletApplicationContext {

    private static final Logger LOG = LogManager.getLogger(StrutsWildcardServletApplicationContext.class);

    private ServletContext context;

    public WildcardApplicationContext(ServletContext context) {
super(context);
this.context = context;
} public Collection<ApplicationResource> getResources(String path) {
Set<ApplicationResource> resources = new HashSet<>(); if (path.startsWith("/")) {
LOG.trace("Using ServletContext to load resource {}", path);
ApplicationResource resource = getResource(path);
if (resource != null) {
resources.add(resource);
}
} try {
resources.addAll(findResources(path));
} catch (IOException e) {
LOG.error("Cannot find resources for [{}]", path, e);
} return resources;
} public ApplicationResource getResource(ApplicationResource base, Locale locale) {
String localePath = base.getLocalePath(locale);
if (new File(localePath).exists()) {
try {
return new StrutsApplicationResource(URI.create("file://" + localePath).toURL());
} catch (MalformedURLException e) {
LOG.warn("Cannot access [{}]", localePath, e);
return null;
}
}
return null;
} protected Set<ApplicationResource> findResources(String path) throws IOException {
Set<ApplicationResource> resources = new HashSet<>(); LOG.trace("Using ResourceFinder to find matches for {}", path); Set<URL> matches = find(path); LOG.trace("Found resources {} matching pattern {}", matches, path); Iterator<URL> it = matches.iterator();
while (it.hasNext()) {
resources.add(new StrutsApplicationResource(it.next()));
} LOG.trace("Found resources {} for path {}", resources, path);
return resources;
} protected Set<URL> find(String patternResource) { Set<URL> pathResources = new HashSet<>(); try {
ResourcePatternResolver rpResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = rpResolver.getResources(patternResource);
// FileSystemResource ClasspathContextResource
for (Resource resource : resources) { URL resourceUrl = null; if (resource instanceof UrlResource) {
resourceUrl = context.getResource(resource.getFile().toString());
} else if (resource instanceof ClassPathResource) {
ClassPathResource classpathRes = (ClassPathResource) resource;
resourceUrl = context.getResource(classpathRes.getPath());
} else {
resourceUrl = resource.getURL();
} if (resourceUrl != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Adding resource '" + resourceUrl + "' to definitions factory.");
}
pathResources.add(resourceUrl);
// pathResources.put(resourceUrl.toString(), resourceUrl);
} else {
LOG.warn("Unable to find configured definition '" + resource + "'");
}
}
} catch (IOException e) {
LOG.error("<<<<<find>>>>", e);
} return pathResources;
} }

这样就可以使用spring的配置文件路径的方式配置tiles资源文件了,满足通配符。

4、最后一步 在web.xml上配置tiles文件的位置和listener,自动搜索工程resoruce/*.tiles.xml文件

    <context-param>
<param-name>org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG</param-name>
<param-value>file:/WEB-INF/tiles.xml,classpath:/com/cml/tile/**/resource/*.tiles.xml</param-value>
</context-param> <listener>
<listener-class>xxx.x..x.WildcardTilesListener</listener-class>
</listener>

由此,Struts-Tiles 2.5.2升级配置完成。

Struts2-Tiles 2.5.2 升级指南和通配符拓展的更多相关文章

  1. 企业IT管理员IE11升级指南【17】—— F12 开发者工具

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  2. 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  3. 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. 企业IT管理员IE11升级指南【2】—— Internet Explorer 11 对Adobe Flash的支持

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. 企业IT管理员IE11升级指南【3】—— IE11 新的GPO设置

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  7. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  8. 企业IT管理员IE11升级指南【5】—— 不跟踪(DNT)例外

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  9. 企业IT管理员IE11升级指南【6】—— Internet Explorer 11面向IT专业人员的常见问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

随机推荐

  1. testNG 预期异常、忽略测试、超时测试

    通过@Test 注解的参数值实现如下的几种测试 一.通过 @Test(expectedExceptions=异常类名) 参数实现到达 预期指定的异常效果 @Test(expectedException ...

  2. 尝试用python开发一款图片压缩工具1:尝试 pillow库

    开发目的 我经常使用图片.公众号文章发文也好,还是生活中要使用素材.图片是一种比文字更加直观的载体.但是图片更加占用带宽,很多软件都对图片有大小限制.图片太大也会影响加载速度.我试过几款图片压缩工具, ...

  3. Springboot:异步业务处理(十二)

    说明 当正常业务处理调用一个复杂业务或者耗时较长的请求时,客户等待时间会比较长,造成不好的用户体验,所以这时候需要用的异步处理 构建一个群发邮件的service接口及实现(模拟) 接口:com\spr ...

  4. [leetcode] 并查集(Ⅰ)

    预备知识 并查集 (Union Set) 一种常见的应用是计算一个图中连通分量的个数.比如: a e / \ | b c f | | d g 上图的连通分量的个数为 2 . 并查集的主要思想是在每个连 ...

  5. php-fpm运行原理

    来源:https://blog.csdn.net/sinat_38804294/article/details/94393621 一.php-fpm由来1.cgi (common gateway in ...

  6. 总结php删除html标签和标签内的内容的方法

    来源:https://www.cnblogs.com/shaoguan/p/7336984.html 经常扒别人网站文章的坑们:我是指那种批量式采集的压根不看内容的:少不了都会用到删除html标签的函 ...

  7. tp5--相对路径和绝对路径

    首先,我们要先明白相对路径和绝对路径的理论: 绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\window ...

  8. 通过纯css实现图片居中的多种实现方式

    html结构: <div class="demo" style="width: 800px;height: 600px; border:1px solid #ddd ...

  9. Django ORM 查询表中某列字段值

    场景: 有一个表中的某一列,你需要获取到这一列的所有值,你怎么操作? 解决办法: 有一个model为:Event 方式一: 获取内容: Event.objects.values('title') 输出 ...

  10. Docker 部署 halo 启动时,MySql 连接不上

    原因 halo 是部署在 docker 容器内部的,而 MySql 是部署在"宿主机"上的,docker默认的网络模式是bridge,容器内127.0.0.1访问不到的,把网络模式 ...