1:使用ajax发送请求,不加/
$(function () {
$("button").click(function () {
$.ajax({
// url:"ajax.do",
url:"getString.do",
data:{name:"张三",age:12},
type:"post",
dataType:"json",
success:function (resp){
alert("姓名:"+resp.name+" 年龄:"+resp.age);
// alert(resp)
}
})
})
})
看请求的内容:
请求 URL: http://localhost:8082/springmvc_review_war_exploded/getString.do
请求方法: POST
状态代码: 200
远程地址: [::1]:8082
引用站点策略: strict-origin-when-cross-origin
说明一下:http://localhost:8082/springmvc_review_war_exploded/是我们项目的路径
这种访问是可以的!就是说我们不加 ”/“ 的话默认的路径是从当前的路径开始加载。也就是从http://localhost:8082/springmvc_review_war_exploded/开始拼接,当前路径是url中的最后一个/开始到最前面。
2:我们修改ajax的请求路径:加一个/
$(function () {
$("button").click(function () {
$.ajax({
// url:"ajax.do",
url:"/getString.do",
data:{name:"张三",age:12},
type:"post",
dataType:"json",
success:function (resp){
alert("姓名:"+resp.name+" 年龄:"+resp.age);
// alert(resp)
}
})
})
})
此时请求的路径:
请求 URL: http://localhost:8082/getString.do
请求方法: POST
状态代码: 404
远程地址: [::1]:8082
引用站点策略: strict-origin-when-cross-origin
可以看出此时的路径就会出现问题,404,因为带了“/“的话就会是以不带项目名的路径往后面拼接访问地址:http://localhost:8082/是到我们端口号前面的路径,从这里开始拼接,所以就会出现404.
3:假如我们在index界面中加入一个超链接,还返回到本界面,这时候因为没有加 /,是项目的相对路径和1的情况相同。可以返回。
jsp中的代码
<a href="urltest.do">还返回本界面</a>
控制层中的代码:
@RequestMapping(value = "/urltest.do")
// @ResponseBody
public String urlTest(){
return "index.jsp";
}
此时测试发现点击这个多次也没有问题,每次都可以访问。
那么假如我们修改一下
<a href="test/urltest.do">还返回本界面</a>
@RequestMapping(value = "/test/urltest.do")
public String urlTest(){
return "index.jsp";
}
这个时候我们再访问就会出现问题,
类型 状态报告
消息 文.件[/test/index.jsp] 未找到
描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
先看一下我们当前请求的url:
请求 URL: http://localhost:8082/springmvc_review_war_exploded/test/urltest.do
请求方法: GET
状态代码: 404
远程地址: [::1]:8082
引用站点策略: strict-origin-when-cross-origin
还是因为相对路径有一个test所以即使return "index.jsp";
还是会加一个http://localhost:8082/springmvc_review_war_exploded/test/
所以报错中说/test/index.jsp找不到
假如我们再把java代码返回值加一个/如下:
@RequestMapping(value = "/test/urltest.do")
public String urlTest(){
return "/index.jsp";
}
测试:这时候第一访问可以访问得到:
请求 URL: http://localhost:8082/springmvc_review_war_exploded/test/urltest.do
请求方法: GET
状态代码: 200
远程地址: [::1]:8082
引用站点策略: strict-origin-when-cross-origin
但是返回到此界面之后我们再次点击返回此界面:
请求 URL: http://localhost:8082/springmvc_review_war_exploded/test/test/urltest.do
请求方法: GET
状态代码: 404
远程地址: [::1]:8082
引用站点策略: strict-origin-when-cross-origin
你看它又多加了一个test,所以还是相对路径的问题。有同学说了我们java中返回的不是绝对路径吗?
要注意,我们返回到原来的jsp页面,因为我们是通过jsp页面向服务器发送请求,此时jsp中用的是相对路径,而我们第一次访问的时候已经将当前页面的路径加了一个test,导致再次点击的时候用相对路径就会多加一个test。
那我们用绝对路径是不是可以呢?
我们把jsp的代码改成这样:
<a href="/springmvc_review_war_exploded/test/urltest.do">还返回本界面</a>
发现这样即使多次点击也能够返回,这样问题不就解决了吗?
但是我们还可以再优化一下,因为我们这里项目名是写死的,是不是耦合度太高了?
可以用base标签:
注释:<base> 标签必须位于 head 元素内部。
必需的属性:href URL 规定页面中所有相对链接的基准 URL。
可选的属性:指定在何处打开页面中所有的链接。
target
_blank
_parent
_self
_top
framename
我们仍然可以用相对路径
<a href="test/urltest.do">还返回本界面</a>
不过要假如base标签如下:
<%
String path = request.getContextPath();
// 获得项目完全路径(假设你的项目叫MyProject,那么获得到的地址就是 http://localhost:8080/MyProject/):
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
这时候即使多次点击也不会出现问题了,而且也不会因为项目名修改而造成大量修改源代码的情况了。