(1):在使用springmvc时,都会在web.xml中配置一个前端控制器dispatchservlet,如下:
<!-- 配置前端控制器 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc配置 -->
<!-- 如果不配置,则默认查找的是classpth下的:servletname+"-servlet.xml",例如我这边配置的servlet名字叫springmvc,则默认查找"springmvc-servlet.xml" -->
<init-param>
<!-- DispatcherServlet继承自FrameworkServlet, 其中定义了contextConfigLocation,表示配置文件地址-->
<param-name>contextConfigLocation</param-name>
<!-- 配置文件的地址 -->
<param-value>springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
可以配置/,此工程所有的请求全部由springmvc解析,此种方式可以实现RESTful 方式,需要特殊处理静态文件的解析,不能由springmvc解析
可以配置*.do或*.action,所有请求的扩展名为.do或.action时,由springmvc来解析,此种方法常用
不可以配置/*,如果配置/*,返回jsp也有springmvc解析,这是不对的
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
(2):配置spring的配置文件
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:order="2">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="contentType" value="text/html" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
(3):举例说明:
①:<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
②:<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
①:地址为 localhost:8088/login , /login 返回login.jsp
访问去Controller下的/login 跳转到相应的视图login.jsp
②:访问的地址为 localhost:8088/login/ ,/login 返回login.jsp
访问去Controller下的/login,跳转到login.jsp ,然后进过dispatchservlet的时候,由于是/* ,有会以localhost:8088/login/login.jsp 去请求Controller ,那么如果Controller没有 /login/login.jsp 的Mapping映射,则会报404 错误!
(4):总结
< url-pattern > / < url-pattern > /* 能匹配所有请求URL,会匹配到*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
当映射规则为 /* 时,最后返回xx.jsp也经过DispatcherServlet,它又会去找相对应的处理器,这也是控制台打印noHandlerFound,也就导致了404错误,页面更别想看到。当改成 / 后,servlet不会匹配到.jsp的URI,当然就能正常返回页面了