现在的位置: 首页 > 综合 > 正文

指定载入URL 失败 ? 用tomcat ,jsp中关于所有路径API总结及 常用的用相对路径获得绝对路径的API

2019年05月13日 ⁄ 综合 ⁄ 共 5832字 ⁄ 字号 评论关闭

TOMCAT  容器是从STS 中打开的,SPRING MVC 自带浏览器中可以显示 DIV 元素指定的图片,但是桌面浏览器就加载不进来,报错:指定载入URL 失败 。什么意思呢?

绝对路径与相对路径在TOMCAT中的地位似乎不一样。

java类、jsp/servlet、web应用中的相对路径与绝对路径

 java类中相对路径与绝对路径讲解
      File类或者一些IO流中,在其构造函数中要求传入String类型的参数,用于指示文件所在的路径。使用绝对路径不用说,很容易就能定位到文件,那么使用了相对路径jvm如何定位文件的呢?

      按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。当前用户目录由系统属性user.dir 指定,通常是Java 虚拟机的调用目录.

      相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白。按照上面jdk文档上讲的这个路径是“当前用户目录”也就是“java虚拟机的调用目录”.更明白的说这个路径其实是我们在哪里调用jvm的路径(我们在哪启动jvm的路径).
 
 举个例子:
 假设有一java源文件Example.java在d盘根目录下,该文件不含package信息.
 我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后用”javac Example.java”来编译此文件,
 编译无错后,会在d盘根目录下自动生成”Example.class”文件.
 我们在调用”java Example”来运行该程序.此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,
 所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即d盘根目录:D:\
 同时“当前用户目录”也是D:\
 在System.getProperty(“user.dir”);系统变量”user.dir”存放的也是这个值.
 
 搞清了这些,我们可以使用相对路径来创建文件,例如:
 File file = new File(“a.txt”);
 file.createNewFile();
 假设jvm是在”D:\”下启动的,那么a.txt就会生成在D:\a.txt;
 
 此外,这个参数还可以使用一些常用的路径表示方法,例如”.”或”.\”代表当前目录,这个目录也就是jvm启动路径
 所以如下代码能得到当前目录完整路径:
 File f = new File(".");
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);//D:\
 
 再说说在eclipse中的情况:Eclipse中启动jvm都是在项目根路径上启动的.
 比如该类所在的项目为coreJava,其完整路径为:D:\myEclipse_workspace\coreJava\.
 那么这个路径就是jvm的启动路径了.所以以上代码如果在eclipse里运行
 则输出结果为D:\myEclipse_workspace\coreJava\.
 

 说说在服务器中的Java类获得当前路径
 1、 在Tomcat中的情况.
 如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
 File f = new File(".");

 //或者:File f = new File(System.getProperty("user.dir"));
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);
 那么输出的将是tomcat下的bin目录,即%Tomcat_Home%/bin
 我的机器就是D:\myEclipsetomcat6\bin\.  ,由此可以看出tomcat服务器是在bin目录下启动jvm的.
 其实是在bin目录下的” catalina.bat”文件中启动jvm的.

 

2、在weblogic中的情况

WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:/weblogic10.....
那么,你的文件根路径就是c:.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:/yourconfig/yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径,是相对于你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放
在yourwebapp/yourconfig/yourconf.properties,
这样使用:
new FileInputStream("../yourconfig/yourconf.properties");
这两种方式均可,自己选择。

 

关于在web应用中的路径

      Java EE里的Web项目有个相对独立的最高目录WebRoot,我们估且认为它是根目录/。Web项目成品中的其它目录都是相对与此目录的子目录。在开发时, 我们可能会用到一些框架,比如struts,spring等。使用这些框架,我们需要配制相应的xml文件,至少也会配制web.xml文件。比如使用struts2时,在struts.xml中映射Action是最常见的配制,所有的映射,都以“/”开头,那么这里的“/”指的是那个目录呢?那就是不可见相对独立的WebRoot,应用中“/action”就相当于是系统目录中的”WebRoot/action",
知道这一点,就不会在为Action映射老是不可用发愁了。

   

 

关于JSP/Servlet中的相对路径和绝对路径

 

 在jsp/servlet中,服务器端的地址和客户端的地址表示有区别

 1、服务器端的地址

   服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //127.0.0.1/webapp/的。

     其用到的地方有:forward:servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://127.0.0.1/webapp/user/a.jsp
sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

 

2、客户端的地址

所有的html页面中的相对地址都是相对于服务器根目录(http://127.0.0.1/)的,而不是(跟目录下的该Web应用的目录)http://127.0.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://127.0.0.1/)的

    所以,如果提交到a.jsp 为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
    提交到servlet为actiom="/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。
     因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

 

3、JSP中获得当前应用的相对路径和绝对路径

随便在应用webroot下新建一个jsp文件,启动tomcat,测试一下便知:

 System.out.println(request.getRequestURI()); //相对地址 /ebpp/test/MyJsp.jsp
 System.out.println(request.getRequestURL());

//得到该文件的IE地址栏访问地址http://localhost:9999/ebpp/test/MyJsp.jsp
 System.out.println(application.getRealPath("/")); //当前web应用的绝对路径

 

 

4、Servlet中获得当前应用的相对路径和绝对路径

根目录所对应的路径:request.getServletPath();
文件的绝对路径 :request.getSession().getServletContext().getRealPath(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");

=====================================================

用tomcat ,jsp中关于所有路径API总结及 常用的用相对路径获得绝对路径的API

首先我现在url中输入http://localhost:8080/testajax/test


然后我自己在tomcat中的一个servlert中打印语句为


System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getRealPath("/"));
System.out.println(req.getRequestURI());
System.out.println(this.getServletContext().getRealPath("/Testurl.class"));



在服务器打印的是

/testajax
/test
D:\apache-tomcat-5.5.23\webapps\testajax\
/testajax/test
D:\apache-tomcat-5.5.23\webapps\testajax\Testurl.class



由此可以说明getContestPath获得是webapp目录下开始的这个绝对路径,在jsp中用El表达式是pageContext.request.contextPath

也是这个意思

servletPath毫无疑问就是rul-pattern


getRealPath

只要一看到这个realPath 真是的路径  想都不用想,及时真是的路径 一听就是要全路径了

不过这个getRealPath这个方法除了request对象有之外还有 servletcontext对象也有,这2个对象都有这个方法从这个列子中看

好像每什么区别


getServletUri就是获得是端口号之后的信息,如果有表单,不包括表单


======================================================================================



让我我们先来说说  classname.class.getresourseasStream("");

这个方法也是通过括号里面的参数制定你资源的路径,如果路径第一个字符不是"/"那么 就是相对路径,相对于当前的这个类所在的

路径比如我这个类在 org.apache.test这个包下类的名字就叫做 Test

那么Test.class.getResourceAsStream("config.properties");这个方法的作用就是在类Test这个同级目录 寻找这个config。properties文件导入输入流

那么Test.class.getResourceAsStream("util/config.properties");那么这个方法的作用是 在这个类同级的目录寻找 这个util这个子包

导入这个子包下的config.properties这个配置文件,

 

如果Test.class.getResourceAsStream("/org/apache/test/util/config.properties");

如果字符串里面的第一个字符是 /  哪么这个斜杠代码这个工程下的src目录 ,这个方法的意思代表

导入这个工程下的org.apache.test.util包下的配置文件

 

====================================================================================

下面我们来说className.class.getclassLoader.getResourseAsStream("")

这个方法我个人的理解就是把 相对的路径一到了类加载器的路径,就是classpath,一般myeclipse里面每一个工程的src目录在编译后转到bin目录下,bin目录就是classpath。

如果 你在src目录下有一个配置文件config.perproties

那么Test.class.getClassLoader().getResourceAsStream("class.properties");

就可获得资源文件

 

如果 你要获得org.apache.test包下的配置文件,那么 就可以写成("org/apache/test/config.properties")

抱歉!评论已关闭.