访问路径与资源名称

通常的URL资源路径由两部分构成:访问路径与资源名称. 资源名称指的是要访问资源的直接名称, 如show.jsp, 或与要访问资源存在映射关系的间接名称, 如show.do. 而访问路径, 则是通过该路径可以定位到指定的资源, 即在URL资源访问路径中除了资源名称以外的其他部分. 一般情况下, 在URL访问路径中, 最后一部分为资源名称, 而其他部分则为访问路径.

如下面的URL:

http://localhost:8080/ssm/show.do

其中 http://localhost:8080/ssm 为访问路径, show.do为资源名称.

<body>
    <a href="xxx/ooo/show.do">跳转到show页面</a>
</body>

其中 xxx/ooo/ 为访问路径, show.do为资源名称.

根据"访问路径是否可以独立完成资源准确定位"的判别标准, 可以将访问路径分为绝对路径与相对路径.

绝对路径

绝对路径, 是指根据给出的访问路径可以准确定位到资源的路径. Web应用的绝对路径是指带访问协议的路径, 如:

http://localhost:8080/ssm/show.do

相对路径

相对路径是指根据访问路径无法准确定位到资源的路径. 因为只有绝对路径才能定位到资源, 所以当资源的路径是相对路径时, 我们的首要任务是找到参照路径, 然后将参照路径和相对路径拼接成绝对路径.

在Web应用中, 相对路径的写法有两种: 以斜杆开头的相对路径和不以斜杆开头的相对路径.

以斜杆开头的相对路径

以斜杆开头的相对路径, 根据路径所在文件所处位置的不同, 又分为前端路径和后端路径.

(1) 前端路径

前端路径是指由浏览器解析执行的代码中所包含的路径, 如html, css, js, 及jsp中的静态路径. 前端路径的参照路径是Web服务器的根路径, 即 http://localhost:8080/

(2) 后端路径

后端路径是指由服务器解析执行的代码及文件中所包含的路径, 如Java代码中的路径, jsp中的动态路径(Java代码块中的路径), xml文件中的路径等. 后端路径的参照路径是Web应用的根路径, 即: http://localhost:8080/ssm/

注意, response.sendRedirect("") 中的路径为前端路径, 因为重定向是把URL发送给客户端, 客户端再次向服务器发送请求. 所以在后台代码中要重定向到show.jsp页面时, 代码如下:

response.sendRedirect("show.jsp");
或 response.sendRedirect(request.getContextPath + "/show.jsp");

不以斜杆开头的相对路径

不以斜杆开头的相对路径, 无论是前端路径还是后端路径, 其参照路径都是当前资源的访问路径, 而不是当前资源的保存路径.

路径常见问题

(1) 为什么页面超链接的href属性值加上斜杆会报错?

<body>
    <a href="/show.do">跳转到show页面</a>
</body>

因为超链接上的路径为前端路径, 其参照路径为 http://localhost:8080/ ,拼接为绝对路径后为 http://localhost:8080/show.do , 但该资源真正的绝对路径为 http://localhost:8080/ssm/show.do , 解决办法如下:

<body>
    <a href="${pageContext.request.contextPath}/show.do">跳转到show页面</a>
</body>

(2)为什么点击超链接跳转到自身后再点击会报错?

Controller代码

@RequestMapping("/test/show.do")
public ModelAndView doShow() {
    return new ModelAndView("/index.jsp");
}

index页面

<body>
	<a href="test/show.do">跳转</a>
</body>

index页面的路径为 http://localhost:8080/ssm/index.jsp , 当点击第一次时绝对路径为 http://localhost:8080/ssm/test/show.do , 点击第二次时绝对路径为 http://localhost:8080/ssm/test/test/show.do , 解决办法如下:

<body>
    <a href="${pageContext.request.contextPath}/show.do">跳转</a>
</body>

或者

<%
    String path = request.getContextPath();
    String bathPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <base href="<%=bathPath%>">
</head>
<body>
	<a href="test/show.do">跳转</a>
</body>
</html>

页面中的< base>标签, 会在当前页面的所有资源请求路径前加上< base>标签内的路径, 将相对路径变成绝对路径. 该方式实际上是修改了不带斜杆的相对路径的参照路径, 将其修改为了basePath, 所以这种方式要求页面中的请求不能以斜杆开头.

02-12 02:37