Apache tiles中用URL加载资源

本文探讨了Java中使用URL加载资源的方法与限制,并详细解释了如何解决在classpath下加载资源的问题,包括自定义Tiles容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL是URI的特殊类型,统一资源定位符作用就是要将具体的资源和加载资源的方式解耦。

http://stackoverflow.com/questions/861500/url-to-load-resources-from-the-classpath-in-java

 

比如,需要得到资源的流,只需要在连接参数中设置protocol这个参数就能够加载到任意位置的比特流。除了比特流职位其他还还有 最后资源最后修改时间,创建时间等都能通过URL来取到。

 

但是,在使用URL来加载资源也是有前提的,必须要先了解URL和他所依赖的一些类的体系结构,不然在使用过程中不是任何资源都能加载的。比如执行下面这段代码:

public static void main(String[] args) throws Exception {
		new URL("classpath:tiles-conf/tiles-defs.xml").openConnection();
	}

 

在console上会输出下面的错误信息:

 

Exception in thread "main" java.net.MalformedURLException: unknown protocol: classpath
 at java.net.URL.<init>(Unknown Source)
 at java.net.URL.<init>(Unknown Source)
 at java.net.URL.<init>(Unknown Source)
 at com.koubei.profile.util.Test.main(Test.java:19)

我试验了一下无论是将这段代码用java程序启动还是放在tomcat中跑都是会抛出相同的异常 

 

但是在使用tiles框架过程中,使用在加载tiles的配置文件使用的是如下配置,在web.xml中:

<context-param>
		<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
		<param-value>classpath:tiles-conf/tiles-defs.xml</param-value>
</context-param>

 

 

会抛出这样的错误信息,说明classpath的protocol是识别的,问题的关键是找不到资源

 

 

2011-08-04 09:21:45,136 org.apache.tiles.impl.BasicTilesContainer.initializeDefinitionsFactory(BasicTilesContainer.java:398) - WARN - Unable
 to find configured definition 'classpath:tiles-conf/tiles-defs.xml'

 

问题的关键是从利用ServletContext加载资源是只能从web当前“/”根目录开始加载,如果要从classpath中加载的话就找不到了。解决的办法是添加两个类: 

import org.apache.struts2.tiles.StrutsTilesContainerFactory;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.TilesException;
import org.apache.tiles.impl.BasicTilesContainer;

/**
 * @author 百岁 (莫正华 baisui@taobao.com)
 * 
 *         2011-8-4 上午11:09:55
 */
public class KoubeiStrutsTilesContainerFactory extends
		StrutsTilesContainerFactory {

	@Override
	public TilesContainer createTilesContainer(Object context)
			throws TilesException {

		BasicTilesContainer container = new KoubeiTilesContainer();
		initializeContainer(context, container);
		return container;
	}
}

 

import java.util.Map;

import org.apache.tiles.TilesException;
import org.apache.tiles.definition.DefinitionsFactory;
import org.apache.tiles.impl.BasicTilesContainer;

/**
 * @author 百岁 (莫正华 baisui@taobao.com)
 * 
 *         2011-8-4 上午10:50:41
 */
public class KoubeiTilesContainer extends BasicTilesContainer {

	@Override
	protected void initializeDefinitionsFactory(
			DefinitionsFactory definitionsFactory, String resourceString,
			Map<String, String> initParameters) throws TilesException {

		definitionsFactory.addSource(KoubeiTilesContainer.class
				.getResource("/tiles-conf/tiles-defs.xml"));
		

		super.initializeDefinitionsFactory(definitionsFactory, resourceString,
				initParameters);
	}
}

 然后在web.xml中配置一个配置节点,就可以让tiles来从classpath下来加载配置信息了。

	<context-param>
		<param-name>org.apache.tiles.factory.TilesContainerFactory</param-name>
		<param-value>com.koubei.profile.tiles.KoubeiStrutsTilesContainerFactory</param-value>
	</context-param>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值