servlet和jsp的区别_获取servletcontext

servlet和jsp的区别_获取servletcontext关于serveletContext.getRealPath()方法1.关于request.getRealPath问题:Stringfilename=request.getRealPath(filename)——————-信息:warning:[deprecation]getRealPath(java.lang.String)in

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

关于serveletContext.getRealPath()方法

1.关于request.getRealPath
问题:
String filename=request.getRealPath(filename)
——————-
信息:
warning: [deprecation] getRealPath(java.lang.String) in javax.servlet.ServletRequest has been deprecated

解决:
这个getRealPath方法已经不建议使用了

参看request.getRealPath的java doc:
Deprecated. As of Version 2.1 of the Java Servlet API, use ServletContext.getRealPath(java.lang.String) instead.


而在servlet中使用getServletContext.getRealPath()这个方法受到war 和non-war的影响,以及不同app server实现的影响,运气好的话,你常常会得到null,嘿嘿,比如你在weblogic上部署war文件,又调用这个方法..

推荐ServletContext.getResourceAsStream


2.关于serveletContext.getRealPath返回NULL和不同的app server返回不同的结果

问题:

有几个配置文本配置文件(是一些报表的模板),放在WEB-INF下面的config目录下,程序中是这样得到这个config的实际路径的:
先用 serveletContext.getRealPath得到根路径,tomcat中比如是
c:\tomcat\webapp\test

然后我加上 “/WEB-INF/config/aa.config”,这样得到文件的path然后进行读入,应用在tomcat上跑是ok的,后来将war放到weblogic上,出错,原因是:
在weblogic上用getRealPath得到的是像
myserver\stage\_appsdir_test_war\test.war!\WEB-INF\config….
这样的路径,于是一直报FileNotFoundException

解决:

serveletContext.getRealPath
这个方法在不同的服务器上所获得的实现是不一样的, 建议是通过classloader来获得你配置的资源文件

context.getRealPath(“/”)可能返回了null,你可以输入来看看,
对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath只会简单地返回null。其实,也很

好理解,一个文件被打包入了.war文件,就不存在目录结构了(虽然包中仍然存在目录结构,但这不等同于文件系统中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO进行读取了。

那么,如何读取war包中的资源呢?答案是使用:
ServletContext.getResourceAsStream(“/WEB-INF/config/aa.config”)方法。


原则:基本上就是尽量使用j2ee规范中的各层次classloader来获取资源,而不是试图去找文件的绝对路
方法:调用this.getClass().getClassLoader().getResource(“/”).getPath(); 获取到classes目录的全路径

使用:在得到classes目录的全路径后再根据字符串的截取与拼装达到你的要求即可。



绝对不要使用ServletContext的getRealPath方法获取Web应用的路径!应该使用ServletContext的getResource()方法,直接使用相对于Web应用根目录的相对路径来获取资源。

ServletContext接口中定位资源的方法
getResource
java.net.URL getResource(java.lang.String path)
throws java.net.MalformedURLException
Returns a URL to the resource that is mapped to a specified path. The path must begin with a “/” and is interpreted as relative to the current context root.
This method allows the servlet container to make a resource available to servlets from any source. Resources can be located on a local or remote file system, in a database, or in a .war file.
The servlet container must implement the URL handlers and URLConnection objects that are necessary to access the resource.
This method returns null if no resource is mapped to the pathname.
Some containers may allow writing to the URL returned by this method using the methods of the URL class.
The resource content is returned directly, so be aware that requesting a .jsp page returns the JSP source code. Use a RequestDispatcher instead to include results of an execution.
This method has a different purpose than java.lang.Class.getResource, which looks up resources based on a class loader. This method does not use class loaders.
Parameters:
path – a String specifying the path to the resource
Returns:
the resource located at the named path, or null if there is no resource at that path
Throws:
java.net.MalformedURLException – if the pathname is not given in the correct form
getResourceAsStream
java.io.InputStream getResourceAsStream(java.lang.String path)
Returns the resource located at the named path as an InputStream object.
The data in the InputStream can be of any type or length. The path must be specified according to the rules given in getResource. This method returns null if no resource exists at the specified path.
Meta-information such as content length and content type that is available via getResource method is lost when using this method.
The servlet container must implement the URL handlers and URLConnection objects necessary to access the resource.
This method is different from java.lang.Class.getResourceAsStream, which uses a class loader. This method allows servlet containers to make a resource available to a servlet from any location, without using a class loader.
Parameters:
path – a String specifying the path to the resource
Returns:
the InputStream returned to the servlet, or null if no resource exists at the specified path
getRealPath
java.lang.String getRealPath(java.lang.String path)
Returns a String containing the real path for a given virtual path. For example, the path “/index.html” returns the absolute file path on the server’s filesystem would be served by a request for “http://host/contextPath/index.html”, where contextPath is the context path of this ServletContext..
The real path returned will be in a form appropriate to the computer and operating system on which the servlet container is running, including the proper path separators. This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).
Parameters:
path – a String specifying a virtual path
Returns:
a String specifying the real path, or null if the translation cannot be performed

说明
可以看到,ServletContext接口中的getResource()等方法,可以找到任何从应用程序的根目录开始的资源。包括在.war包这样的压缩文件中。参数必须以/开头。
而我们常用的getRealPath(“/”)方法,在.war包发布时,就会失效。会返回null。
因此,我们应该避免使用getRealPath(“/”)这样的方法来获取应用程序的绝对路径。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191887.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月23日 下午1:43
下一篇 2026年1月23日 下午2:15


相关推荐

  • [WinForm]C# ListView用法详解[通俗易懂]

    [WinForm]C# ListView用法详解[通俗易懂]转载自:http://blog.csdn.net/chen_zw/article/details/7910324#一ListView类1常用的基本属性2常用方法3常用事件二ListView的五种视图Details视图1列表头创建记得需要先创建列表头2添加数据项3显示项4移除某项5行高设置利用imageList实现6清空运行效果largeIcon视图运行效果SmallIcon视图运行效果List视图…

    2022年7月26日
    7
  • Retry重试机制

    Retry重试机制业务场景 nbsp nbsp nbsp 应用中需要实现一个功能 需要将数据上传到远程存储服务 同时在返回处理成功情况下做其他操作 这个功能不复杂 分为两个步骤 第一步调用远程的 Rest 服务逻辑包装给处理方法返回处理结果 第二步拿到第一步结果或者捕捉异常 如果出现错误或异常实现重试上传逻辑 否则继续逻辑操作 解决方案演化 nbsp nbsp nbsp nbsp 这个问题的技术点在于能够触发重试 以及重试情况下逻辑有效执行

    2026年3月19日
    2
  • protege5.5_ProE4.0

    protege5.5_ProE4.0OWL本体的重要组成部分Individuals:个体,代表一个领域里面的对象。可以理解成一个类的实例(instancesofclasses)。Properties:属性,是两个个体之间的双重联

    2022年8月4日
    11
  • Java程序设计(基础)- 概述

    Java程序设计(基础)- 概述

    2021年7月21日
    62
  • querySelectorAll 遍历

    querySelectorAll 遍历直接 forEachdocum querySelecto p forEach i gt console info i 如果不能直接 forEachquery 返回的是 NodeList 无法直接 forEach 遍历 但是 貌似现在可以了 难到是浏览器都升级支持了 利用展开 document querySelecto

    2026年3月18日
    2
  • MFC:Picture控件的用法

    MFC:Picture控件的用法一 利用 Picture 控件静态加载显示 Bitmap 图片在界面上创建 Picture 控件将 Picture 控件的 Type 属性设为 Bitmap 导入或新建 Bitmap 类型资源 ID 为 IDB BITMAP1 等等为控件添加变量 CStaticm pic 加载图片代码 HBITMAPhBitm LoadBitmap AfxGetInstan

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号