1,有一个类 ResourceRender ,所在的 package 是 com.daston.resource
2,在 /web-inf/classes 目录下有一个 abc.xml 文件,需要在某个时候装载此配置文件
3,这个WEB应用的classpath假设为 /appsd
一般的做法:
String classPathName = ResourceRender.class.getResource("/").getPath();
从理论上看,这样,应该可以直接得到 classes 的绝对路径;而在事实上,Tomcat 是可以这样获得的;
而在 WebSphere 部署里面,情况并不是这样,这样得到的路径是 WebSphere 的loader所在的目录,比如 /work/loader,而不是 /web-inf/classes。
针对这种情况,可以考虑这样的做法:
String classPathName = ResourceRender.class.getResource("").getPath();
这样做,classPathName 是这样的,/web-inf/classes/com/daston/resource/ ;
当然,这样根据 ResourceRender 的 package 将后缀去掉,从而获得classes 的绝对路径。
这样的测试几乎在 Tomcat 和 WebSphere 都是成功的。
可是,今天打包部署系统时,问题出来了,通过调试,返回的路径竟然是 %Tomcat%\work\Catalina\localhost\appsd\loader ;
系统提示找不到指定的文件 %Tomcat%\work\Catalina\localhost\appsd\loader\abc.xml
经过反复调试和验证,最终问题的原因找到了。
原来,我们打包部署的文件是将class文件打包到jar文件中,因此在,classes目录下是不会存在 /com/daston/resource 这些目录的,
所有的JAR文件都被打包到 jar 文件中了。
经过测试,发现,只要classes目录下有/com/daston/resource 这个目录,不一定有真正的 ResourceRender.class 文件,
上面的代码执行结果都是预期的结果,但是,一旦把目录删除或改名,上面代码执行结果就是 Tomcat 的work loader 目录。
因此,为了统一解决这样的问题,必须使用新的方式来实现:
URL url = ResourceRender.class.getClassLoader().getResource("abc.xml");
String classPathName = url.getPath();
int endingIndex = classPathName.length()-"abc.xml".length();
classPathName = classPathName.substring(0, endingIndex);
转自 http://hi.baidu.com/lontoo/blog/item/a264b525f315bb6434a80fa7.html
摘要: 在jsp servlet中我们通常使用Servlet Filter控制用户是否登入, 是否有权限转到某个页面。在struts2中我们应该会想到他的拦截器(Interceptor), Interceptor在struts2中起着非常重要的作用。 很多struts2中的功能都是使用Interceptor实现的。 需求:简单的登入界面,让用户输入用户名、密码、记住密码(remember me)。 如果用...
阅读全文
摘要: 拦截器的类已经定义在特殊的配置文件中,这个配置文件的名字就叫做struts-default.xml,如果你继承了struts-default默认的包名,那你就可以使用这些拦截器了,否则你必须在你自己的包中定义拦截器在<interceptors>中进行定义。 下面是Struts2中的内置拦截器介绍 Interceptor Name Description Alias Intercepto...
阅读全文
摘要:
J2EE相关基础知识
1、面向对象的特征有哪些方面
1. 抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它...
阅读全文