实际编码中我们经常写路径,写路径既可以写相对路径,也可以写绝对路径。我2年以前我就养成了习惯,只要是写路径我从来都是写绝对路径,因为万一将来我们的项目的目录发生变化,原来要是写相对路径的话就会有路径依赖关系,改的地方太多了。而且相对路径在某些情况下还有点特殊,有的是相对于原来的请求的目录,有的是相对于整个web应用,所以我强烈建议大家以后写路径统一用绝对路径(以“/”开头)来写,“/”表示站点的根路径。



写路径的情况无非下面4种情况,这里做一个整理。



  • 1,超链接

假设使用下面的目录结构:

           

当前的请求路径:http://localhost:8080/linkin/Linkin.html或者http://localhost:8080/linkin/Linkin.jsp

相对路径:

1,我们来看看在linkin.html中引入linkin.js和linkin.html文件相对路径应该怎么写?

<span style="white-space:pre">	</span><script type="text/javascript" src="../scripts/linkin.js"></script>
<link rel="stylesheet" type="text/css" href="../styles/linkin.css">

2,如果在linkin.jsp中引入linkin.js和linkin.html文件相对路径应该怎么写?

<span style="white-space:pre">	</span><script type="text/javascript" src="scripts/linkin.js"></script>
<link rel="stylesheet" type="text/css" href="styles/linkin.css">

注意:上面的html文件和jsp文件引入静态资源相对路径还不一样,记住下面的一句话,如果是在服务器上直接运行的静态资源比如html文件引入别的静态资源这里的“相对”就是物理意义上的相对,如果是在服务器上要跳转的这种视图资源比如jsp文件引入别的静态资源这里的“相对”是相对于上整个web工程的相对,2者不同的。



绝对路径:以“/”开头,“/”表示根目录,之后从项目名依次开始写。

<script type="text/javascript" src="/linkin/scripts/linkin.js"></script>

<link rel="stylesheet" type="text/css" href="/linkin/styles/linkin.css">



  • 2,表单提交

当前的请求路径:http://localhost:8080/linkin/Linkin.jsp

相对路径:<form action="LinkinServlet" method="POST">

绝对路径:<form action="/linkin/LinkinServlet" method="POST">

  • 3,重定向

当前请求路径:http://localhost:8080/linkin/LinkinServlet

相对路径:resp.sendRedirect("jsp/Linkin1.jsp");

绝对路径:resp.sendRedirect("/linkin/jsp/Linkin1.jsp");

  • 4,转发

当前请求路径:http://localhost:8080/linkin/LinkinServlet

相对路径:req.getRequestDispatcher("jsp/Linkin1.jsp").forward(req, resp);

绝对路径:req.getRequestDispatcher("/jsp/Linkin1.jsp").forward(req, resp);



总结:

1,尽管我们不怎么写相对路径,但是难免会维护别人的代码,所以还是要了解一下的。如果在超链接中使用了到了相对路径,如果要是没有服务器跳转,比如html这些文件,则相对就是文件所在的目录,要是经过了服务器跳转,比如jsp这些文件或者通过XXX.do跳转到的页面上的话,这里的相对是相对于整个web应用,不一样的。



2,绝对路径比较好,以后我们写路径都直接写绝对路径就好。除了转发,绝对路径的开头“/”代表域名之后的东西,也就是说相当于省去了整个url上面的主机IP和端口号而已,项目名称还是要写的。转发是唯一一个比较特殊的,因为转发本身就是在web应用内部跳转的,所以不能写项目名称,直接从项目名称后面开始写。

  • 如果还不理解,请好好理解下面这句话:

传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher 对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。



3,如果有代码洁癖的人在写绝对路径的时候,不想在jsp出现项目名称这种硬码,怎么办呢?用<%=request.getContextPath()%>来代替,比如:

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/common.css" />
<script type="text/javascript" src="<%=request.getContextPath()%>/jquery/base/jquery-1.8.0.js"></script>
  • 最后统一来整理下请求路径:

请求路径是把请求导向到一个 servlet 来响应服务。它是由几个重要的部分来组成的。  通过 HttpRequest 对象,暴露了如下信息(对照应用的目录结构):

1)上下文路径(Context Path) 

该路径的前缀是和 ServletContext 相关的。如果 Context 就是 Web 服务器的 URL 命名空间的缺省的根上下文时,那么上下文路径将会是一个空的字符串。    如果上下文并不是服务器的命名空间的根,则上下文路径就以“/”开始,但不能以“/”结束。

2)Servlet 路径(Servlet Path) 

该路径就是直接与激活该请求的相应映射,它也是以“/”开头。但要注意的是,如果指定的请求是与“/*”模式相匹配,则此时 Servlet 路径就是一个空字符串。

3)路径信息(PathInfo) 

请求路径中除了上下文路径和 Servlet 路径以外的部分。当没有额外的路径时路径信息就是空的(null),或者它会以“/”开始的字符串。  在 HttpServletRequest 接口中定义如下的方法来访问请求路径的相应信息:getContextPath(); getServletPath(); getPathInfo();    值得注意的是,请求 URI 和路径的各部分之间的 URL 编码的不同之外,下面的等式恒成立:    requestURI = contextPath + servletPath
+ pathInfo

Servlet--超链接,表单提交,重定向,转发4种情况的路径的更多相关文章

  1. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

    MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交

  2. Java EE之servlet处理表单提交的请求

    1.在源包下新建一个Servlet页,取名为LoginServlet: package weinidingServlet;                            //该Servlet所 ...

  3. Servlet实现表单提交(MyEclipse10,Tomcat7.0,JDK1.7,)——Java Web练习(一)

    1.MyEclipse|File|New|Project|Web Project    填写Project Name:exServlet,点选Java EE 6.0(配套Tomcat7.0) 2.代码 ...

  4. Form表单提交数据的几种方式

    一.submit提交 在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type='submit'>)就可以进行数据的提交, ...

  5. form 表单提交的另一种方式 js

    <html> <head> <script type="text/javascript"> function formSubmit() { fm ...

  6. Struts2_day02--Action获取表单提交数据

    Action获取表单提交数据 1 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap 2 ...

  7. AngularJS 表单提交后显示验证信息与失焦后显示验证信息

    虽然说AngularJS的实时表单验证非常有用,非常高效方便,但是当用户还没有完成输入时便弹出一个错误提示,这种体验是非常糟糕的. 正常的表单验证逻辑应该是在用户提交表单后或完成当前字段中的输入后,再 ...

  8. Servlet--表单、超链接、转发、重定向4种情况的路径

    Servlet中相对路径总结 假设web工程使用如下目录结构: 在介绍相对路径和绝对路径前需要先了解几个概念: 服务器的站点根目录:以tomcat服务器为例,tomcat服务器站点根目录就是apach ...

  9. JSP怎么将表单提交到对应的servlet

    昨天学习了这些内容,今天做一下分享吧,个人感觉挺乱的....呵呵,其实没事,慢慢就好了.难的不会,会的不难嘛!努力+认真就可以了,相信大家都可以的!加油!!! 下面的图是我用myeclipse建立的项 ...

随机推荐

  1. C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...

  2. mysql foreign key(外键) 说明与实例

    一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...

  3. 【ASP.NET Core】准备工作:在 Windows 10 上配置 Linux 子系统

    ASP.NET Core 其实比传统的 ASP.NET 要简单很多,而且也灵活很多,并且可以跨平台独立运行. 在 Windows 平台上,我们只要在安装 Visual Studio 的时候选择跨平台的 ...

  4. 基于input子系统的sensor驱动调试(一)

    要想弄明白世界的本质,就要追根溯源:代码也是一样的道理: 最近调试几个sensor驱动,alps sensor驱动.compass sensor驱动.G-sensor驱动都是一样的架构: 一.基于in ...

  5. Codeforces 833E Caramel Clouds

    E. Caramel Clouds time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...

  6. Vijos P1114 FBI树【DFS模拟,二叉树入门】

    描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种 ...

  7. float浮动属性的基本常识

    CSS 浮动 请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘: 再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边 ...

  8. ECharts 环形饼图 动态获取json数据

    ECharts  环形饼图 动态获取json数据 效果图如下: 一.html部分 <div id="secondPieChart" style="width:100 ...

  9. 【android studio】 gradle配置成本地离线zip包

    http://blog.csdn.net/jingleye/article/details/52689260       关键词:distributionUrl修改成本地路径,android stud ...

  10. CSS鼠标样式 cursor 属性

    值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器 ...