Struts2-Tiles 2.5.2 升级指南和通配符拓展

原创 2016年08月30日 14:20:24

最近工程从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 案例代码实现及遇到的问题【struts2.5版本】

实例struts2.5版本遇到的坑 问题一:Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPr...

struts2 2.5.2web.xml和struts.xmll配置

HelloWorld struts2 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFil...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Struts2 2.5.2的套路

Struts2 2.5版本出现的几个奇怪的问题

关于struts2 2.5.2 的入门 遇到的问题 --总结1

-------废话的分割线---------- 第一次自己看视频学struts 总会遇到麻烦 ,究其原因 ——粗心大意为主  其次,所看视频的局限性为次要原因 ----正题的分割线------ 1:配...

struts2.5.10.1初体验-入门配置指南

struts2.5.10.1初体验-入门配置指南struts2是学习JavaWeb开发的人必须要学习的一个MVC框架,它在2017年06月10日最新的版本就是2.5.10.1,推荐使用(因为它弥补了2...

Struts2 2.5.2的套路

最近接触了Struts2这个JavaWeb框架,结果被套路了,而且套路的很惨。 要学Struts2 就必然要下载Struts2的jar包,在官网上下载了最新的,没错就是这个: 这个东西真是...

Tiles3.x框架使用

官网:http://tiles.apache.org/ Tiles,瓷砖,就像Windows8+的磁贴一样,多个瓷砖构成了整个UI页面。它是一个免费开源的模板框架,基于组合模式来简化UI界面的...

Struts2最新版(2.5.12)快速入门(二) Struts2之Action

Struts2之Action 1、action与servlet   在struts1中 一个Action类完全等同于一个servlet类,但在struts2中,你也可以把它看作是一个servle...

Struts2最新版(2.5.12)快速入门(三) Struts2之Annotation

随着版本不断的更新,struts2也引进了Annotation的功能,这一改进使得我们的开发效率大大提高,再也不用去配置繁琐的xml,可以更直观明了的在我们处理业务逻辑的方法,或者Action类前面添...

关于struts2升级2.5版本后不能用通配符的解决方法

struts2关于2.5版本后无法使用通配符
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)