再解spring mvc中url-pattern的写法

设置url-pattern为*.do

之前我们在web.xml文件中配置DispatcherServlet的时候,将url-pattern配置为*.do的方式,其实除了这种方式之外你还可以配置为其他任意方式:

*.action
*.abc
*.123

只要你的请求url中包含配置的url-pattern,该url就可以到达DispatcherServlet。当然这里业内通常都将url-pattern配置为*.do的方式,所以你最好也这么去做。(不过现在这种.do的配置方式不如以前多了,是因为一种叫做restful风格的URL越来越流行了,这个咱们以后再介绍)。

设置url-pattern为/*

如果将url-pattern设置为/ * 之后,web项目中的jsp都不能访问了会报出404的错误,表示匹配任意字符,此时中央控制器DispatcherServlet会将向JSP页面的跳转请求也当作是一个普通的 Controller 请求,会对其进行处理,而此时在springmvc.xml配置文件中找不到与其相应的controller,这样子会把该请求交给一个叫做DefaultServlet的类来处理(在tomcat的conf下的web.xml文件中可以找到这个类的配置信息),该类也无法处理当前请求,因此就会出现了404错误。

其实说的简单一点就是/*这种配置会匹配所有请求,在实际开发中最好不要这样配置url-pattern。

设置url-pattern为/

如果将url-pattern设置为/* 之后,只要是在web.xml文件中找不到匹配的URL,它们的访问请求都将交给DispatcherServlet处理,静态资源:css文件,js文件,图片等请求也一并交给DispatcherServlet处理。
该配置方式不会匹配.jsp文件和.jspx文件,因为这个在tomcat中的conf目录里面的web.xml文件中已经添加的相应的处理方式了,他会交给org.apache.jasper.servlet.JspServlet来处理。即我们可以正常访问系统中的jsp文件。
现在restful风格的URL越来越流行,这种/的配置方式使用的也越来越多了。

解决静态资源不能访问的问题,解决方式有三种:

  • 使用defaultServlet

    打开你的tomcat中conf/web.xml,在这个文件中有一个叫做DefaultServlet的配置,当系统找不到处理某次url请求该交由谁处理的时候,就会交给这个servlet处理。我们可以通过使用这个DefaultServlet来处理静态资源,在你的系统中的web.xml文件中添加下面配置,要添加在DispatcherServlet的前面,这样系统就会将带有下面后缀名的请求交给defaultservlet来处理:

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    
  • 使用mvc:default-servlet-handler

    在springmvc.xml文件中添加下面配置即可,这种方式其实最终也是由DefaultServlet来处理:

    <mvc:default-servlet-handler/> 
    
  • 使用mvc:resources

    在spring mvc中提供了mvc:resources标签用来解决静态资源无法访问的问题,只需要在springmvc.xml的配置文件中添加下面内容即可,这样会交给spring mvc的ResourceHttpRequestHandler类来处理:

    <mvc:resources mapping="/images/**" location="/images/" />
    

    其中:

    • mapping 表示对该资源的请求。注意,后面是两个星号**。
    • location 表示静态资源所在目录,在我的项目中就在webapp下创建一个images文件夹,我会将所有的图片放到这个文件夹下。