MVC設計模式
視圖(View) -對應組件:JSP或者HTML文件
控制器(controller) -對應組件:Servlet
模型(Model) -對應組件:JavaBean
MVC優點
多視圖共享一個模型,大大提高代碼的可重用性
MVC三個模塊相互獨立,松耦合架構
控制器提高了應用程序的靈活性和可配置性
有利於軟件工程化管理
MVC缺點
原理復雜
增加了系統結構和實現的復雜性
視圖對模型數據的低效訪問
Spring MVC框架實現原理
- 發起請求到前端控制器(DispatcherServlet)
- 前端控制器請求HanderrMapping查找Handler(可根據xml配置,注解查找)
- 處理器映射器HandlerMapping向前端控制器返回Handler
- 前端控制器調用處理器適配器執行Handler
- 處理器適配器執行Handler
- Handler執行完成后給適配器返回ModelAndView
- 處理器適配器向前端控制器返回ModelAndView(SpringMVC底層對象,包含model和view)
- 前端控制器請求視圖解析器進行解析(根據邏輯視圖名解析真正的視圖名(.jsp))
- 視圖解析器向前端控制器返回View
- 前端控制器實行視圖渲染(視圖渲染將模型數據填充到request域中)
- 響應給客戶端
Spring MVC框架搭建步驟
下載jar文件並導入工程
配置文件->修改web.xml配置文件
<!-- 配置核心控制器 DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- Springmvc默認加載Springmvc的配置文件,但是需要滿足一下規則 命名規則:servlet-name-servlet.xml==> springmvc-servlet.xml 路徑規則:springmvc-servlet.xml必須放在WEB-INFO下面--> <!-- 定義讀取的applicationContext-mvc.xml文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml </param-value> </init-param> <!-- 啟動服務器即讀取 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
創建Spring MVC的配置文件(注:跟配置讀取mvc.xml必須一致)
配置注解處理器映射器(在mvc.xml文件配置) <!-- 配置注解的處理器映射器 尋找執行類 Controller --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />配置注解處理器適配器(在mvc.xml文件配置) <!-- 配置注解的處理器適配器 執行Controller --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> 開啟指定目錄注解掃描(在mvc.xml文件配置) <!-- 開啟注解掃描 cn.smbms替換controller所在包路徑--> <context:component-scan base-package="cn.smbms"/> 配置視圖解析器(在mvc.xml文件配置) <!-- 配置視圖解析器 /WEB-INF/jsp/index.jsp--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置前綴--> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置后綴 --> <property name="suffix" value=".jsp" /> </bean> |
控制層方法上添加@Controller注解,也可以@Controller("xxx/xxx/")添加路徑前綴
方法上添加@RequestMapping注解
RequestMapping(定義訪問名)
功能:請求映射
寫法:
RequestMapping(“index”) 可以匹配任何的擴展名
RequestMapping(“/index.do”)
RequestMapping(value=“/index.do”)
RequestMapping(value=“/index.do” method=RequestMethod.GET)
RequestMapping(value=“/index.do” method=RequestMethod.POST)
瀏覽器直接寫url或者a標簽都是GET請求
一般情況下,如果使用from表單提交都是post請求,還有ajax請求指定post請求
SpringMVC基於注解封裝參數
根路徑注解RequestMapper(“”) 是為了隔離不同的Controller里面相同的方法
SpringMVC沒有成員變量,把需要的參數對象放入方法中,當你請求這個方法時候,這個方法里面對象會自動被創建,需要封裝的參數自動被封裝方法的對象.
提交表單:
例:<form action="${pageContext.request.contextPath}/login" > 前面的參數是取得當前的絕對路徑. 需要導入jsp-api包
基本數據類型
實體類
包裝類
數組
接收集合類型參數
方法里面不能直接傳遞list集合和map集合類型參數,把list集合定義在包裝類里面.
List傳遞
接收Map類型參數
頁面參數的回顯
Springmvc使用model對象,Model對象相當於application
application對象中數據可以是el表達式進行獲取
URL模板映射
主要是為請求restfull設計模式
restfull軟件架構設計模式:請求更簡潔,更方便,更安全搜索引擎收錄.
普通修改數據
<a ref="${pageContext.request.contextPath}/index/update.do?id=${user.id}">編輯</a>
初識Restfull
<a href="${pageContext.request.contextPath}/index/update/${user.id }.do">編輯</a>
絕對實現Restfull風格
如果在上面DispatcherServlet設置攔截權限為全局,則可絕對實現Restfull風格.
例:設置全局攔截
則請求默認實現Restfull風格
RequestParam
該注解可以給參數設置別名,設置默認值.
內置屬性:
value=”屬性別名” 設置參數屬性別名,在頁面使用別名進行傳參.
defaultValue=”默認值”,設置默認屬性值,當無值傳入時,傳入默認值.
required=”true(默認)” 請求中一定要有相應的參數,否則報400錯誤.
轉發和重定向
forward:轉發,不改變地址情況下的頁面跳轉
return “forward: getList”;//相對路徑
return “forward:/index/ getList”;//根路徑可隨便指定已有的路徑
redirect:頁面跳轉,地址同步改變
return "redirect:getList";//相對路徑跳轉
return "redirect:/index/getList";//絕對路徑重定向
<mvc:annotation-driven /> spring3.0.x后默認使用了
<mvc:annotation-driven />默認創建了處理器映射器和處理器適配器,還提供了json數據格式的支持