URL中的访问路径如何设置?
访问路径与资源名称
通常的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, 所以这种方式要求页面中的请求不能以斜杆开头.
原文链接:blog.csdn.net/litianxiang_kaola/article/details/86485484