web中“/”写在不同地方时的值不同

用法:
1.若/写在jsp中交由浏览器来解析,代表当前web站点的根路径;例:http://localhost:8080/  
         超链接:<a href="/TestServlet">Java Web</a>此时相当于:http://localhost:8080/TestServlet 
        此时是不能连接到servlet的,因为servlet不是直接部署tomcat的webapps目录下,正确的方式应该加上工程路径,即为:http://localhost:8080/shipin/TestServlet 
        表单中的action:<form action="/login.jsp" > 此时相当于:http://localhost:8080/longin.jsp 此时也是不能连接到servlet的,同上。
        请求重定向: request.sendRedirect("/login.jsp")(重定向不管写在哪里都是在浏览器做重定向嘛) 此时相当于: http://localhost:8080/longin.jsp,这个也不能访问到,相当于浏览器更换网址。
2.若/交由web服务器来解析代表当前web工程的根路径。例:/shipin/ (shipin即工程名)
        请求转发时:request.getRequestDispatcher("/chapter.jsp").forward.. 此时相当于:http://localhost/shipin/chapter.jsp,服务器内部转发
<!--web.xml 中映射servlet的访问路径时-->
<!--此时的getinRegisterServlet经过映射,实际路径为 http://localhost:8080/shipin/getinRegister,可以连接-->
<servlet-mapping> 
    <servlet-name>getinRegisterServlet</servlet-name> 
    <url-pattern>/getinRegister</url-pattern> 
</servlet-mapping>

  request.getContextPath()可获得当前web工程的根路径,例如放在标签里:<a href="<%=request.getContextPath()%>/Test3Servlet"> ,解析完后即为完整的url,http://localhost:8080/shipin/Test3Servlet

 

 

 

原理:
1.我们开发时候在浏览器中输入“http://localhost:端口号/项目名/xxx文件”请求需要的资源,
并且根据tomcat的项目都是在%tomcat根目录%/webapps文件夹下,
可得知,此时由浏览器发起的请求,
代码中的“/”表示的当前路径就应该表示的是webapps的根目录
2、由服务器发起的路径,“/”表示项目中的WebRoot根目录

 

 

 

 

 

绝对路径与相对路径:
绝对路径:web应用中的“绝对路径”是指相对于工程根目录的路径 request.getContextPath()可获得此时的路径在工程目录下,例:/shipin。最好写绝对路径getContextPath() + 具体文件相对于工程的文件夹路径,不容易出错。
相对路径:是指相对于一个文件或文件夹的路径
 
 
 
例子1:
设当前文件(即代码执行到哪个文件)为a.jsp,相对路径的作用范围:
若c.jsp处于与当前文件同一级目录:c.jsp
若c.jsp处于与当前文件同一级目录的文件夹下:/文件夹名/c.jsp
若c.jsp处于与当前文件上一级目录:../c.jsp
 
 
 
 
 
例子2:
绝对路径的反例:
把所有非字符串的的东西全部转化为字符串后,才开始解析第一个/,,非常重要,举个反例,request.getRequestDispatcher(request.getContextPath()+"/Test3Servlet").forward(request,response);
此例咋一看没啥问题,但是,先来看,把非字符串转化字符串后:/shipin/Test3Servlet,然后解析/,这是转发,/应该被解析为:/shipin/,然后最终路径就变成了:/shipin/shipin/Test3Servlet,只要/还可以解析,就会向上解析,最终变成了http://localhost/8080/shipin/shipin/Test3Servlet,显然这是错误的。这里就不能加上request.getContextPath(),只要request.getRequestDispatcher("/Test3Servlet").forward(request,response);
则/Test3Servlet被解析为/shipin/Test3Servlet,然后/shipin/Test3Servlet又被解析为http://localhost/8080/shipin/Test3Servlet.
 
 
 
例子3:
相对路径的反例:
从一个a.jsp提交请求到personServlet再转发到b.jsp,当到了personServlet时,此时的当前文件就是personServlet,所以要以personServlet为当前目录去定位b.jsp,即便a.jsp和b.jsp在同一目录下,也不能就写:b.jsp,而要写相对于personServlet的路径。而写绝对路径就没问题,顾名思义,绝对定位,不是相对的。
 
 
来自:https://www.cnblogs.com/wzdnwyyu/p/11169128.html

 

posted @ 2019-07-11 11:55  TangXinPing  阅读(335)  评论(0编辑  收藏  举报