spring中,
当dsipatcherServlet接收到请求时,它将会将请求分发给相应的处理程序处理请求。
因此,我们可以采用一种策略,用来映射请求到处理程序。
解决方案1(按bean名称映射请求,常规):(court-servlet.xml)
<beans
......
<bean name="/welcome.html"
.....
</bean>
<bean name="/reservationQuery.html"
....
</bean>
</beans>
使用这个策略的时候,bean只能使用name属性,id中无法包含'/'。
解决方案2(按照控制器类名称映射请求):(court-servlet.xml)
使用spring提供的另一个请求映射工具[ControllerClassNameHandlerMapping],它会自动映射:
<beans>
....
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="org.cat.web.WelcomeController" />
<bean class="org.cat.web.ReservationQueryController" >
...
</bean>
</beans>
映射的格式是:
将WelcomeController去掉Controller后缀,然后全部小写,变成/welcome*这个请求。
解决方案3(用定制的映射定义来映射请求):
使用SimpleUrlHandlerMapping
<beans>
....
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome.html">welcomeController</prop>
<prop key="/reservationQuery.html">reservationQueryController</prop>
</props>
</property>
</bean>
<!--these are beans for every mapping request. -->
<bean name="welcomeController" class="org.cat.web.WelcomeController" />
<bean name="reservationQueryController" class="org.cat.web.ReservationQueryController" >
...
</bean>
</beans>
映射的结果:
配置如下:
解决方案4(按照多种策略映射请求):
有时,ControllerClassNameHandlerMapping就能满足应用,也有时必须使用SimpleUrlHandlerMapping来实现映射。
因此,在大型web应用中,如果有很多controller,那么就把他们结合起来使用:
<beans >
.....
<import resource="court-service.xml"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome.html">welcomeController</prop>
<prop key="/index.html">welcomeController</prop>
</props>
</property>
<property name="order" value="0" />
</bean>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="caseSensitive" value="true" />
<property name="order" value="1" />
</bean>
<!--these are beans for every mapping request. -->
<bean name="welcomeController" class="org.cat.web.WelcomeController" />
<bean name="reservationQueryController" class="org.cat.web.ReservationQueryController" >
<property name="reservationService" ref="reservationService"/>
<property name="supportedMethods" value="GET" />
<property name="cacheSeconds" value="60" />
</bean>
</beans>
and you can see this:
这里的order是映射的优先级,0优先于1.
/index.html---->WelcomeController
/welcome.html----->WelcomeController
/welcome*------>WelcomeController
/reservationQuery*------>ReservationQueryController
运行结果:
(因为我在web.xml里面添加了pattern,所以后缀名不是.html的根本进不了court-servlet.xml,哈哈哈哈)
下面附上xml配置文件(放在应用程序上下文根目录中,也就是web-inf下面)
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Court Reservation System</display-name>
<servlet>
<servlet-name>court</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>court</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/court-service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
court-service.xml:
<?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 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="reservationService"
class="org.cat.service.ReservationServiceImpl" />
</beans>
court-servlet.xml:
<?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">
<import resource="court-service.xml"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome.html">welcomeController</prop>
<prop key="/index.html">welcomeController</prop>
</props>
</property>
<property name="order" value="0" />
</bean>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="caseSensitive" value="true" />
<property name="order" value="1" />
</bean>
<!--these are beans for every mapping request. -->
<bean name="welcomeController" class="org.cat.web.WelcomeController" />
<bean name="reservationQueryController" class="org.cat.web.ReservationQueryController" >
<property name="reservationService" ref="reservationService"/>
<property name="supportedMethods" value="GET" />
<property name="cacheSeconds" value="60" />
</bean>
</beans>