`
Mysun
  • 浏览: 273918 次
  • 性别: 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项目的绝对路径,然后拼接上文件资源的相对路径也就拿到了完整的路径。

分享到:
评论

相关推荐

    Tomcat 9 虚拟路径配置

    在日常的Web开发中,Apache Tomcat作为一款免费开源的Servlet容器,被广泛应用于部署Java Web应用。对于开发者来说,灵活地配置虚拟路径(也称为虚拟主机或上下文路径)是提高项目可管理性和扩展性的关键技能之一。...

    web容器tomcat7.0

    【标题】:Web容器Tomcat 7.0详解 【描述】:Apache Tomcat是一款开源且免费的Web应用服务器,特别适用于运行Java Servlet和JavaServer Pages(JSP)技术。Tomcat 7.0版本是它的一个重要里程碑,提供了一系列增强...

    Tomcat指定jdk路径

    Apache Tomcat 是一款开源的Servlet容器,能够作为Web服务器独立运行,也可以与Apache等其他Web服务器配合使用。Tomcat支持最新的Servlet和JSP规范,因为简单易用,是开发和调试JSP程序的首选工具。在实际应用中,...

    JAVA获取各种路径总结

    - **容器中的路径获取** - 不同的Web容器对路径的处理可能有所不同: - **WebLogic** - WebLogic中,如果使用相对路径加载配置文件,通常需要指定具体的路径。 - **Tomcat** - `System.getProperty("user.dir...

    Tomcat容器

    总而言之,Tomcat作为一款广泛使用的Java Web容器,其简洁的架构、高效的性能和灵活的配置,使其成为了开发者们的首选工具。无论是在学习Java Web开发还是在构建实际项目中,掌握Tomcat的使用和配置都是至关重要的...

    Tomcat web应用中配置连接池的详细过程

    ### Tomcat Web 应用中配置连接池的详细过程 #### 一、引言 在现代Web开发中,数据库连接管理是一项重要的任务。为了提高应用性能并减少资源消耗,通常会采用连接池技术来管理数据库连接。对于部署在Tomcat服务器...

    tomcat配置虚拟路径保存访问图片

    这里的`path="/photo"`表示在Tomcat容器中设置了一个名为/photo的虚拟路径。当用户通过浏览器访问`***`时,实际上访问的是`D:\upFiles`这个目录下的文件。`docBase`属性指明了这个目录的绝对路径。而`reloadable=...

    Spring源代码解析(二):IoC容器在Web容器中的启动.doc

    总的来说,Spring在Web容器中的启动过程涉及到`WebApplicationContext`的创建、配置文件的解析、bean定义的加载和bean的实例化。通过这种方式,Spring能够紧密地集成到Web环境中,提供全面的依赖注入和控制反转功能...

    tomcat虚拟路径配置

    在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP标准。在部署Web应用时,我们经常需要配置Tomcat的虚拟路径,以便能够通过HTTP协议访问到我们的应用程序。这...

    tomcat8.0服务容器

    Tomcat8.0是Apache软件基金会的Jakarta项目中的一个核心项目,它是一个开源的、免费的Web应用服务器,特别适合于小型到中型的Java Web应用程序。作为一款轻量级应用服务器,Tomcat8.0在性能和稳定性上都有显著提升,...

    web容器---servlet

    本文将深入探讨Servlet的工作原理、生命周期以及如何在Web容器中部署和运行。 一、Servlet简介 Servlet是Java Servlet API规范中的一个接口,由JavaSoft(现Oracle公司)定义。Servlet主要负责接收和响应来自客户端...

    Tomcat WEB服务器实战

    ### Tomcat WEB服务器实战知识点概览 #### 一、Tomcat简介与特点 ...无论是对于开发者还是运维人员来说,这些知识点都是非常宝贵的资源,能够帮助他们更加高效地利用Tomcat这一强大的Servlet容器。

    Struts2在Tomcat容器中的加载过程

    Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它在Tomcat这样的Servlet容器中运行,提供了强大的控制层来处理HTTP请求和响应。理解Struts2在Tomcat中的加载过程有助于我们更好地进行...

    清空Tomcat中的work目录并重启Tomcat.bat

    Tomcat是Apache软件基金会的一个开源项目,它是一个广泛使用的Java Servlet容器,支持Java EE Web应用程序的运行。`work`目录在Tomcat的文件结构中扮演着重要角色,它是Tomcat用来存储JSP编译后的Java类文件的地方。...

    使用Tomcat搭建WEB开发环境

    在IT行业中,Web开发是至关重要的领域,而Tomcat作为一款广泛应用的开源Servlet容器,扮演着搭建Web服务器的关键角色。本篇文章将详细阐述如何使用Tomcat来构建一个高效的Web开发环境,帮助开发者顺利进行项目开发。...

    apache Tomcat web服务器

    安装完成后,配置Tomcat的主要文件是`conf/server.xml`,在此文件中可以设置端口号、上下文路径、连接器属性等。 **3. 部署Web应用程序** 将Web应用程序打包为WAR文件,然后将其复制到Tomcat的`webapps`目录下。...

    springboot入门实例可运行在tomcat6容器

    标题中的 "springboot入门实例可运行在tomcat6容器" 暗示了这个压缩包包含了一个使用 SpringBoot 构建的应用,该应用设计为可以在 Apache Tomcat 6 服务器上运行。Tomcat 6 是一个广泛使用的开源 Java Servlet 容器...

    springboot入门示例可运行在tomcat6容器

    **SpringBoot入门示例在Tomcat6容器中的运行详解** SpringBoot是由Pivotal团队提供的全新框架,旨在简化Spring应用程序的初始搭建以及开发过程。它集成了大量的常用第三方库配置,如Redis、MongoDB、JPA、RabbitMQ...

    tomcat7 tomcat9 两个资源

    标题中的“tomcat7 tomcat9 两个资源”指的是Apache Tomcat服务器的第七个和第九个主要版本。Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。这两个版本之间的差异在于功能的增强、性能...

Global site tag (gtag.js) - Google Analytics