`
Mysun
  • 浏览: 270724 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

相对路径获取Tomcat Web容器中的资源

阅读更多
  最近做项目碰到个问题,我需要利用velocity模版来渲染一些文本内容出来。也就是用vm来做模版,设置参数,然后我用程序动态产生的参数点进去,最后把渲染好的模版作为String输出。
  项目里面vm模版是一起打包到war包里面的,而我用的是apache的velocity引擎,这个velocity引擎有方法支持vm渲染,但是要给出vm在文件系统中的绝对路径。考虑到灵活性,将模版的绝对路径写到Spring的配置文件(我利用Spring来获取apache的Velocity引擎)中肯定是行不通的。比较理想的方式肯定是制定相对路径,而我这里的这个相对路径就是一个文件夹,所有的模版都放到这个文件夹中。
  在Tomcat的web容器环境中(这里指Selevet这一层,webwork的Action也可以算入这一层),也就是我们在分层结构中通常所说的Web层中是可以通过Servlet的有关API来得到这个模版目录的绝对路径的绝对路径的(应该是通过获取web项目的根路径,然后拼接上相对路径来获得)。但是我的方法并不是在Web层的,让我的类依赖于Web环境来获取这个相对路径,并不是好的设计方法。因此需要有别的方法来获取这个相对路径。
  忙活了一阵子,在不断debug的过程中,终于发现可以用jndi来获得这个绝对路径。把方法保留下来,以备后用。
  在不能使用Servlet API的情况下,可以用Apache的org.apache.naming这个包来获得保存在tomcat运行时环境中的各种资源,这里主要是指目录和文件资源。而这些目录和文件资源都是相对于部署在tomcat中的各个web项目的项目根目录(webroot)的。为了操作jndi资源,我们要做的第一步就是获得jndi上下文,如下:
DirContext dirContext = DirContextURLStreamHandler.get();

在这个dirContext中,通过debug我们可以看到里面放了除了类路径下之外的所有资源,当然是相对于webroot的。现在假设我们的模版放在/webroot/templates下面。下面的代码就可以获得模版目录的绝对路径:
//获得上下文
DirContext dirContext = DirContextURLStreamHandler.get();
//查询templates这个目录资源
Object obj = dirContext.lookup("/templates");
FileDirContext fdc;
String webrootPath;
// 判断取出来的对象是不是FileDirContext
// 也就是判断这个资源名对应的资源是不是目录资源
if (obj instanceof FileDirContext) {
    fdc = (FileDirContext) obj;
    // 获取web项目根目录的绝对路径
    webrootPath = fdc.getDocBase();
}

String templatesPath = webrootPath + "/tempaltes";


  上面的代码先获得目录上下文,然后获得目录资源。这里判断了一下获得Object是不是FileDirContext,在jndi中,所有的目录资源都被抽象成FileDirContext这个对象。如果是文件就会被抽象成FileDirContext.FileResource这个对象。
  如果不是目录资源,比如是一个文件资源,那返回的ProxyDirContext这个对象,获得文件资源的方法在后面讲。
  但是,看apache的api,会发现你是没有办法拿到FileResource这个对象,因为目前的api没有暴露出来。虽然在debug的时候会发现,FileDirContext里面已经有属性(具体那个属性忘了)保存着我想要的东西了,但是就是没有办法通过api来得到这个东西。着实郁闷了一把。
  我尝试了各种方法,看了几遍api,都没有找到能够从FileDirContext里面直接获取我想要的属性的方法(也就是templates目录的绝对路径)。最后发现FileDirContext有个getDocBase()方法,能够拿到web项目的根目录的绝对路径。
  后来我想了一下,其实拿到这个根目录的绝对路径基本也就足够了,因为我们在web项目中指定资源的相对路径时,通常都是从webroot开始的。估计也是因为这个,大家在制定相对路径时都从webroot开始制定。
  拿到webroot之后,就可以拼接上我的模板目录的相对路径,然后获得模板目录的绝对路径了。为了方便,可以把这个相对路径做成Bean的一个属性,然后在Spring的配置文件中设定。如果想更方便,那就用maven。在一个外部文件中设定这个值。
  下面来说说获取文件资源,获取文件资源的思路基本相同,只不过换了另外一个类而已。如果是文件资源可以用下面的代码:
//获得上下文
DirContext dirContext = DirContextURLStreamHandler.get();
//查询templates这个目录资源
Object obj = dirContext.lookup("/templates/test.vm");
FileDirContext fdc;
String webrootPath;
// 判断取出来的对象是不是FileDirContext
// 也就是判断这个资源名对应的资源是不是目录资源
if (obj instanceof ProxyDirContext) {
    fdc = (FileDirContext) obj;
    // 获取web项目根目录的绝对路径
    webrootPath = fdc.getDocBase();
}

String templatesPath = webrootPath + "/tempaltes/test.vm";

  区别就在红色标注的9,15两行代码,lookup返回的类不一样了,变成ProxyDirContext了。ProxyDirContext中也有一个getDocBase方法,通过它拿到web项目的绝对路径,然后拼接上文件资源的相对路径也就拿到了完整的路径。

分享到:
评论

相关推荐

    apache-tomcat-8.0.44-src.zip

    Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制...

    tomcatplugin:Eclipse的Tomcat插件

    Eclipse Tomcat 插件为 Java Web 应用程序的开发提供了 Tomcat servlet 容器的简单集成。 该项目是原始 Sysdeo Tomcat 插件的积极维护分支。 特征 开始和停止工具栏图标 调试支持 轻松设置 安装 该插件可在 或者,...

    web.xml中如何设置配置文件的加载路径实例详解

    web应用程序通过Tomcat等容器启动时,会首先加载web.xml文件,通常我们工程中的各种配置文件,如日志、数据库、spring的文件等都在此时被加载,下面是两种常用的配置文件加载路径,即配置文件可以放到 SRC目录下或者...

    Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

    使用的是tomcat作为web容器,打断点debug调试跟踪,当跟踪到org.apache.catalina包下的时候,则无法进入,这是因为idea运行的tomcat是通过插件的方式集成的,tomcat里面的lib包不再项目的依赖路径中,所以不能跟踪...

    Servlet 全面教程

    servlet 是运行在web 容器中,在后面会详细地讲解,这个web 容器可以控制Servlet 对象的生命周期,控制请 求由Servlet 对象处理。 2、web 服务器,这里的服务器不是硬件概念,而是软件,常用的web 服务器有Tomcat,...

    详解如何通过tomcat的ManagerServlet远程部署项目

    它是用来管理已经部署的web应用程序,在这个应用程序中,ManagerServlet是他的主servlet,通过它我们可以获取tomcat的部分指标,远程管理web应用程序,不过这个功能会受到web应用程序部署中安全约束的保护。...

    java web技术开发大全(最全最新)

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...

    java web开发技术大全

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    how-tomcat-works

    16.2 tomcat中的shutdown hook 131 第17章 启动tomcat 133 17.1 概述 133 17.2 Catalina类 133 17.2.1 start方法 134 17.2.2 stop方法 135 17.2.3 启动Digester 135 17.2.4 关闭Digester 135 17.3 Bootstrap类 136 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    Tomcat体系结构与插件配置教程图解

     docBase:web应用的文件路径  path:URL入口  reloadable:字节码变化服务器是否重新加载web应用 二、tomcat服务器体系结构  1.Server整个Servlet容器组合,可以包含一个或多个  2.service:它由一个或者多个...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写第一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写第一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 ...

    李兴华Java Web开发实战经典(高清版) Part2

    4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写第一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 ...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    16.2 tomcat中的shutdown hook 131 第17章 启动tomcat 133 17.1 概述 133 17.2 Catalina类 133 17.2.1 start方法 134 17.2.2 stop方法 135 17.2.3 启动Digester 135 17.2.4 关闭Digester 135 17.3 Bootstrap类 136 ...

    jarslink-demo模块化开发框架简单demo

    4.修改完成子模块重新打包jar,并且拷贝到(使用的容器路径)apache-tomcat-6.0.26\webapps\ROOT\WEB-INF\classes\META-INF 5.手动重新加载子模块:http://localhost:8088/index/reload 或者等待定时器自动重新加载...

    Java资源包01

    jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。 Java 绘图框架 JGraphEd JGraphEd 是一个 Java 的图形编辑应用和绘图框架。 Java ...

Global site tag (gtag.js) - Google Analytics