springMVC學習

spring web mvc 是什麼?

spring web mvc 是一種基於java的使用了請求-響應模型的輕量級web框架,它使用了web mvc的設計模式思想, 將web層的職責進行解耦,  簡化了咱們平常的開發流程。主要分爲如下部分:html

  • 前端控制器(dispatherServlet)
  • 請求處處理器映射(HandlerMapping)
  • 處理器適配器(HandlerAdapter)
  • 視圖解析器(ViewResolver)
  • 處理器或頁面控制器(Controller)
  • 驗證器( Validator)
  • 命令對象(Command 請求參數綁定到的對象就叫命令對象)
  • 表單對象(Form Object 提供給表單展現和提交到的對象就叫表單對象)

spring web mvc的處理請求流程

具體的執行步驟以下:前端

  1. 用戶發送請求給前端控制器, 前端控制器根據用戶的請求選擇對應的頁面控制器來處理請求
  2. 頁面控制器接受到請求, 並分析請求生成一個參數對象(命令對象), 而後根據這個對象去調用對應的業務邏輯去處理請求業務, 處理完成後會生成一個modelAndView對象返回給前端控制器
  3. 前端控制器接收到這個modelAndView對象會去調用相應的視圖去把返回結果顯示出來

spring web mvc 架構

核心架構的具體流程步驟以下:java

  1. 首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制
  2. DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,經過這種策略模式,很容易添加新的映射策略
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持不少類型的處理器
  4. HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView對象(包含模型數據、邏輯視圖名)
  5. ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析爲具體的View,經過這種策略模式,很容易更換其餘視圖技術
  6. View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以很容易支持其餘視圖技術
  7. 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束

在此咱們能夠看出具體的核心開發步驟:web

  1. DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC
  2. HandlerMapping的配置,從而將請求映射處處理器
  3. HandlerAdapter的配置,從而支持多種類型的處理器
  4. ViewResolver的配置,從而將邏輯視圖名解析爲具體視圖技術
  5. 處理器(頁面控制器)的配置,從而進行功能處理

hello world入門例子

  1. 建立一個dynamitic web project, 名爲springMVC, 導入相應的包, 建立相應文件, 如圖:
  2. 下載spring mvc的jar包(http://download.csdn.net/download/enzetianxia/6218783), 並導入到項目中, 另外還要導入servlet-api jar 包, 
  3. 改寫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>springMvc</display-name>
    	<filter>
    		<filter-name>CharacterEncodingFilter</filter-name>
    		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>utf-8</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>CharacterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	<servlet>
    		<servlet-name>springmvc</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:spring-mvc.xml</param-value>
    		</init-param>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>springmvc</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    	</welcome-file-list>
    </web-app>
  4. 在web-info裏面建立一個jsp文件夾, 並建立一個名爲index.jsp的文件
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    ${message}
    </body>
    </html>
  5. 在src目錄下面建立一個名爲spring-mvc.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" 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.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
    	<!-- 使用註解的包,包括子集 -->
    	<context:component-scan base-package="springMvc" />
    	<!-- HandlerMapping -->
    	<bean
    		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    	<!-- HandlerAdapter -->
    	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
        <!-- Controller -->
    	<bean name="/hello" class="springMvc.HelloWorldController" />
    
    	<!-- 視圖解析器 -->
    	<bean id="viewResolver"
    		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/WEB-INF/jsp/" />
    		<property name="suffix" value=".jsp"></property>
    	</bean>
    </beans>
  6. 在src目錄下建立springMvc包, 並建立名爲HelloWorldController.java的文件
    package springMvc;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    
    public class HelloWorldController implements
    		org.springframework.web.servlet.mvc.Controller {
    
    	@Override
    	public ModelAndView handleRequest(HttpServletRequest arg0,
    			HttpServletResponse arg1) throws Exception {
    		final ModelAndView mv = new ModelAndView();
    		mv.setViewName("index");
    		mv.addObject("message", "hello, spring MVC!");
    		return mv;
    	}
    }
  7. 把項目部署到tomcat上面並運行, 輸入http://localhost:8080/springMvc/hello,就會獲得以下界面:
  8. 這個例子的運行流程以下:

 

 一、 首先用戶發送請求http://localhost:8080/springMvc/hello ——>web容器, 容器,web容器根據「/hello」路徑映射到DispatcherServlet(url-pattern爲/)進行處理;spring

 二、 DispatcherServlet——>BeanNameUrlHandlerMapping進行請求處處理的映射,BeanNameUrlHandlerMapping將「/hello」路徑直接映射到名字爲「/hello」的Bean進行處理,即HelloWorldController,BeanNameUrlHandlerMapping將其包裝爲HandlerExecutionChain(只包括HelloWorldController處理器,沒有攔截器);設計模式

三、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(HelloWorldController)適配爲SimpleControllerHandlerAdapter;api

四、 SimpleControllerHandlerAdapter——> HelloWorldController處理器功能處理方法的調用,SimpleControllerHandlerAdapter將會調用處理器的handleRequest方法進行功能處理,該處理方法返回一個ModelAndView給DispatcherServlet;spring-mvc

五、 hello(ModelAndView的邏輯視圖名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具體視圖頁面在/WEB-INF/jsp/index.jsp;tomcat

六、 JstlView(/WEB-INF/jsp/index.jsp)——>渲染,將在處理器傳入的模型數據(message=HelloWorld!)在視圖中展現出來;cookie

七、 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

 

POST中文亂碼問題

spring mvc使用了org.springframework.web.filter.CharacterEncodingFilter來解決中文亂碼問題, 只要在web.xml配相應的攔截器就能夠啦, 配置後全部的中文編碼都是utf-8

<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

spring mvc新特性, 在spring2.5以後引入對註解的支持

  1. 須要經過處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter來開啓支持@Controller 和 @RequestMapping註解的處理器。
  2. @Controller:用於標識是處理器類;
  3. @RequestMapping:請求處處理器功能方法的映射規則;
  4. @RequestParam:請求參數處處理器功能處理方法的方法參數上的綁定;
  5. @ModelAttribute:請求參數到命令對象的綁定;
  6. @SessionAttributes:用於聲明session級別存儲的屬性,放置在處理器類上,一般列出模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的保存到session中;
  7. @InitBinder:自定義數據綁定註冊支持,用於將請求參數轉換到命令對象屬性的對應類型;
  8. @CookieValue:cookie數據處處理器功能處理方法的方法參數上的綁定;
  9. @RequestHeader:請求頭(header)數據處處理器功能處理方法的方法參數上的綁定;
  10. @RequestBody:請求的body體的綁定(經過HttpMessageConverter進行類型轉換);
  11. @ResponseBody:處理器功能處理方法的返回值做爲響應體(經過HttpMessageConverter進行類型轉換);
  12. @ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態碼和緣由;
  13. @ExceptionHandler:註解式聲明異常處理器;
  14. @PathVariable:請求URI中的模板變量部分處處理器功能處理方法的方法參數上的綁定,從而支持RESTful架構風格的URI;

參考文檔: http://www.360doc.com/content/14/0331/09/16583880_365105789.shtml

相關文章
相關標籤/搜索