本篇博客的目的是:在【OA系统十七:请假功能四:编写Controller代码;(实现请假申请的控制器;仅仅涉及新增部分的Controller代码)】中的遇到了【String uri = request.getRequestURI();】,而对【String uri = request.getRequestURI();】有点不清楚;本篇博客就是为了详细阐述这个问题的。
本篇博客参考和转载的博客有:【request.getRequestURL()和request.getRequestURI()的区别】,【getContextPath、getServletPath、getRequestURI、getRealPath、getRequestURL、getPathInfo();的区别】,【URI和URL的区别比较与理解】;
目录
一: getContextPath、getServletPath、getRequestURI、getRequestURL、getRealPath、getPathInfo的区别
(1)getContextPath():返回上下文路径(也就是工程名);
(2)getServletPath():返回除去host和工程名部分的路径;
(3)getRequestURI():返回除去host(域名或者ip)部分的路径;
(4)getRequestURL():返回的整个URL的路径请求;
(5)getRealPath():返回的文件所在的绝对路径,相对于当前计算机的真实路径
(6)getPathInfo():这个方法返回请求的实际URL相对于请求的serlvet的url的路径。
一个案例:这个案例是在【OA系统十七:请假功能四:编写Controller代码;(实现请假申请的控制器;仅仅涉及新增部分的Controller代码)】中的项目中演示的
一: getContextPath、getServletPath、getRequestURI、getRequestURL、getRealPath、getPathInfo的区别
本部分参考自:request.getRequestURL()和request.getRequestURI()的区别和getContextPath、getServletPath、getRequestURI、getRealPath、getRequestURL、getPathInfo();的区别;
(1)getContextPath():返回上下文路径(也就是工程名);
● 比如某个web工程的工程名是:testWebProject,而且web工程的上下文路径也设置成了/testWebProjec,,那么getContextPath()方法的返回值就是/testWebProjec;
● 如果我们把工程的映射为/,那么getContextPath()方法的返回值就是空;
……………………………………………………
(2)getServletPath():返回除去host和工程名部分的路径;
比如某个web工程的工程名是hahaha,然后这个工程的上下文路径我们也设置成了/hahaha;
● 当访问某个url为ppp的Servlet的时候,getServletPath()返回值就是/ppp;(访问url是:http://localhost:8080/hahaha/ppp;getServletPath()返回值是/ppp)
● 当访问工程的resource目录下的login.jsp这个文件的时候,getServletPath()返回值就是/resource/login.jsp;(访问url是:http://localhost:8080/hahaha/login.jsp;getServletPath()返回值是/resource/jsp)
比如某个web工程的工程名是hahaha,然后这个工程的上下文路径我们也设置成了空;
● 当访问某个url为ppp的Servlet的时候,getServletPath()返回值就是/ppp;(访问url是:http://localhost:8080/ppp;getServletPath()返回值是/ppp)
● 当访问工程的resource目录下的login.jsp这个文件的时候,getServletPath()返回值就是/resource/login.jsp);(访问url是:http://localhost:8080/login.jsp;getServletPath()返回值是/resource/jsp)
……………………………………………………
(3)getRequestURI():返回除去host(域名或者ip)部分的路径;
比如某个web工程的工程名是hahaha,然后这个工程的上下文路径我们也设置成了/hahaha;
● 当访问某个url为ppp的Servlet的时候,getRequestURI()返回值就是/hahaha/ppp;(访问url是:http://localhost:8080/hahaha/ppp;getRequestURI()返回值是/hahaha/ppp)
● 当访问工程的resource目录下的login.jsp这个文件的时候,getRequestURI()返回值就是/hahaha/resource/login.jsp;(访问url是:http://localhost:8080/hahaha/login.jsp;getRequestURI()返回值是/hahaha/resource/jsp)
比如某个web工程的工程名是hahaha,然后这个工程的上下文路径我们也设置成了空;
● 当访问某个url为ppp的Servlet的时候,getRequestURI()返回值就是/ppp;(访问url是:http://localhost:8080/ppp;getRequestURI()返回值是/ppp)
● 当访问工程的resource目录下的login.jsp这个文件的时候,getRequestURI()返回值就是/resource/login.jsp);(访问url是:http://localhost:8080/login.jsp;getRequestURI()返回值是/resource/jsp)
……………………………………………………
(4)getRequestURL():返回的整个URL的路径请求;
访问url是:http://localhost:8080/hahaha/ppp;getRequestURL()返回值是http://localhost:8080/hahaha/ppp;
访问url是:http://localhost:8080/login.jsp;getRequestURL()返回值是http://localhost:8080/hahaha/login.jsp;
……………………………………………………
(5)getRealPath():返回的文件所在的绝对路径,相对于当前计算机的真实路径
getRealPath()方法返回的就是文件在本地的实际路径;
……………………………………………………
(6)getPathInfo():这个方法返回请求的实际URL相对于请求的serlvet的url的路径。
这一条的真实作用不太明确~~~
……………………………………………………
一个案例:这个案例是在【OA系统十七:请假功能四:编写Controller代码;(实现请假申请的控制器;仅仅涉及新增部分的Controller代码)】中的项目中演示的
创建TestURIURLServlet:(声明:imooc-oa项目的上下文路径设置成空了;)
然后,Servlet的目录层次和url为:
、
package com.imooc.oa.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestURIURLServlet",urlPatterns = "/hehehe")
public class TestURIURLServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("getContextPath:" + request.getContextPath());
System.out.println("getServletPath" + request.getServletPath());
System.out.println("getRequestURI():" + request.getRequestURI());
System.out.println("getRequestURL()" + request.getRequestURL());
System.out.println("" + request.getRealPath("/"));
System.out.println("getPathInfo()" + request.getPathInfo());
}
}
访问这个Servlet后:
运行结果:
getContextPath:
getServletPath/hehehe
getRequestURI():/hehehe
getRequestURL()http://localhost/hehehe
E:\java\imooc-oa\out\artifacts\imooc_oa_Web_exploded\
getPathInfo()null
二:URI和URL的区别(这部分没必要深究,瞅一眼就行)
这部分转载自:URI和URL的区别比较与理解,该博文的博主是:【风一样的美代码】;
这部分可以辅助理解第一部分【一: getContextPath、getServletPath、getRequestURI、getRequestURL、getRealPath、getPathInfo的区别】的内容。
(1)URI
URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。
URI的结构组成:URI通常由三部分组成:
① 资源的命名机制;
② 存放资源的主机名;
③ 资源自身的名称。
(注意:这只是一般URI资源的命名方式,只要是可以唯一标识资源的都被称为URI,上面三条合在一起是URI的充分不必要条件)
URI举例:如:https://blog.csdn.net/qq_32595453/article/details/79516787;我们可以这样解释它:
① 这是一个可以通过https协议访问的资源;(自然除了【通过https协议访问的资源】外,还有其他类资源啦;;;很容易理解,https协议仅仅是沧海一粟啦;资源千千万,https的资源仅仅是一类而已。)
② 位于主机 blog.csdn.net上,
③ 通过“/qq_32595453/article/details/79516787”可以对该资源进行唯一标识(注意,这个不一定是完整的路径)
注意:以上三点只不过是对实例的解释,以上三点并不是URI的必要条件,URI只是一种概念,怎样实现无所谓,只要它唯一标识一个资源就可以了
……………………………………………………
(2)URL
URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位 符”。通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL是URI概念的一种实现方式。
URL的一般格式为(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
自然协议有很多种:
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“://”符号隔开,
第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
……………………………………………………
(3)URI和URL的区别
从上面的例子来看,你可能觉得URI和URL可能是相同的概念,其实并不是,URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。