一、前置控制器配置與講解
上篇中理解了IOC容器的初始化時機,並理解了webApplicationContext和SevletContext和servlet的param等的概念和關系。
現在記錄,如何配置前置控制器:
<servlet> <servlet-name>MainServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/applicationContext-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MainServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
對於url-pattern配置成*.do等形式的前置控制器配置,不記錄了,只記錄REST風格的配置。
<url-pattern>/</url-pattern>這種方式的配置,那么tomcat會把所有訪問該應用的請求都分配給org.springframework.web.servlet.DispatcherServlet來進行處理。
package com.brolanda.educloud.core.login.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping(value="/login") public class LoginController { @RequestMapping(value="/validate",method=RequestMethod.GET) public String validateUser(){ return "home/home"; } }
我們在系統內創建一個controller,並配置對應的url請求路徑,其中在Controller上配置的@RequestMapping(value="/login"),是說http://ip:port/app/login的request都轉到這個控制器上,然后在validateUser方法上配置的 @RequestMapping(value="/validate",method=RequestMethod.GET),是告訴前置控制器,http://ip:port/app/login/validta的request請求都轉向LoginController 的validateUser()方法進行處理。
二、靜態資源配置
ok,到此,理解了前置控制器對請求的轉發,與使用注解的方式標注Controller。那么問題來了,所有的請求都會轉給前置控制器,而前置控制器的工作原理就是針對每個請求找到相應的Controller進行處理,並返回消息。那么,針對靜態資源的請求,前置控制器就只好報異常了,因為它確實找不到。
所以,我們需要告訴靜態資源的請求如何處理,有兩種方式:
方式一:使用容器的默認處理器。
<mvc:default-servlet-handler />
此配置告訴DispatcherServlet,對於找不到Controller的請求,就把它交給tomcat的默認處理器就行處理,而tomcat的默認處理器會把請求的資源返回給客戶端。
方式二:在前置控制器的配置文件中指明靜態資源的請求路徑,該路徑下的請求一律直接返回資源即可。
<mvc:resources location="/resources/" mapping="/resources/**"/>
此配置告訴DispatcherServlet,任何http://ip:port/app/resources/**的請求都將其定位到/resources/目錄下,並尋找對應的目錄文件,作為資源文件返回給客戶端。
其中,兩個*,它表示映射resources/下所有的URL,包括子路徑(即接多個/)。
1. 訪問,瀏覽器顯示webapp/resources/test.png
2. 訪問,瀏覽器顯示webapp/resources/scripts/test.js
3. 訪問,瀏覽器顯示webapp/resources/css/2012/test.css
三、視圖配置
controller可以返回很多類型的信息,目前我用到的就是json、和jsp,那么,如果返回的jsp,我們需要如何配置呢?
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="jspViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/resources/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
prefix是前綴信息,suffix是后綴信息
controller處理完之后,返回了login,那么會返回客戶端http://ip:port/app/resources/jsp/login.jsp頁面信息。
至此,spring-mvc基礎配置完成