1.springMVC介紹
springMVC是一個web層框架,是Spring框架的一部分。前端
2.搭建springMVC框架
(1)建立web工程,導入jar包java
(2)加入配置文件程序員
(2.1)建立springmvc.xmlweb
建立SpringMVC的核心配置文件,SpringMVC自己就是Spring的子項目,對Spring兼容性很好,不須要作不少配置。這裏只配置一個Controller掃描就能夠了,讓Spring對頁面控制層Controller(就是web層)進行管理。spring
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller掃描包 --> <context:component-scan base-package="cn.itcast.springmvc.controller" /> </beans>
(2.2)在web.xml中配置前端控制器sql
<?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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springmvc-first</display-name> <!-- 配置SpringMVC前端控制器 --> <servlet> <servlet-name>springmvc-first</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件 --> <!-- SpringMVC的配置文件的默認路徑是/WEB-INF/${servlet-name}-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc-first</servlet-name> <!-- 設置全部以action結尾的請求進入SpringMVC --> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
(3)加入頁面,複製到工程的/WEB-INF/jsp目錄下數據庫
(4)實現案例:顯示商品列表apache
(4.1)建立商品實體類Item.java後端
(4.2)建立包cn.itcast.springmvc.controller,就是springmvc.xml掃描的包。包中建立ItemController.java
ItemController是一個普通的java類,不須要實現任何接口。須要在類上添加@Controller註解,把Controller交由Spring管理。在方法上面添加@RequestMapping註解,裏面指定請求的url。其中「.action」能夠加也能夠不加。spring-mvc
@Controller public class ItemController { // @RequestMapping:裏面放的是請求的url,和用戶請求的url進行匹配 // action能夠寫也能夠不寫 @RequestMapping("/itemList.action") public ModelAndView queryItemList() { // 建立頁面須要顯示的商品數據 List<Item> list = new ArrayList<>(); list.add(new Item(1, "1華爲 榮耀8", 2399, new Date(), "質量好!1")); list.add(new Item(2, "2華爲 榮耀8", 2399, new Date(), "質量好!2")); // 建立ModelAndView,用來存放數據和視圖 ModelAndView modelAndView = new ModelAndView(); // 設置數據到模型中 modelAndView.addObject("list", list); // 設置視圖jsp,須要設置視圖的物理地址 modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); return modelAndView; } }
3.springMVC的架構
(1)架構圖
(2)架構流程:
- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
- DispatcherServlet經過HandlerAdapter處理器適配器調用處理器
- 執行處理器(Controller,也叫後端控制器)。
- Controller執行完成返回ModelAndView
- HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- ViewReslover解析後返回具體View
- DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- DispatcherServlet響應用戶
(3)組件說明:
- DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就至關於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在下降了組件之間的耦合性。
- HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求url找到Handler,即處理器,springmvc提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
- Handler:處理器
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。
因爲Handler涉及到具體的用戶業務請求,因此通常狀況須要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器
經過HandlerAdapter對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理器進行執行。
下圖是許多不一樣的適配器,最終均可以使用usb接口鏈接
- ViewResolver:視圖解析器
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果經過頁面展現給用戶。
- View:視圖
springmvc框架提供了不少的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是jsp。
通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由程序員根據業務需求開發具體的頁面。
說明:在springmvc的各個組件中,處理器映射器(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)稱爲springmvc的三大組件。 |
(4)默認加載的組件
咱們沒有作任何配置,就可使用這些組件,由於框架已經默認加載這些組件了。
(5)組件掃描器
使用組件掃描器省去在spring容器配置每一個Controller類的繁瑣。
使用<context:component-scan>自動掃描標記@Controller的控制器類,在springmvc.xml配置文件中配置以下:
<!-- 配置controller掃描包,多個包之間用,分隔 --> <context:component-scan base-package="cn.itcast.springmvc.controller" />
(6)配置處理器映射器、處理器適配器
(6.1)
註解式處理器映射器,對類中標記了@ResquestMapping的方法進行映射。根據@ResquestMapping定義的url匹配@ResquestMapping標記的方法,匹配成功返回HandlerMethod對象給前端控制器。HandlerMethod對象中封裝url對應的方法Method。
從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成註解式處理器映射。在springmvc.xml配置文件中配置以下:
<!-- 配置處理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
註解式處理器適配器,對標記@ResquestMapping的方法進行適配。從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。在springmvc.xml配置文件中配置以下:
<!-- 配置處理器適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
(6.2)直接配置處理器映射器和處理器適配器比較麻煩,可使用註解驅動來加載。SpringMVC使用<mvc:annotation-driven>自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter,能夠在springmvc.xml配置文件中使用<mvc:annotation-driven>替代註解處理器和適配器的配置。
<!-- 註解驅動 --> <mvc:annotation-driven />
(7)配置視圖解析器
視圖解析器使用SpringMVC框架默認的InternalResourceViewResolver,這個視圖解析器支持JSP視圖解析。
在springmvc.xml配置文件中配置以下:
<!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置邏輯視圖的前綴 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置邏輯視圖的後綴 --> <property name="suffix" value=".jsp" /> </bean>
邏輯視圖名須要在controller中的ModelAndView指定,好比邏輯視圖名爲ItemList,則最終返回的jsp視圖地址:「WEB-INF/jsp/itemList.jsp」
配置後,modelAndView.setViewName("WEB-INF/jsp/itemList.jsp")能夠改成modelAndView.setViewName("itemList");
4.整合Mybatis
整合目標:控制層採用springmvc、持久層使用mybatis實現。
(1)須要的jar包:
- spring(包括springmvc)
- mybatis
- mybatis-spring整合包
- 數據庫驅動
- 第三方鏈接池。
(2)整合思路
Dao層:
- SqlMapConfig.xml,空文件便可,可是須要文件頭。
- applicationContext-dao.xml
- 數據庫鏈接池
- SqlSessionFactory對象,須要spring和mybatis整合包下的。
- 配置mapper文件掃描器。
Service層:
- applicationContext-service.xml包掃描器,掃描@service註解的類。
- applicationContext-trans.xml配置事務。
Controller層:
- Springmvc.xml
- 包掃描器,掃描@Controller註解的類。
- 配置註解驅動
- 配置視圖解析器
Web.xml文件:
- 配置spring
- 配置前端控制器。
(3)建立web工程
(3.1)使用逆向工程生成pojo類和mapper文件,不須要配置別名。sqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
(3.2)applicationContext-dao.xml:數據源,SQLSessionFactory,mapper掃描
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 數據庫鏈接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean> <!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 數據庫鏈接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加載mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> </bean> <!-- 配置Mapper掃描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置Mapper掃描包 --> <property name="basePackage" value="cn.itcast.ssm.mapper" /> </bean> </beans>
(3.3)applicationContext-service.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 配置service掃描 --> <context:component-scan base-package="cn.itcast.ssm.service" /> </beans>
(3.4)applicationContext-trans.xml:配置事務。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行爲 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.ssm.service.*.*(..))" /> </aop:config> 織入... </beans>
(3.5)springmvc.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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller掃描包 --> <context:component-scan base-package="cn.itcast.ssm.controller" /> <!-- 註解驅動 --> <mvc:annotation-driven /> <!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置邏輯視圖的前綴 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置邏輯視圖的後綴 --> <property name="suffix" value=".jsp" /> </bean> </beans>
(3.6)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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springmvc-web</display-name> <!-- 配置spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext*.xml</param-value> </context-param> <!-- 使用監聽器加載Spring配置文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置SrpingMVC的前端控制器 --> <servlet> <servlet-name>springmvc-web</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc-web</servlet-name> <!-- 配置全部以action結尾的請求進入SpringMVC --> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
(3.7)加入jsp頁面。WEB-INF目錄下
(4)實現商品列表展現
(4.1)dao層開發
使用逆向工程生成代碼。
(4.2)Service層開發
ItemService接口,ItemServiceImpl實現類
@Service public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper itemMapper; @Override public List<Item> queryItemList() { // 從數據庫查詢商品數據 List<Item> list = itemMapper.selectByExample(null); return list; } }
(4.3)controller層開發(web層)
@Controller public class ItemController { @Autowired private ItemService itemService; /** * 顯示商品列表 * * @return */ @RequestMapping("/itemList") public ModelAndView queryItemList() { // 獲取商品數據 List<Item> list = this.itemService.queryItemList(); ModelAndView modelAndView = new ModelAndView(); // 把商品數據放到模型中 modelAndView.addObject("itemList", list); // 設置邏輯視圖 modelAndView.setViewName("itemList"); return modelAndView; } }
5.參數綁定
(5.0)綁定簡單類型
當請求的參數名稱和處理器形參名稱一致時,會將請求參數與形參進行綁定。這樣,從Request取參數的方法就能夠進一步簡化。(如5.1中的Integer id)
支持的數據類型:
參數類型推薦使用包裝數據類型,由於基礎數據類型不能夠爲null
- 整形:Integer、int
- 字符串:String
- 單精度:Float、float
- 雙精度:Double、double
- 布爾型:Boolean、boolean
說明:對於布爾類型的參數,請求的參數值爲true或false。或者1或0
請求url:http://localhost:8080/xxx.action?id=2&status=false
處理器方法:
public String editItem(Model model,Integer id,Boolean status)
補充:使用@RequestParam經常使用於處理簡單類型的綁定。
value:參數名字,即入參的請求參數名字,如value=「itemId」表示請求的參數 區中的名字爲itemId的參數的值將傳入
required:是否必須,默認是true,表示請求中必定要有相應的參數,不然將報錯TTP Status 400 - Required Integer parameter 'XXXX' is not present
defaultValue:默認值,表示若是請求中沒有同名參數時的默認值
@RequestMapping("/itemEdit") public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id, ModelMap modelMap) { // 根據id查詢商品數據 ...... }
(5.1)默認支持的參數類型
頁面點擊修改按鈕,發起請求:http://127.0.0.1:8080/springmvc-web/itemEdit.action?id=${item.id}
須要從請求的參數中把請求的id取出來。id包含在Request對象中。能夠從Request對象中取id。
想得到Request對象只須要在Controller方法的形參中添加一個參數便可。Springmvc框架會自動把Request對象傳遞給方法。以下代碼:
@RequestMapping("/itemEdit.action") public ModelAndView toEdit(Integer id,HttpServletRequest request) { // String id = request.getParameter("id"); // Items item = itemsService.queryItemById(Integer.valueOf(id));//若用形參直接接收,不須要手動轉換 Items item = itemsService.queryItemById(id); ModelAndView mv=new ModelAndView(); mv.addObject("item", item); mv.setViewName("editItem"); return mv; }
處理器形參中添加以下類型的參數,處理器適配器會默認識別並進行賦值:HttpServletRequest、HttpServletResponse、HttpSession
(5.2)Model和ModelMap
除了ModelAndView之外,還可使用Model來向頁面傳遞數據,Model是一個接口,在參數裏直接聲明model便可。
若是使用Model則能夠不使用ModelAndView,Model對象能夠向頁面傳遞數據,View對象則可使用String返回值替代。
不論是Model仍是ModelAndView,其本質都是使用Request對象向jsp傳遞數據。
代碼實現:
@RequestMapping("/itemEdit") public String queryItemById(HttpServletRequest request, Model model) { // 從request中獲取請求參數 String strId = request.getParameter("id"); Integer id = Integer.valueOf(strId); // 根據id查詢商品數據 Item item = this.itemService.queryItemById(id); // 把結果傳遞給頁面 // ModelAndView modelAndView = new ModelAndView(); // 把商品數據放在模型中 // modelAndView.addObject("item", item); // 設置邏輯視圖 // modelAndView.setViewName("itemEdit"); // 把商品數據放在模型中 model.addAttribute("item", item); return "itemEdit";//返回的也是jsp頁面 }
ModelMap是Model接口的實現類,也能夠經過ModelMap向頁面傳遞數據。使用Model和ModelMap的效果同樣,若是直接使用Model,springmvc會實例化ModelMap。
(5.3)綁定pojo類型
若是提交的參數不少,或者提交的表單中的內容不少的時候,可使用簡單類型接受數據,也可使用pojo接收數據。
要求:pojo對象中的屬性名和表單中input的name屬性一致。
@RequestMapping("/updateItem") public String updateItem(Item item) { // 調用服務更新商品 itemService.updateItemById(item); // 返回邏輯視圖 return "success"; }
注意:提交的表單中不要有日期類型的數據,不然會報400錯誤。若是想提交日期類型的數據須要用到後面的自定義參數綁定的內容。
表單提交亂碼解決方法:
web.xml:
<!-- 解決post亂碼問題 --> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 設置編碼參是UTF8 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
對於get請求中文參數出現亂碼解決方法有兩個:
修改tomcat配置文件添加編碼與工程編碼一致,以下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另一種方法對參數進行從新編碼:
String userName =new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默認編碼,須要將tomcat編碼後的內容按utf-8編碼
(5.4)綁定包裝pojo類型
包裝類:
public class QueryVo { private Item item; set/get。。。 }
表單提交的是QueryVo的屬性的屬性
@RequestMapping("/updateitem.action") // public void updateItem(Items item,HttpServletRequest request,HttpServletResponse response) throws Exception { public void updateItem(QueryVo vo,HttpServletRequest request,HttpServletResponse response) throws Exception { itemsService.updateItem(vo.getItem()); request.getRequestDispatcher("/queryItemsList.action").forward(request, response); }
(5.5)自定義參數綁定
商品修改頁修改日期,根據業務需求自定義日期格式
因爲日期數據有不少種格式,springmvc沒辦法把字符串轉換成日期類型。因此須要自定義參數綁定。
前端控制器接收到請求後,找到註解形式的處理器適配器,對RequestMapping標記的方法進行適配,並對方法中的形參進行參數綁定。能夠在springmvc處理器適配器上自定義轉換器Converter進行參數綁定。
通常使用<mvc:annotation-driven/>註解驅動加載處理器適配器,能夠在此標籤上進行配置。
a.自定義轉換器converter:(springMVC根據這個接口中的Date類型,拿到Date類型的數據以後會放到這裏執行)
//Converter<S, T> //S:source,須要轉換的源的類型 //T:target,須要轉換的目標類型 public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { try { // 把字符串轉換爲日期類型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse(source); return date; } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 若是轉換異常則返回空 return null; } }
b.配置converter
<!-- 配置註解驅動 --> <mvc:annotation-driven conversion-service="conversionService" /> <!-- 轉換器配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.springmvc.converter.DateConverter" /> <bean class="這裏能夠配置多個轉換器" /> </set> </property> </bean>
配置完成後,在修改頁面修改日期提交,轉換器拿到日期的字符串,轉換成自定義的格式保存到數據庫。
6.springMVC和Struts2的不一樣
- springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過濾器。
- springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,能夠設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是經過類的屬性,只能設計爲多例。
- Struts採用值棧存儲請求和響應的數據,經過OGNL存取數據, springmvc經過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據經過request域傳輸到頁面。Jsp視圖解析器默認使用jstl。