SpringMVC学习笔记-07 路径地址

我们在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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值