Spring mvc 在web.xml中的url-pattern配置

来源:互联网 发布:matlab求矩阵的相角 编辑:程序博客网 时间:2024/06/09 00:27
<servlet>        <servlet-name>springMVC</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>springMVC</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>

springMVC DispatcherServlet请求映射配置 :
1. "/" 则Spring MVC将捕获Web容器所有的请求,
*.jsp 请求 不会进入spring的 DispatcherServlet 处理,
静态资源的请求(html/js/css/img),Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误(404)。

2.  "/* " 则Spring MVC将捕获Web容器所有的请求,     请求controller 会出现返回jsp视图时 拦截*.jsp, *.jspx的请求,再次进入spring的DispatcherServlet 处理,导致找不到对应的controller所以报404错。 静态资源的请求(html/js/css/img),Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误(404)。

 DispatcherServlet配置为’/’, 为什么不拦截*.jsp, *.jspx.的请求?

前面说的当DispatcherServlet配置为’/’, 将会覆盖default servlet, 将会处理所有其他Servlet都不处理的访问请求. 所以这里不拦截拦截.jsp, .jspx.的请求, 一定有其他地方拦截了该请求, 但是仔细查找web.xml并没有发现其他的servlet啊!那一定是在容器中定义的啦~
果不其然, 在%TOMCAT_HOME%/conf/web.xml中继承过来的JspServlet会处理该请求.

<servlet>    <servlet-name>jsp</servlet-name>    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>    <init-param>        <param-name>fork</param-name>        <param-value>false</param-value>    </init-param>    <init-param>        <param-name>xpoweredBy</param-name>        <param-value>false</param-value>    </init-param>    <load-on-startup>3</load-on-startup></servlet><servlet-mapping>    <servlet-name>jsp</servlet-name>    <url-pattern>*.jsp</url-pattern>    <url-pattern>*.jspx</url-pattern></servlet-mapping>

从该web.xml也看到DefaultServlet的定义了(文件中总共就定义了这两个servlet)

 <servlet>    <servlet-name>default</servlet-name>    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>    <init-param>       <param-name>debug</param-name>       <param-value>0</param-value>    </init-param>    <init-param>       <param-name>listings</param-name>       <param-value>false</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>   <servlet-name>default</servlet-name>   <url-pattern>/</url-pattern></servlet-mapping>

这也就是为什么我们直接访问不在WEB-INF的jsp, 可以直接找到并解析的原因了.
我们将test.jsp拷贝一份到webapp下, 直接访问/test.jsp, 访问到jsp中的内容了.并未出现404, 从而验证了我们的猜想.


静态资源的问题
如果不对js,css和图片这种静态资源进行映射的话,DispatcherServlet就找不到,造成所有的静态资源都访问不了。这个问题有两种解决办法:

方法1.采用
在springMVC-servlet.xml中配置后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求交回Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

方法2.采用spring配置<mvc:resources location="存放静态文件的目录路径" mapping="/目录/**" />
注意:(两个”*”)指location的值所表示的目录以及所有子目录

<mvc:resources /> 由Spring MVC框架自己处理静态资源,而且这种方式可以映射WEB-INF目录 <mvc:resources location="/,classpath:/META-INF/static/" mapping="/resources/**"/>

 WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录,页面放在WEB-INF目下面,这样可以限制访问,提高安全性.如JSPye页面。   如果客户端想访问jsp页面,可以请求controller 来分发到页面。  由于WEB-INF下对客户端是不可见的,所以相关的资源文件,如css,javascript和图片等资源文件一般不放在WEB-INF下。