前言

  在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的。那这一篇我给大家详细的分享一下Web中的各种路径问题。

  世界上一切东西都是相对的,对于这点而言,相信大家并不陌生,由于这篇文章是针对于WEB阶段来讲的,所以以下绝对路径和相对路径都是针对于整个互联网而言的。

  在JavaWeb中需要写的路径大概分为四大类:

    1)客户端路径

      超链接、表单、重定向

    2)服务端路径

      转发、包含

    3)获取资源路径

      servletContext获取资源、ClassLoader获取资源、Class获取资源

    4)<url-pattern>路径

  在本文中使用下图构建Web项目的目录:

    

一、客户端路径

  客户端路径是指运行在浏览器上的路径。

  比如:表单、超链接、js(location.href)、Ajax(url)、CSS和JS的引入以及重定向等。路径分为绝对路径和相对路径,相对路径又分为相对主机的路径和相对于当前请求的路径。

1.1、超链接 

  超链接有三种书写路径的方式
    1)绝对路径
    2)以"/"开头的相对路径
    3)不以"/"开头的相对路径

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>页面A</title>
</head>
<body>
<!--
超链接有三种书写路径的方式
,绝对地址
,以"/"开头的相对地址
,不以"/"开头的相对地址
-->
<!-- .绝对地址 -->
<!-- 完整的URL -->
<a href="http://localhost:8080/javaee/jsp/b.jsp">这是绝对地址超链接</a><br/> <!-- .以"/"开头的相对地址 -->
<!-- /代表了整个web项目,即:http://localhost:8080/ -->
<a href="/javaee/jsp/b.jsp">这是以"/"开头的相对地址超链接</a><br/> <!-- .不以"/"开头的相对地址 -->
<!--
不以/开头,则相对于当前资源的路径
当前资源的路径为:http://localhost:8080/javaee/jsp/
而b.jsp也在此路径下
所以直接书写b.jsp
-->
<a href="b.jsp">这是不以"/"开头的相对地址超链接</a><br/>
</body>
</html>

  分析:   

  1)绝对路径(以协议开头的路径):最终请求路径为:http://localhost:8080/javaee/jsp/b.jsp

  2)相对路径:

    2.1) 相对于主机的路径(以“/”开头):相对于当前主机(可以简单理解为ip地址,如果想深入了解请研究tomcat的Server.xml文件。这里是localhost)的路径,请求的最终路径为:http://localhost:8080/javaee/jsp/b.jsp

  2.2)相对于请求的路径(不以“/”开头):相对于当前请求(浏览器的请求)的路径。

1.2、表单

  表单有三种书写路径的方式 
    1)绝对路径
    2)以"/"开头的相对路径 
    3)不以"/"开头的相对路径    

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 表单提交到jsp中 -->
<!--
表当提交路径有三种书写方式
,绝对地址
,以"/"开头的相对地址
,不以"/"开头的相对地址
-->
<form action="http://localhost:8080/javaee/jsp/b.jsp" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="提交---绝对地址 ">
</form>
<!--
以/开头的相对地址
此时的/代表整个web项目,即:http://localhost:8080/
-->
<form action="/javaee/jsp/b.jsp" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="提交---以/开头的相对地址">
</form> <form action="b.jsp" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="提交---不以/开头的相对地址 ">
</form> <!-- 表单提交到Servlet -->
<!--
表单提交到Servlet有三种书写方式
,绝对路径
,以"/"开头的相对地址
,不以"/"开头的相对地址
-->
<!-- .绝对地址 -->
<!-- 完整的URL -->
<form action="http://localhost:8080/javaee/PathServlet" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="表单提交到Servlet---绝对地址">
</form> <!-- .以/开头的相对地址 -->
<!-- 此时的/代表整个web项目,即:http://localhost:8080/ -->
<form action="/javaee/PathServlet" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="表单提交到Servlet---以/开头的相对地址">
</form>
<!-- .不以/开头的相对地址 -->
<!--
不以/开头的相对路径是相对于当前资源的路径
此时form.jsp的地址为:http://localhost:8080/javaee/jsp/form.jsp
所以当前资源路径为:http://localhost:8080/javaee/jsp
而要提交的Servlet的路径为Http://localhost:8080/javaee/PathServlet
所以路径为当前路径的上一级路径下
即路径为:../PathServlet
注:.代表当前路径
..代表当前路径的上一级路径
-->
<form action="../PathServlet" methoe="get">
username:<input type="text" name="username" value="">
<input type="submit" value="表单提交到Servlet---不以/开头的相对地址">
</form>
</body>
</html>

1.3、重定向

  表单有三种书写路径的方式 
    1)绝对路径
    2)以"/"开头的相对路径 
    3)不以"/"开头的相对路径

  注意:在这里中我们一般只会用相对路径,不会去用绝对路径

import java.io.IOException;  

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");
/*
* 2.以"/"开头的相对路径
* 此时,/代表整个web工程的路径,即http://localhost:8080/
*/
// response.sendRedirect("/javaee/jsp/b.jsp");
/*
* 3.不以"/"开头的相对路径
* 此时是相对于当前资源的相对路径
* 当前资源路径为:http://localhost:8080/javaee/RedirectServlet
* 即表示:RedirectServlet在路径http://localhost:8080/javaee之下
* 而b.jsp在http://localhost:8080/javaee/jsp/b.jsp
* 所以最终地址写为:jsp/b.jsp
*/
// response.sendRedirect("jsp/b.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

二、服务端路径

  服务端路径是指在服务器上面运行的请求,比如请求转发(常用)、请求包含等。服务端的路径有两种:相对于当前应用的路径和相对于当前请求的路径。  

2.1、请求转发

  请求转发有两种书写路径的方式 
    2)以"/"开头的相对路径 
    3)不以"/"开头的相对路径

  注意:服务器端的路径不能是绝对路径,只能是相对路径,也分为以/开头和不以/开头两种

import java.io.IOException;  

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 1.以"/"开头的相对路径
* 2.不以"/"开头的相对路径
*/
public class DispatcherServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.以"/"开头的相对路径
* 此时,/代表当前web项目,即:http://localhost:8080/javaee
*/
// request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
/*
* 2.不以"/"开头的相对路径
* 相对于当前资源的相对路径
* 此时,当前资源的路径为:http://localhost:8080/javaee/DispatcherServlet
* 所以要转发去的资源的路径以:http://localhost:8080/javaee开头
*/
request.getRequestDispatcher("jsp/b.jsp").forward(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

  注意:所有Web层框架的底层使用的都是Web的基础Filter(Struts)或Servlet(SpringMVC),请求都是request,响应都是response,所以各个Web层框架的转发或重定向底层都是利用request和response进行的。

2.2、请求包含

  请求包含和上面的请求转发路径方式一样的

import java.io.IOException;  

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 请求包含不能书写绝对地址,只能书写相对地址
* 1.以"/"开头的相对路径
* 2.不以"/"开头的相对路径
*/
public class IncludeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.以"/"开头的相对路径
* 此时,/代表当前web项目,即:http://localhost:8080/javaee
*/
// request.getRequestDispatcher("/jsp/b.jsp").include(request, response);
/*
* 2.不以"/"开头的相对路径
* 相对于当前资源的相对路径
* 此时,当前资源的路径为:http://localhost:8080/javaee/IncludeServlet
* 所以要转发去的资源的路径以:http://localhost:8080/javaee开头
*/
request.getRequestDispatcher("jsp/b.jsp").include(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

三、资源获取路径

  获取资源的路径主要有3种,分别是ServletContext、Class和ClassLoader。其中ServletContext是WEB阶段的,Tomcat提供的一种获取资源的方式;Class和ClassLoader获取资源主要是JavaAPI提供的一种获取流的方式,

  由于这是JDK提供的,所以不仅局限于Web,在普通Java类中也可以使用,主要用于获取src目录及其子目录下的文件流。

3.1、ServletContext获取资源

  这里ServletContext获取资源的路径是相对系统的绝对路径(在Windows中是带盘符的,可以用来获取上传或下载文件的具体路径)。

  基本语法:servletContext.getRealPath("路径");参数中的路径必须是相对路径,可以“/”开头,也可以不使用“/”开头,但无论是否使用“/”开头都是相对当前应用路径,建议以"/"开头(这样可以尽量统一)。

  另外获取ServletContext的方法如下:
    1)使用request获取: request.getSession().getServletContext();
    2)在Servlet中获取:this.getServletContext();
    3)使用FilterConfig对象获取(在Filter中使用):config.getServletContext();

   ServletContext获取资源必须是相对路径,不能是绝对路径,但不管是以/开头,还是不以/开头, 都是相对于当前资源的相对路径 。  

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletContextServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path1 = this.getServletContext().getRealPath("/a.properties");
String path2 = this.getServletContext().getRealPath("a.properties");
System.out.println(path1);
System.out.println(path2);
//输出的地址一样
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

3.2、ClassLoader获取资源 

  和Class获取资源类似。只是不同的写法而已,也是用于获取文件流的。

  用法:classLoader.getResourceAsStream("路径")。参数中的路径可以以“/”开头,也可以不以“/”开头(建议)。但带不带“/”的都表示相对于当前类的路径。

  ClassLoader类加载器不能通过绝对地址来加载资源,只能通过相对地址来加载资源  但相对地址不管前面加不加/都是相当于类路径的相对地址

public class ClassLoaderServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 加了/,其地址是相对于类路径的相对地址
*/
// InputStream in = this.getClass().getClassLoader().getResourceAsStream("/cn/ccnu/classloaderpath/c.properties");
// Properties prop = new Properties();
// prop.load(in);
// System.out.println(prop.getProperty("url")); /*
* 不加/,其地址是相对于类路径的相对地址
*/
InputStream in = this.getClass().getClassLoader().getResourceAsStream("cn/ccnu/classloaderpath/c.properties");
Properties prop = new Properties();
prop.load(in);
System.out.println(prop.getProperty("url"));
/*
* 总结:不能使用绝对地址,而只能只用相对地址
* 且不管加不加/的相对地址,都是相对于类路径的相对地址
*
*/
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

3.3、Class获取资源

  Class获取资源主要是用作自己写的配置文件,用来读取内容。

  用法:clazz.getResourceAsStream("路径")。参数中的路径可以以“/”开头,也可以不以“/”开头。其中带“/”的表示相对于当前类的路径,不以“/”开头表示相对于当前class所在目录的路径。

  Class读取资源不能是绝对路径,只能是相对路径,又分为以/开头或者是不以/开头 。

public class ClassServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.以/开头的相对路径
* 此时的/代表类路径,即:/javaee/WEB-INF/classes
*/
// InputStream in = ClassServlet.class.getResourceAsStream("/cn/ccnu/classpath/b.properties");
// Properties porp = new Properties();
// porp.load(in);
// System.out.println(porp.getProperty("url"));
/*
* 2.不以/开头的相对路径
* 此时相对的是:类ClassServlet.class的路径,即:\javaee\WEB-INF\classes\cn\ccnu\classpath
* 即:/javaee/WEB-INF/classes/cn/ccnu/classpath
*/
InputStream in = ClassServlet.class.getResourceAsStream("b.properties");
Properties porp = new Properties();
porp.load(in);
System.out.println(porp.getProperty("url")); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

四、<url-pattern>路径

  这里的路径仅仅是指web.xml文件中的标签内容。这个路径是虚拟的路径,只有相对路径(相对于当前应用的路径),但相对路径的写法可以是精确查询和模糊查询。

  要么以“*”开关,要么为“/”开头,当通常情况看下,我们都会以"/"开头。

<!—精确查询,是相对于当前应用-->
<url-pattern>/servlet/testPath</url-pattern> <!—模糊查询,表示匹配servlet目录下的所有文件或请求。/*表示匹配所有-->
<url-pattern>/servlet/*</url-pattern> <!—模糊查询,表示匹配所有后缀名为do的文件或请求-->
<url-pattern>*.do</url-pattern>

五、总结

1)客户端是带“/”相对当前主机。

2)服务端(包括上述的服务端、url-pattern路径和ServletContext路径)带不带“/”都是相对当前应用(建议带上)。

3)Class带“/”是相对当前类路径。不带“/”是相对于当前位置。

4)ClassLoader无论带不带“/”都是当前类路径(建议带上)。  

喜欢就点个“推荐”哦!        

JavaWeb(七)之详解JavaWeb路径的更多相关文章

  1. 详解javaweb中jstl如何循环List中的Map数据_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 详解javaweb中jstl如何循环List中的Map数据 第一种方式: 1:后台代码(测试) List<Map& ...

  2. 一、JAVA环境变量配置详解——JavaWeb点滴

    JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH. JAVA_HOME 指向 ...

  3. java提高篇(七)-----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  4. JavaWeb之XML详解

    XML语言 什么是XML? XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是传输数据,而非显示数据. XML标签没有 ...

  5. javaweb之监听器详解

    在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...

  6. JavaWeb开发之详解Servlet及Servlet容器

    自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案.小到一个静态博客网站,大到分布式的集群应用,都 ...

  7. javaweb之Filter详解(转)

    .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...

  8. 深入分析JavaWeb Item7 -- HttpServletResponse详解

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  9. javaweb之Filter详解

    一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或 ...

随机推荐

  1. CurrentCulture和CurrentUICulture的区别

    CurrentCulture 这个属性用来表示和改变使用者要使用的“地区属性”,地区属性改变后,数字.日期时间等表示格式也随之改变. 注意:一定是“地区属性”,如"zh-cn".& ...

  2. Ubuntu操作系统下安装JDK、tomcat、mysql

    1.先从安装虚拟机开始 01.首先打开VMware虚拟机.     02.然后,进入home主页,点击"create a New Virtual Machine"一栏,就会弹出一个 ...

  3. 电商Banner设计背后的12个人性的秘密

  4. Spring Ioc DI 原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

  5. RDS最佳实践(一)—如何选择你的RDS

    在去年双11之前,为了帮助商家准备天猫双11的大促,让用户更好的使用RDS,把RDS的性能发挥到最佳,保障双11当天面对爆发性增加的压力,不会由于RDS的瓶颈导致系统出现问题,编写了 RDS的最佳实践 ...

  6. Linux下安装oracle jdk

    从官网下载对应的 .tar.gz压缩文件. 在linux某个目录下解压 到根目录下的etc文件夹下编辑profile文件,在文件的末尾加上 JAVA_HOME=/usr/local/jdk1.8.0_ ...

  7. 如何让eclipse在程序修改后,点击运行可以自动保存。

    preferences>run/debug>launching里面save required dirty editors before launching选always就自动保存咯选pro ...

  8. 201521123113 《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 设计类的技巧:类名和方法名要能够体现他们的职责,类名首字母要大写 如何识别一个类 方法.属性的 ...

  9. 201521123019 《Java程序设计》第9周学习总结

    1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...

  10. 201521123026《JAVA程序设计》第11周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 1.多线程同步:限制某个资源在同一时刻只能被一个线程访问.. 2.同步代码块:`synchronized(lock ...