前言

  在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的。那这一篇我给大家详细的分享一下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. 第3阶段——内核启动分析之start_kernel初始化函数(5)

    内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...

  2. Javascript学习日志(三):闭包

    说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...

  3. 学会Git

    学会Git   目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式 ...

  4. 201521123100 《Java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代 ...

  5. 201521123098 《Java程序设计》 第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1. 学习了继承的基本含义,用"class 子类名 extend 父类名" ...

  6. 201521123093 java 第四周学习总结

    1.平面作业 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1.类与方法的注释 2.super关键字代表的是父类,super.方法表示调用的是父类 2. ...

  7. ★★★★[转载]Python学习笔记一:数据类型转换★★★★

    一.int函数能够     (1)把符合数学格式的数字型字符串转换成整数     (2)把浮点数转换成整数,但是只是简单的取整,而非四舍五入. 举例: 1 aa = int("124&quo ...

  8. 201521123097《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synch ...

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

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? fin ...

  10. Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】

    前言 上篇Spring博文主要引出了为啥我们需要使用Spring框架,以及大致了解了Spring是分为六大模块的-.本博文主要讲解Spring的core模块! 搭建配置环境 引入jar包 本博文主要是 ...