SpringMVC框架入门(三)---解读<url-pattern/>

本文介绍了SpringMVC框架中url-pattern的配置,讲解了使用*.do和/的区别,以及如何处理使用/时访问静态资源的问题。通过<mvc:default-servlet-handler/>和<mvc:resources/>两种方式解决静态资源访问问题,并探讨了路径问题,包括相对地址、绝对地址的使用场景和注意事项。

目录

第三章、解读url-pattern

3.1 配置详解

3.1.3 *.do

3.1.2 /

3.2 使用/时访问静态资源文件的方式

3.2.1 添加静态资源文件

3.2.2 index.jsp文件

3.2.3 Controller对象

3.2.4 第一种解决方式---使用

3.2.5 第二种解决方式---使用

3.3 路径问题

3.3.1 地址分类


第三章、解读url-pattern

3.1 配置详解

3.1.3 *.do

   在没有特殊要求的情况下,SpringMVC的中央调度器DispatcherServlet的<url-pattern/>常使用后辍匹配方式,如写为*.do 或者 *.action, *.mvc 等。这种方式可以访问静态资源文件

3.1.2 /

   可以写为/,因为DispatcherServlet会将向静态资源的获取请求,例如.css、.js、.jpg、.png等资源的获取请求,当作是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源获取请求也均会报404错误

3.2 使用/时访问静态资源文件的方式

3.2.1 添加静态资源文件

3.2.2 index.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
</head>
<body>
    <form action="some.do" method="post">
        姓名:<input type="text" name="name"/><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="submit" value="提交参数"/><br/>
    </form>
    <br/>
    <img src="image/blackpink.png" alt="我是一个静态资源文件,不能显示">
</body>
</html>

3.2.3 Controller对象

@Controller
public class  MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name,Integer age){
        System.out.println("doSome,name = " + name + ",age = " + age);
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }
}

3.2.4 第一种解决方式---使用<mvc:default-servlet-handler/>

   声明了<mvc:default-servlet-handler/>后,springmvc框架会在容器中创建DefaultServletHttpRequestHandler处理器对象。它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理。一般的服务器都有默认的Servlet。

   在Tomcat中,有一个专门用于处理静态资源访问的Servlet名叫DefaultServlet。其<servlet-name/>为default。可以处理各种静态资源访问请求。该Servlet注册在Tomcat服务器的web.xml文件中,该文件位于Tomcat安装目录/conf/web.xml。

   DefaultServlet的作用:The default servlet for all web applications, that serves static resources. It processes all requests that are not mapped to other servlets with servlet mappings (defined either here or in your own web.xml file).

        ①处理静态资源文件

        ②处理未映射到其他servlet的请求。  

        /就表示静态资源和未映射的请求都由这个default来处理。

   此时自己定义的项目中的web.xml文件中也使用了"/",会替换掉Tomcat的default。导致无法访问静态资源文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>myWeb</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--自定义springmvc读取的配置文件的位置-->
        <init-param>
            <!--springmvc的配置文件的位置的属性-->
            <param-name>contextConfigLocation</param-name>
            <!--指定自定义文件的位置-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>myWeb</servlet-name>
        <!--
            使用框架的时候,url-pattern可以使用两种值
            1.使用扩展名方式,语法*.xxxx,xxxx是自定义的扩展名。常用的方式 *.do, *.action, *.mvc等等
              http://localhost:8080/myWeb/some.do
              http://localhost:8080/myWeb/other.do

            2.使用斜杠"/"
              当你的项目中使用了/,会替代tomcat中的default
              导致所有的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力。
              没有控制对象能处理静态资源的访问。所以静态资源(js,html,图片,css)都是404

              动态资源some.do是可以访问的,因为我们程序中有MyController控制器对象,能处理some.do请求。
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

   在SpringMVC的配置文件中增加设置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--声明组件扫描器-->
    <context:component-scan base-package="com.bjpowernode.controller"/>

    <!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--注解驱动-->
    <!--default-servlet-handler和@RequestMapping注解有冲突,需要加入annotation-driven解决问题-->
    <mvc:annotation-driven />

    <!--第一种处理静态资源的方式:
        需要在springmvc配置文件加入<mvc:default-servlet-handler>
        原理是:加入这个标签后,框架会创建控制其对象DefaultServletHttpRequestHandler(类似我们自己创建的MyController)
        DefaultServletHttpRequestHandler这个对象可以把接收的请求转发给tomcat的default这个servlet。
        会有一个转发行为转发给tomcat的default
        RequestDispatcher rd = request.getRequestDispatcher("");
        rd.forward(request,response);
        (request.getRequestDispatcher("").forward(request,response);)
    -->
    <mvc:default-servlet-handler/>
</beans>

3.2.5 第二种解决方式---使用<mvc:resources/>

   在Spring3.0版本后,Spring定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了<mvc:resources/>标签,专门用于解决静态资源无法访问问题。需要在 springmvc 配置文件中添加如下形式的配置:     

        location:表示静态资源所在目录。当然,目录不要使用/WEB-INF/及其子目录

        mapping:表示对该资源的请求(以/images/开始的请求如/image/beauty.jpg、/images/car.png

      等)。注意,后面是两个星号**。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--声明组件扫描器-->
    <context:component-scan base-package="com.bjpowernode.controller"/>

    <!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--第二种处理静态资源的方式:
        mvc:resources:加入框架会创建ResourceHttpRequestHandler这个处理器对象
                       让这个对象处理静态资源的访问,不依赖tomcat服务器。
        mapping:访问静态资源文件的uri地址,使用通配符**
        location:静态资源在你的项目中的目录位置。

        image/**:表示image/p1.jpg, image/user/logo.gif, image/order/history/list.png等

    -->
    <mvc:resources mapping="/image/**" location="/image/"/>
    <mvc:resources mapping="/html/**" location="/html/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>

    <!--使用一个配置语句,指定多种静态资源的访问-->
    <!--<mvc:resources mapping="/static/**" location="/static/"/>-->

    <!--mvc:resources和@RequestMapping有一定的冲突,解决方式加注解驱动-->
    <mvc:annotation-driven/>
</beans>

3.3 路径问题

   解决jsp页面中的路径问题,用"/"还是不用。

   有一个Controller对象:

@Controller
public class MyController {
    @RequestMapping(value = "/user/some.do")//第一个"/"代表项目的根
    public ModelAndView doSome(HttpServletRequest request){
        ModelAndView mv = new ModelAndView();

        mv.addObject("msg","欢迎使用springmvc做web开发" + request.getParameter("name"));
        mv.addObject("fun","执行的是doSome方法");

        mv.setViewName("show");

        return mv;
    }
}

3.3.1 地址分类

   1.绝对地址带有协议名称开头的。如:http://www.baidu.com   ftp://202.122.23.1

   2.相对地址:没有协议开头的,如:user/some.do   /user/some.do

        相对地址不能独立使用,必须有一个参考地址,通过参考地址+相对地址本身才能指定资源。

        在jsp、html中使用的地址,都是在前端页面中的地址,都是相对地址。

   3.参考地址:http://localhost:8080/myWeb/就可以作为参考地址。

        ①在你的页面中的,访问地址不加"/"

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="user/some.do">发起user/some.do的get请求</a></p><br/>
</body>
</html>

        比如访问:http://localhost:8080/myWeb/index.jsp

                路径:http://localhost:8080/myWeb/

                资源:index.jsp

        在index.jsp页面发起user/some.do请求,访问地址变为http://localhost:8080/myWeb/user/some.do

                当你的地址没有/开头,例如user/some.do,当你点击链接时,访问地址是当前页面的路

              径地址http://localhost:8080/myWeb/加上链接的地址

                参考地址是http://localhost:8080/myWeb/。

        在这种情况下,如果将some.do方法的返回视图设置为index.jsp,此时再点击一次链接发起

      user/some.do请求,此时访问地址会变为http://localhost:8080/myWeb/user/user/some.do导致

      访问失败,此时的路径地址变为http://localhost:8080/myWeb/user/

        解决方案:

                1.加入${pageContext.request.contextPath};

                2.加入一个base标签,是HTML语言中的标签,表示当前页面中访问地址的基地址。页

              面中所有没有"/"开头的地址,都是以base标签中的地址作为参考地址的。

                        使用base中的地址+user/some.do组成访问地址。

<%@ 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>
    <p>第一个springmvc项目</p>
    <p><a href="user/some.do">发起user/some.do的get请求</a></p><br/>
    <p><a href="${pageContext.request.contextPath}/user/some.do">发起user/some.do的get请求</a></p><br/>

</body>
</html>

        ②在你的页面中,访问地址加"/"

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="/user/some.do">发起/user/some.do的get请求</a></p><br/>
</body>
</html>

         比如访问:http://localhost:8080/myWeb/index.jsp

                路径:http://localhost:8080/myWeb/

                资源:index.jsp

        在index.jsp页面发起/user/some.do请求,访问地址变为http://localhost:8080/user/some.do

                参考地址是服务器地址http://localhost:8080,此时访问也有问题。

                要将前端文件中的地址改为:这种方式不灵活,项目名字固定了,如果之后修改项目名

              称,也要修改对应的前端文件中的地址,可以利用EL表达式进行改进。加入${pageContext.request.contextPath}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="/myWeb/user/some.do">发起/user/some.do的get请求</a></p><br/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="${pageContext.request.contextPath}/user/some.do">发起user/some.do的get请求</a></p><br/>

</body>
</html>

PS:根据动力节点课程整理,如有侵权,联系删除。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值