springMVC的url-pattern

springMVC的url-patternweb.xml中<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><…

web.xml中

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

其中<url-pattern>中的路径的情况
1、“/”
.jsp能通过浏览器直接打开,.html则不能
此情况下会拦截静态资源,不会拦截.jsp
2、“/action/*”
.jsp和.html都可以通过浏览器直接打开,url中不需要加/action
需要controller处理的url则需要添加/action才会被拦截
3、 “/*” (错误)
.jsp和.html都不能通过浏览器直接打开
此情况或拦截所有请求,转发后的.jsp同样会被拦截
这算是一种错误的使用情况,因为会拦截所有请求,无法展示任何东西,单独配置展示类型资源则又比“/”的情况需要多处理一种.jsp类型,使用意义不大
4、 “/**”(错误)
.jsp和.html都可以通过浏览器直接打开
但是controller拦截不到url,同时会报出如下信息提示错误
信息: Suspicious url pattern: “/**” in context [/shoes] – see sections 12.1 and 12.2 of the Servlet specification
5、 “*.do”
简单好用的方式,不会拦截静态资源,页面都可以直接通过浏览器访问。
缺点:不是REST风格,对于追求url格式的没办法使用

ps:WEB-INF目录下的内容无法通过浏览器直接访问,其内的.jsp需要转发才能访问

对于静态资源拦截的处理,在网上可以找到三种方式
1、在web-xml中对每种类型的资源进行处理,需要写在spring的servlet前面

 <servlet-mapping>     
    <servlet-name>default</servlet-name>    
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.js</url-pattern>       
</servlet-mapping>

2、spring配置文件中的<mvc:resources>标签,此标签需要指定静态资源的位置,例如

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

<mvc:resources mapping="/**/*.html" location="/" />

可参考http://blog.csdn.net/clementad/article/details/46763339

3、spring配置文件中的<mvc:default-servlet-handler/>

    <!-- 配置mvc注解扫描 -->
    <mvc:annotation-driven/>
    <!-- 配置静态资源的默认servlet -->
    <mvc:default-servlet-handler/>

这里会在DispatcherServlet找不到资源时调用servlet容器默认的servlet来处理,此时就不会拦截静态资源了
使用这种方式时碰到一个小问题:
@RequestMapping()中的地址和静态页面重复时会出问题,
例如@RequestMapping(“/add”)和静态页面add.html,
这样配置无法访问静态页面,会被spring拦下来进入(“/add”)的controller。
为此我使用第一种方式在web.xml中加了一个.html的过滤

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

ps:方式2、3在使用时需注意拦截器过滤的问题

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/**/*.css"/>
            <mvc:exclude-mapping path="/**/*.js"/>
            <bean class="com.web.intercepter.LoginIntercepter"/>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器数量多时,需要为每个拦截器进行配置,比较麻烦,推荐方式1+方式3的方式配置,当然,直接使用*.do的方式就不存在这样的问题了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37409.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注