1 前言
在史上最簡單的 Spring MVC 教程(一)中,咱們已經(jīng)成功搭建起 Spring MVC 框架吱晒,并且運(yùn)行成功甸饱。在本篇博客中,咱們首先嘗試著對前面的程序進(jìn)行修改仑濒,即修改“action-servlet.xml”配置文件的位置和名稱叹话,修改后的項目結(jié)構(gòu)圖如下:
如上圖所示,咱們調(diào)整“action-servlet.xml”的位置到“src”目錄下躏精,并修改其名稱為“springmvc-servlet.xml”渣刷,接下來鹦肿,咱們直接重啟tomcat服務(wù)器是可以重啟成功的矗烛,這意味著:
- Spring MVC 不是隨著容器啟動而啟動,它是在第一次訪問時進(jìn)行加載的。
雖然 tomcat 服務(wù)器啟動成功瞭吃,但在我們訪問 http://localhost:8080/ 的時候就會報錯啦碌嘀!因?yàn)?Java web 項目默認(rèn)的是到“WEB-INF”中尋找配置文件,而我們又調(diào)整了配置文件的位置歪架,報錯也就是顯然的啦股冗!要想解決這個問題,這就需要我們在“web.xml”文件中進(jìn)行初始化參數(shù)的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置 DispatcherServlet和蚪,對所有后綴為action的url進(jìn)行過濾 -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 修改 Spring MVC 配置文件的位置和名稱 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app></pre>
這樣止状,當(dāng)我們重新啟動 tomcat 服務(wù)器,并訪問 http://localhost:8080/ 時候攒霹,就會訪問成功啦怯疤!
2 HandlerMapping
接下來,咱們就介紹常見的 handlerMapping催束,共3種集峦。對于 handlerMapping 的配置,我們將在“springmvc-servlet.xml”中進(jìn)行配置抠刺。
2.1 BeanNameUrlHandlerMapping
<?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-3.2.xsd">
<!-- 聲明 handlerMapping -->
<!-- 聲明 BeanNameURI 處理器映射塔淤,其為默認(rèn)的處理器映射 -->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 聲明 Controller -->
<bean name="/home.action" class="spring.mvc.controller.CeshiController" />
<!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans></pre>
由于 BeanNameUrlHandlerMapping 為默認(rèn)配置的 handlerMapping速妖,所以就算我們重新啟動 tomcat 服務(wù)器高蜂,訪問的地址及頁面也不會出現(xiàn)什么變化,因此作者就不把運(yùn)行結(jié)果貼出來啦罕容!
2.2 SimpleUrlHandlerMapping
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 聲明 handlerMapping -->
<!-- 聲明 BeanNameURI 處理器映射妨马,其為默認(rèn)的處理器映射 -->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/a.aciton">homeController</prop>
<prop key="/b.aciton">homeController</prop>
<prop key="/c.aciton">homeController</prop>
</props>
</property>
</bean>
<!-- 聲明 Controller -->
<bean id="homeController" name="/home.action" class="spring.mvc.controller.CeshiController" />
<!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
通過 SimpleUrlHandlerMapping杀赢,我們可以在 property 標(biāo)簽中 prop 配置多個 key 值烘跺,并且通過該 key 值訪問頁面,即我們可以通過 http://localhost:8080/springmvc/a.action 訪問頁面脂崔,其效果同訪問 http://localhost:8080/springmvc/home.action 相同滤淳。當(dāng)然,在這里之前砌左,我們需要在聲明的 Controller 中 bean 標(biāo)簽中添加一個 id 的屬性脖咐,并將其值配置到 prop 標(biāo)簽內(nèi),其訪問結(jié)果如下圖所示:
特別注意:當(dāng)有 BeanNameUrlHandlerMapping 方式和 SimpleUrlHandlerMapping 方式聲明沖突時汇歹,也就是有同名的URL屁擅,這時 Spring MVC 框架如何處理?
- 首先产弹,配置重名不會引起沖突派歌;
- 其次,出現(xiàn)同名時,按配置文件的順序執(zhí)行胶果,當(dāng)發(fā)現(xiàn)有一個URL滿足匾嘱,就跳出;
- 最后早抠,Spring MVC 框架支持用戶自定義順序霎烙,增加 order 屬性即可。
在咱們自定義順序的時候蕊连,需要在 proprety 標(biāo)簽中添加order屬性悬垃,即:
<!-- n 為整數(shù),從0開始甘苍,越小優(yōu)先級越高 -->
<proprety name=”order” value=”n”/>
以上在“springmvc-servlet.xml”中配置的示例如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 聲明 handlerMapping -->
<!-- 聲明 BeanNameURI 處理器映射盗忱,其為默認(rèn)的處理器映射 -->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="1"/>
</bean>
<!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/a.aciton">homeController</prop>
<prop key="/b.aciton">homeController</prop>
<prop key="/home.aciton">homeController</prop>
</props>
</property>
<property name="order" value="0"/>
</bean>
<!-- 聲明 Controller -->
<bean id="homeController" name="/home.action" class="spring.mvc.controller.CeshiController" />
<!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.3 ControllerClassNameHandlerMapping
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 聲明 handlerMapping -->
<!-- 聲明 BeanNameUrlHandlerMapping 處理器映射羊赵,其為默認(rèn)的處理器映射 -->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="1"/>
</bean>
<!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/a.aciton">homeController</prop>
<prop key="/b.aciton">homeController</prop>
<prop key="/hello.aciton">homeController</prop>
</props>
</property>
<property name="order" value="0"/>
</bean>
<!-- 聲明 ControllerClassNameHandlerMapping 處理器映射 -->
<bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<!-- 聲明 Controller -->
<bean id="homeController" name="/hello.action" class="spring.mvc.controller.CeshiController" />
<!-- 內(nèi)部資源視圖解析器趟佃,前綴 + 邏輯名 + 后綴 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
控制器類名處理器映射,只需要簡單的聲明即可使用昧捷,值得注意的是其訪問的地址為:http://localhost:8080/springmvc/homeController.action