聲明:圖片來自網絡,此處僅用於參考學習,不會用於商業用途java
上圖爲Spring MVC最基本的流程,並無考慮攔截器等等流程的影響,後面將補充。web
一、Dispatcher Servlet接收到客戶的請求spring
二、Dispatcher Servlet經過Handler Mapping找到請求url對應的Controller數組
三、經過HandlerAdapter調用對應Controller的方法進行處理瀏覽器
四、Controller方法處理後返回ModelAndView對象到Dispatcher Servletcookie
五、Dispatcher Servlet再將ModelAndView中view的信息交由ViewResolver處理,ViewResolver處理後返回真正的View地址網絡
六、Dispatcher Servlet將Model的信息交給View進行渲染session
七、發回響應給客戶mvc
(1) web.xml中的配置:
app
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>com.nstechs.commerce.AppConfig</param-value> </init-param> <!-- use annotation replace xml configuration. @Configuration class is required. --> <init-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
上面是基於Annotation零配置的配置方法,傳統的配置contextConnfigLoction值是配置文件的位置,不填會默認的去找WEB-INFO下的[servlet-name]-servlet.xml,如上面的代碼就會找WEB-INFO下spring-servlet.xml。而contextClass屬性值至關於Spring MVC配置文件中配置了:
<context:annotation-config />
啓用Spring MVC 的註解。
(2.1)基於配置文件的Spring MVC 配置:
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd">http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>"> <!-- 啓用spring mvc 註解 --> <context:annotation-config /> <!-- 設置使用註解的類所在的jar包 --> <context:component-scan base-package="controller"></context:component-scan> <!-- 完成請求和註解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 對轉向頁面的路徑解析。prefix:前綴, suffix:後綴 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/ jsp/" p:suffix=".jsp" /> </beans>
(2.2)基於Annotation的配置類
@Configuration @ComponentScan(basePackages={"controller"}) public class AppConfig{ @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/jsp/"); resolver.setSuffix(".jsp"); return resolver; } }
與上面的配置文件效果相同
(3)Cotroller類用@Controller註解標識,Service用@Service註解標識,DAO類用@Repository註解標識,上面的配置文件/類中有配置掃描的包,只有包含上面註解的類,在設置的包中或子包中都會被識別爲一個Bean加入Spring容器中。
(3.1)Controller類中在方法前使用@RequestMapping映射url和處理方法,Controller類上也可使用
@RequestMapping屬性:
method:用來限定Http請求的請求方法,值爲RequestMethod枚舉值集合,支持REST風格能夠用RequestMethod.DELETE和RequestMethod.PUT(非必填,不填默認支持GET、POST、DELETE、PUT,實際上如今大多數的瀏覽器只支持GET和POST方法,Spring3.0提供了HiddenHttpMethodFilter,容許經過"_method"表單參數指定特殊Http請求方法,實際上仍是用POST提交的)
value:映射的url數組(必填)url可使用/user/*/createUser,*匹配一個不含/字符串不能爲空,如/user/aaa/createUser;/user/**/createUser,匹配/user/aa/bb/createUser或直接/user/createUser;/user/createUser??,匹配兩個字符;/user/{userId}能夠捕獲/user/123這樣的url後面的字符串,再方法的入參前使用@PathVariable("userId")能夠將捕獲的值賦值給入參;
params:限定Http請求中參數,如@RequestMapping(value="/user" params="param1=value1")表示映射params含有param1=value1,連接有/user的http請求,其餘用法params="param1"必須包含param1,params="!param1"不能含有param1,params="param1!=value1"
headers:限定Http請求頭的值,設置規則與上面類似
@RquestParam、@RequestHeader、@PathVariable、@CookieValue爲入參賦值
@RequestMapping(value="/user/{userId}") public String handleParam(@RequestParam("userName") String userName, @RequestHeader("Accept-Language" String language), @PathVariable("userId") Integer userId, @CookieValue("JSESSIONID") String sessionId) { return "success"; }
@RquestParam用於將Http請求中指定參數值賦值給入參
參數 :
value 值爲參數名
required 值爲boolean是否必須有值,爲null時會拋出異常
defaultValue設置默認值,設置了會默認將required設置爲false,當值爲null時會使用默認值
@RequestHeader用於將Http請求中指定請求頭值賦值給入參,參數同上
@PathVariable用於捕獲url中對應值賦值給入參
@CookieValue用於將Http請求中指定cookie值賦值給入參,參數同上