困惑:关于Web.xml 与Spring 设置

本文探讨了在Spring MVC框架中出现的NoMapping错误的原因及其解决方案。解释了DispatcherServlet的作用及如何通过配置来正确处理URL映射。

web.xml的配置情况:

摘取网络上对于Web.xml的理解:首先对于各个元素的加载顺序是与各个元素声明的顺序无关,其次对于加载的顺序将是:servlet-context -- context-param - listener - servlet

对于我这个文件,首先系统加载Servlet-context, 然后加载context-param指定的两个文件,再加载指定的Listener,最后加载定义的servlet.

当我在controllers.xml加入<context:component-scan base-package="com.baidu" /> 当我进行url访问时,提示No Mapping. 是不是以为着只有DispatchServlet才有映射url的能力,因为我在我的UserShow Bean 里面声明了@RequestMapping(name=“userInfo.htm", method=RequestMethod.GET), 而此时提示的No Mapping 错误,当我移动到application.xml里面则映射正确。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SpringTutorial</display-name>

<welcome-file-list>
<welcome-file>welcome.html</welcome-file>
</welcome-file-list>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config/viewer.xml,
config/controllers.xml
</param-value>
</context-param>

<servlet>
<servlet-name>dispatch</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>config/applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatch</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>

viewer.xml: 指定ViewResolver.

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


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>

</beans>

controllers.xml: 指定数据源的定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context
="http://www.springframework.org/schema/context"
xmlns:p
="http://www.springframework.org/schema/p"
xmlns:tx
="http://www.springframework.org/schema/tx"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
"
>
<bean id="sessionFactory"
class
="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<description>Proxool Description</description>
<property name="packagesToScan">
<value>com.baidu.model</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.proxool.xml">proxool.xml</prop>
<prop key="hibernate.proxool.pool_alias">dbpool</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</prop>
</props>
</property>
</bean>
</beans>

Finally: 在controllers通过contexLoaderListener进行加载时,其默认并不加载@Controller,而在通过Servlet进行加载时,@Controller作为Component的子集,也是加载如入该子集的行为,而在controller.xml中只执行其母集Component的行为,所以会照成NO Mapping的现象发生。

解决方法:

 1. 将加载Mapping的行为放入servlet加载的xml

 2. 在Context-param,也就是Listener加载的xml的文件中加入如下的定义:

xml:ns="http://www.springframwork.org/schema/mvc"
xml:schemaLocation="http://www.springframwork.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
<mvc:annotation-driven />





转载于:https://www.cnblogs.com/papertigerv5/archive/2011/11/04/2236467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值