什麼是SpringMVC
springmvc是spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合。springmvc是一個基於mcv的web框架。
mvc在b/s中的應用
mvc是一個設計模式,
springmvc框架原理(掌握)
- 前端控制器
- 處理器映射器
- 處理器適配器
- 視圖解析器
- SpringMVC和mybatis整合
- 自定義參數綁定
springmvc執行步驟
- 發起請求到前端控制器(DispatcherServlet)
-
前端控制器請求處理器映射器HandlerMapping查找Handler
可根據xml配置、註解進行查找
- 處理器映射器HandlerMapping向前端控制器返回Handler
- 前端控制器調用處理器適配器去執行Handler
- 處理器適配器執行Handler
- Handler執行完成給處理器適配器返回ModelAndView
-
處理器適配器給前端返回ModelAndView
ModelAndView是springmvc框架的一個底層對象,包括Model和View
-
前端控制器請求視圖解析器去進行視圖解析
根據邏輯視圖名解析成真正的視圖(jsp)
- 視圖解析器向前端控制器返回View
-
前端控制器進行視圖渲染
視圖渲染將模型數據(在ModelAndView對象中)填充到request域
- 前端控制器向用戶響應結果
組件的作用
-
前端控制器DispatcherServlet
作用:接受請求,響應結果。相當於轉發器
-
處理器映射器HandlerMapping
作用:根據請求的URL查找Handler
-
處理器適配器HandlerAdapter
作用:按照規定規則(HandlerAdapter要求的規則)去執行Handler
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler -
視圖解析器View resolver
作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖
-
視圖View
View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf......)
第一個程序
-
導入jar包,spring-webmvc.jar
-
在web.xml中配置springmvc的前端控制器
<!-- 配置springmvc前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation配置springmvc加載的配置文件(處理器映射器、適配器等) 如果不配置contextConfigLocation,默認加載的是/WEB-INF/servlet名稱-servlet。xml(這裏是springmvc-servlet.xml) --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 第一種:*.action,訪問以.action結尾的請求,由DispatcherServlet進行解析 第二種:/,所有的訪問地址都有DispatcherServlet進行解析,對於靜態文件的解析需要配置不讓DispatcherServlet進行解析,使用這種方式可以實現REDTful風格的url 第三種:/*,這種配置不對,這種配置最終要轉發到一個jsp頁面時,仍然會由DispatcherServlet解析jsp地址,不能根據jsp頁面找到Handler,會報錯 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
-
配置springmvc.xml(首先引入Spring約束)
-
配置處理器適配器。這個適配器的support方法可以處理實現Controller接口的類
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
-
創建處理器實現Controller接口
public class ItemController implements Controller{ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { Item item1=new Item(); item1.setName("乒乓球"); item1.setPrice("5"); item1.setDetail("好球"); Item item2=new Item(); item2.setName("藍球"); item2.setPrice("100"); item2.setDetail("球"); List<Item> listitem=new ArrayList<Item>(); listitem.add(item1); listitem.add(item2); ModelAndView modelAndView=new ModelAndView(); //相當於setAttribute modelAndView.addObject("listitem",listitem); //指定視圖 modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp"); return modelAndView; } }
-
創建視圖(這裏是在/WEB-INF/jsp/items/item路徑下創建itemList.jsp)
-
在springmvc.xml配置處理器、處理器映射器、視圖解析器
<!-- 配置Handler --> <bean name="/queryItems.action" class="cn.zcw.ssm.controller.ItemController"></bean> <!-- 配置處理器映射器 將bean的name作爲Url進行查找,需要在配置Handler時指定bean的name(url) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 視圖解析器 jsp解析,默認使用jstl標籤,所以classpath下得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
- 測試
非註解處理器映射器
-
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="hello.action">itemController1</prop> </props> </property> </bean>
key表示URL,值爲handel的idspringmvc會自己選擇正確的處理器映射器,所以可以同時配置以上兩種處理器映射器
非註解的處理器適配器
- org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
-
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
對應的handler類
public class ItemController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Item item1=new Item(); item1.setName("乒乓球"); item1.setPrice("5"); item1.setDetail("好球"); Item item2=new Item(); item2.setName("藍球"); item2.setPrice("100"); item2.setDetail("球"); List<Item> listitem=new ArrayList<Item>(); listitem.add(item1); listitem.add(item2); request.setAttribute("listitem", listitem); request.getRequestDispatcher("/WEB-INF/jsp/items/item/itemList.jsp").forward(request, response); } }
這個適配器可以指定傳給jsp頁面的數據格式,例如json
註解方式的適配器和映射器
第一種方式:
<!-- 註解適配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
第二種方式(推薦):
<!-- 使用mvc:annotation-driven代替上邊註解映射器和註解適配器
mvc:annotation-driven默認加載很多的參數綁定方法
比如json轉換解析器就默認加載,如果使用mvc:annotation-driven就不用配置上面兩個註解映射器、註解適配器
實際開發中也是使用mvc:annotation-driven
-->
<mvc:annotation-driven></mvc:annotation-driven>
Handler使用註解方式
@Controller
public class ItemController3{
@RequestMapping("/itemlist.action")
public ModelAndView itemList(){
Item item1=new Item();
item1.setName("乒乓球");
item1.setPrice("5");
item1.setDetail("好球");
Item item2=new Item();
item2.setName("棒球");
item2.setPrice("100");
item2.setDetail("球");
List<Item> listitem=new ArrayList<Item>();
listitem.add(item1);
listitem.add(item2);
ModelAndView modelAndView=new ModelAndView();
//相當於setAttribute
modelAndView.addObject("listitem",listitem);
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
return modelAndView;
}
}
在springmvc.xml開啓組件掃描
<!-- 可以掃描controller、service。。。。 -->
<context:component-scan base-package="cn.zcw.ssm.controller"></context:component-scan>
視圖解析器的參數配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路徑前綴 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 配置JSP路徑後綴 -->
<property name="suffix" value=".jsp"></property>
</bean>
在控制其中做出jsp路徑相應修改
//modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
modelAndView.setViewName("items/item/itemList");
ssm框架整合步驟
-
整合dao層
mybatis和Spring整合,通過Spring管理mapper接口使用mapper的掃描器自動掃描mapper接口在Spring中進行註冊
-
整合service層
通過Spring管理service接口使用配置方式將service接口配置在Spring配置文件中實現事務控制
-
整合springmvc
由於springmvc是Spring的模塊,不需要整合