我们在jsp、html中使用的地址,都是在前端页面中的地址,这种不以协议开头的地址是相对地址:
我们使用域名访问网络上的网页如:https://www.baidu.com,这种带有协议名称的地址是绝对地址。
SpringMVC中相对地址会通过当前地址(参考地址)+相对地址拼接出绝对地址进行访问:
1. 相对地址不以/开头:
项目启动后,浏览器的地址栏url就是我们的参考地址:http://localhost:8080/SpringMVC_01/,相对地址通过拼接得到绝对地址:
2. 以/开头的相对地址
我们发现此时项目的参考地址变成了http://localhost:8080,拼接之后访问的资源路径是不对的。实际上以/开头的相对地址,他所采用的参考地址是主机名,缺少了项目名;如果一定要用这种方式,需要加上项目名(使用EL表达式动态获取):
3. 优势比较
尽管看上去不以/开头的方式要简单,但是也有缺点,我们不使用视图解析器,让页面跳回到index.jsp:
@RequestMapping(value = "/some.do" , method = RequestMethod.GET)
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-get");
modelAndView.setViewName("/index.jsp");
return modelAndView;
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!--声明组件扫描器-->
<context:component-scan base-package="com.zzt.Controller"/>
<!--配置视图解析器-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>-->
<!--配置注解驱动-->
<mvc:annotation-driven/>
<!--静态资源处理 方式1
<mvc:default-servlet-handler/>-->
<!--静态资源处理 方式2-->
<mvc:resources mapping="/static/**" location="/static/" />
</beans>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="test/some.do">发起some.do请求</a>
</body>
</html>
注意SpringMVC采用的是forward的方式,因此url是不会随着跳转而改变的,这时候,这个地址可以被解析成如下:
参考路径:http://localhost:8080/SpringMVC_02/test/
资源:some.do
此时如果我们再发起一次请求会如何?
我们使用的是不以/开头的方式,可是我们发起第二次请求时,参考路径和第一次并不相同,通过拼接,在http://localhost:8080/SpringMVC_02/test/的后面添加上资源的相对地址test/some.do,就得到了http://localhost:8080/SpringMVC_02/test/test/some.do,而这个显然没有任何映射与之对应,也不是静态资源。
解决办法1:加入动态的项目名
<a href="${pageContext.request.contextPath}/test/some.do">发起some.do请求</a>
解决办法2:采用html中的<base>标签,固定基地址,所有不以/开头的相对地址都会以基地址为参考地址
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="http://localhost:8080/SpringMVC_02/">
</head>
<body>
<a href="test/some.do">发起some.do请求</a>
</body>
</html>
当然了,我们也不可能为每个页面都单独写一个base标签的基地址,因此,我们也可以在jsp中动态获取项目地址:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath = request.getScheme()+ "://" +
request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/";
%>
<html>
<head>
<title>Title</title>
<base href="<%=basePath%>" />
</head>
<body>
<a href="test/some.do">发起some.do请求</a>
</body>
</html>