1. 程式人生 > >Spring MVC(一)

Spring MVC(一)

一、Spring MVC概述

1、Spring MVC是什麼?

Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來,如下圖:


2、Spring MVC處理流程


二、入門程式

需求:使用瀏覽器顯示商品列表

1、建立web工程

2、匯入jar包


3、加入配置檔案

(1)建立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掃描包  掃描@Controler @Service 等-->
	<context:component-scan base-package="com.sh" />

</beans>

(2)在web.xml當中配置前端控制器DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>springmvc_01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  
  <!-- 前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 預設找/WEB-INF/[servlet的名稱]-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>
  	<!-- 
  		1、/* 攔截所有 jsp js png .css					真的全攔截 建議不使用
  		2、*.action *.do action 結尾的請求 				肯定能使用	ERP
  		3、/ 攔截所有(不包括jsp)(不包含.js .png .css)  強烈建議使用	 前臺 面向消費者
  	 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

(3)加入jsp頁面

(4)建立pojo

package com.sh.springmvc.pojo;

import java.util.Date;

public class Items {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

    private String detail;
   
......

(5)建立ItemController

@Controller
public class ItemController {

	// 入門程式
	@RequestMapping(value = "/item/itemlist.action")
	public ModelAndView itemList() {

		// 建立頁面需要顯示的商品資料
		List<Items> list = new ArrayList<>();
		list.add(new Items(1, "1華為 榮耀8", 2399f, new Date(), "質量好!1"));
		list.add(new Items(2, "2華為 榮耀8", 2399f, new Date(), "質量好!2"));
		list.add(new Items(3, "3華為 榮耀8", 2399f, new Date(), "質量好!3"));
		list.add(new Items(4, "4華為 榮耀8", 2399f, new Date(), "質量好!4"));
		list.add(new Items(5, "5華為 榮耀8", 2399f, new Date(), "質量好!5"));
		list.add(new Items(6, "6華為 榮耀8", 2399f, new Date(), "質量好!6"));

		ModelAndView mav = new ModelAndView();
		//新增資料
		mav.addObject("itemList",list);
		mav.setViewName("/WEB-INF/jsp/itemList.jsp");
		return mav;
	}
}

(6)測試


三、Spring MVC架構

1、框架結構


2、架構流程

(1)使用者傳送請求至前端控制器DispatcherServlet (21.spring(包括springmvc)
2.mybatis
3.mybatis-spring整合包
4.資料庫驅動
第1.spring(包括springmvc)
2.mybatis
3.mybatis-spring整合包
4.資料庫驅動
第1.spring(包括springmvc)
2.mybatis
3.mybatis-spring整合包
4.資料庫驅動
第三方連線池。三方連線池。三方連線池。)DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。 (3)處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。 (4)DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器 (5)執行處理器(Controller,也叫後端控制器)。 (6)Controller執行完成返回ModelAndView (7)HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet (8)DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器 (9)ViewReslover解析後返回具體View (10)DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。 (11)DispatcherServlet響應使用者

3、元件說明

以下元件通常使用框架提供實現:

u 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的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為springmvc的三大元件。

需要使用者開發的元件有handlerview

4、預設載入的元件


# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

5、元件掃描器

使用元件掃描器省去在spring容器配置每個Controller類的繁瑣。
使用<context:component-scan>自動掃描標記@Controller的控制器類,
在springmvc.xml配置檔案中配置如下:
<!-- 配置controller掃描包,多個包之間用,分隔 -->
<context:component-scan base-package="com.sh.springmvc.controller" />

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" />
註解描述:
@RequestMapping:定義請求url到處理器功能方法的對映

(2)配置處理器介面卡

註解式處理器介面卡,對標記@ResquestMapping的方法進行適配。
從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。

在springmvc.xml配置檔案中配置如下:
<!-- 配置處理器介面卡 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

(3)註解驅動

直接配置處理器對映器和處理器介面卡比較麻煩,可以使用註解驅動來載入。
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>

修改ItemController

/ @RequestMapping:裡面放的是請求的url,和使用者請求的url進行匹配
// action可以寫也可以不寫
@RequestMapping("/jsp/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"));
	list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3"));
	list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4"));
	list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5"));
	list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6"));

	// 建立ModelAndView,用來存放資料和檢視
	ModelAndView modelAndView = new ModelAndView();
	// 設定資料到模型中
	modelAndView.addObject("itemList", list);
	// 設定檢視jsp,需要設定檢視的實體地址
	// modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
	// 配置好檢視解析器字首和字尾,這裡只需要設定邏輯檢視就可以了。
	// 檢視解析器根據字首+邏輯檢視名+字尾拼接出來物理路徑
	modelAndView.setViewName("itemList");

	return modelAndView;
}

測試效果和之前一樣 原始碼參考springmvc_01:https://github.com/AmazeLee/Spring-MVC.git

四、整合Mybatis

1、建立資料庫

2、準備jar包

spring(包括springmvc)
mybatis
mybatis-spring整合包
資料庫驅動
第三方連線池

3、整合思路

Dao層:
1、SqlMapConfig.xml,空檔案即可,但是需要檔案頭。
2、applicationContext-dao.xml
a)資料庫連線池
b)SqlSessionFactory物件,需要spring和mybatis整合包下的。
c)配置mapper檔案掃描器。


Service層:
1、applicationContext-service.xml包掃描器,掃描@service註解的類。
2、applicationContext-trans.xml配置事務。


Controller層:
1、Springmvc.xml
a)包掃描器,掃描@Controller註解的類。
b)配置註解驅動
c)配置檢視解析器


Web.xml檔案:
1、配置spring
配置前端控制器。

4、建立web工程 ,加入jar包

5、編寫配置檔案

sqlMapConfig.xml
使用逆向工程來生成Mapper相關程式碼,不需要配置別名。
<?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>
	<!-- 設定別名 -->
	<typeAliases>
		<!-- 2. 指定掃描包,會把包內所有的類都設定別名,別名的名稱就是類名,大小寫不敏感 -->
		<package name="com.sh.springmvc.pojo" />
	</typeAliases>
	
</configuration>
applicationContext.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">

	<!-- 載入配置檔案 -->
	<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>

	<!-- Mybatis核心工廠 -->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 配置mybatis核心配置檔案 -->
		<property name="configLocation" value="classpath:sqlMapConfig.xml" />
		<!-- 配置資料來源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- Mapper動態代理開發 掃描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 基本包 -->
		<property name="basePackage" value="com.sh.springmvc.dao"/>
	</bean>
	
	<!-- 註解事務 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 開啟註解 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springmvc?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
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掃描包 掃描@Controler @Service 等 -->
	<context:component-scan base-package="com.sh" />

	<!-- 配置處理器對映器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

	<!-- 配置處理器介面卡 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

	<!-- 註解驅動  可以替代註解處理器和介面卡的配置-->
	<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>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>springmvc-mybatis</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>


	<!-- 配置spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<!-- 使用監聽器載入Spring配置檔案 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 預設找/WEB-INF/[servlet的名稱]-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>
  	<!-- 
  		1、/* 攔截所有 jsp js png .css					真的全攔截 建議不使用
  		2、*.action *.do action 結尾的請求 				肯定能使用	ERP
  		3、/ 攔截所有(不包括jsp)(不包含.js .png .css)  強烈建議使用	 前臺 面向消費者
  	 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

6、加入jsp頁面

至此,整合完畢

五、實現商品列表顯示

實現商品查詢列表,從mysql資料庫查詢商品資訊。

1、Dao

使用逆向工程,生成程式碼

2、Service

(1)ItemService介面
package com.sh.springmvc.service;

import java.util.List;

import com.sh.springmvc.pojo.Items;

public interface ItemService {
	
	//查詢商品列表
	public List<Items> selectItemsList();
}

(2)ItemServiceImpl實現類

@Service
public class ItemServiceImpl implements ItemService {
	
	@Autowired
	private ItemsMapper itemsMapper;
	
	//查詢商品列表
	public List<Items> selectItemsList(){
		return itemsMapper.selectByExampleWithBLOBs(null);
	}
}

3、Controller

@Controller
public class ItemController {

	@Autowired
	private ItemService itemService;
	// 入門程式
	@RequestMapping(value = "/item/itemlist.action")
	public ModelAndView itemList() {

		//從Mysql中查詢資料
		List<Items> list = itemService.selectItemsList();
		ModelAndView mav = new ModelAndView();
		//新增資料
		mav.addObject("itemList",list);
		mav.setViewName("itemList");
		return mav;
	}
}

4、測試

頁面顯示商品資訊 原始碼參考springmvc_mybatis:https://github.com/AmazeLee/Spring-MVC.git

六、引數繫結

1、預設支援的引數型別

(1)需求

開啟商品編輯頁面,展示商品資訊

(2)需求分析

編輯商品資訊,首先要顯示商品詳情
需要根據商品id查詢商品資訊,然後展示到頁面。
請求的url:/itemEdit.action
引數:id(商品id)
響應結果:商品編輯頁面,展示商品詳細資訊。

(3)ItemService介面

//根據商品id查詢商品
	Items queryItemById(Integer id);

(4)ItemServiceImpl實現類

//通過id查詢商品
	@Override
	public Items queryItemById(Integer id) {
		return itemsMapper.selectByPrimaryKey(id);
	}

(5)ItemController

頁面點選修改按鈕,發起請求
http://127.0.0.1:8080/springmvc-web/itemEdit.action?id=1

需要從請求的引數中把請求的id取出來。
Id包含在Request物件中。可以從Request物件中取id。

想獲得Request物件只需要在Controller方法的形參中新增一個引數即可。Springmvc框架會自動把Request物件傳遞給方法。
//通過id查詢商品
	@RequestMapping(value = "/itemEdit.action")
	public ModelAndView queryItemById(HttpServletRequest request) {
		//從request中獲取請求引數
		String strId = request.getParameter("id");
		Integer id = Integer.valueOf(strId);
		
		//根據id查詢商品資料
		Items item = itemService.queryItemById(id);
		//把結果傳遞到頁面
		ModelAndView modelAndView = new ModelAndView();
		//將商品資料放在模型中
		modelAndView.addObject("item",item);
		
		//設定邏輯檢視 
		modelAndView.setViewName("editItem");
		return modelAndView;
		
	}

(6)預設支援的引數型別

處理器形參中新增如下型別的引數處理介面卡會預設識別並進行賦值。

HttpServletRequest

通過request物件獲取請求資訊

HttpServletResponse

通過response處理響應資訊

HttpSession

通過session物件得到session中存放的物件

(7)Model/ModelMap

#1 Model

除了ModelAndView以外,還可以使用Model來向頁面傳遞資料,
Model是一個介面,在引數裡直接宣告model即可。

如果使用Model則可以不使用ModelAndView物件,Model物件可以向頁面傳遞資料,View物件則可以使用String返回值替代。
不管是Model還是ModelAndView,其本質都是使用Request物件向jsp傳遞資料。
程式碼實現:
@RequestMapping(value = "/itemEdit")
	public String queryItemById(HttpServletRequest request,Model model) {
		//從request中獲取請求引數
		String strId = request.getParameter("id");
		Integer id = Integer.valueOf(strId);
		
		//根據id查詢商品資料
		Items item = itemService.queryItemById(id);
		
		model.addAttribute("item",item);
		
		return "editItem";
		
	}

#2 ModelMap

ModelMap是Model介面的實現類,也可以通過ModelMap向頁面傳遞資料

使用Model和ModelMap的效果一樣,如果直接使用Model,springmvc會例項化ModelMap。
/**
	 * 根據id查詢商品,使用ModrlMap
	 * @param request
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/itemEdit")
	public String queryItemById(HttpServletRequest request,ModelMap model) {
		//從request中獲取請求引數
		String strId = request.getParameter("id");
		Integer id = Integer.valueOf(strId);
		
		//根據id查詢商品資料
		Items item = itemService.queryItemById(id);
		
		model.addAttribute("item",item);
		
		return "editItem";	
	}

2、繫結簡單型別

(1)當請求的引數和處理器形參名稱一致時會將請求引數與形參進行繫結。

這樣,從request取引數的方法就可以進一步簡化
/**
	 * 根據id查詢商品,繫結簡單資料型別
	 * @param request
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/itemEdit")
	public String queryItemById(int id,ModelMap model) {
		
		//根據id查詢商品資料
		Items item = itemService.queryItemById(id);
		
		model.addAttribute("item",item);
		
		return "editItem";	
	}

(2)支援的資料型別

引數型別推薦使用包裝資料型別,因為基礎資料型別不可以為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) 


(3)@RequestParam(瞭解)

使用@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查詢商品資料
	Item item = this.itemService.queryItemById(id);

	// 把商品資料放在模型中
	modelMap.addAttribute("item", item);

	return "itemEdit";
}

3、繫結pojo型別

(1)需求:將頁面修改後的資訊儲存到資料庫當中

(2)需求分析

請求的url/updateItem.action

引數:表單中的資料。

響應內容:更新成功頁面

(3)使用pojo接收表單資訊

如果提交的引數很多,或者提交的表單中的內容很多的時候,可以使用簡單型別接受資料,也可以使用pojo接收資料。
要求:pojo物件中的屬性名和表單中input的name屬性一致。
頁面:
pojo(逆向工程生成)
請求的引數名稱和pojo的屬性名稱一致,會自動將請求引數賦值給pojo的屬性。

#1 ItemService介面

//根據id更新商品
	void updateItemById(Items item);

#2 ItemServiceImpl實現類

//通過id更新商品
	@Override
	public void updateItemById(Items item) {
		itemsMapper.updateByPrimaryKeySelective(item);
	}

#3 ItemController

/**
	 * 更新商品,繫結pojo型別
	 * @param item
	 * @return
	 */
	@RequestMapping(value = "/updateItem")
	public String updateItem(Items item) {
		//呼叫service更新商品
		itemService.updateItemById(item);
		return "success";
		
	}

#4 編寫success.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!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>更新成功</title>
</head>
<body>
	更新成功!!!
</body>

</html>

#5 解決post提交亂碼問題

在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>
以上程式碼可以解決頁面post請求亂碼問題 對於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編碼

4、繫結包裝pojo

(1)需求

使用包裝的pojo接收商品資訊的查詢條件

(2)需求分析

包裝物件定義:
package com.sh.springmvc.pojo;

public class QueryVo {
	
	private Items items;

	public Items getItems() {
		return items;
	}

	public void setItems(Items items) {
		this.items = items;
	}
	
}
頁面定義:

(3)接收查詢條件

/**
	 * 繫結包裝資料型別
	 * @param queryVo
	 * @return
	 */
	@RequestMapping(value="/queryItem")
	public String queryItem(QueryVo queryVo) {
		System.out.println(queryVo.getItems().getId()+"------"+queryVo.getItems().getName());
		return "success";
	}

5、自定義引數繫結

在商品修改頁面可以修改商品的生產日期,並且根據業務需求自定義日期格式。

(1)需求分析

由於日期資料有很多種格式,springmvc沒辦法把字串轉換成日期型別。所以需要自定義引數繫結。

前端控制器接收到請求後,找到註解形式的處理器介面卡,對RequestMapping標記的方法進行適配,並對方法中的形參進行引數繫結。可以在springmvc處理器介面卡上自定義轉換器Converter進行引數繫結。

一般使用<mvc:annotation-driven/>註解驅動載入處理器介面卡,可以在此標籤上進行配置。

(2)jsp頁面



(3)自定義Converter

/**
 * 
 * @ClassName: DateConverter 
 * @Description: 日期轉換
 * @author lishuhua [email protected] 
 * @date 2017年11月12日 下午8:28:16 
 *
 * 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 (Exception e) {
			e.printStackTrace();
		}
		// 如果轉換異常則返回空
		return null;
	}
}

(4)在springmvc.xml中配置Converter

我們同時可以配置多個的轉換器。
類似多口的usb裝置,可以接入多個usb裝置


<!-- 註解驅動 可以替代註解處理器和介面卡的配置 -->
	<mvc:annotation-driven conversion-service="conversionService" />
	<!-- 轉換器配置 轉換工廠(日期、去掉前後空格) -->
	<!-- 配置Conveter轉換器 轉換工廠 (日期、去掉前後空格)。。 -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 配置 多個轉換器 -->
		<property name="converters">
			<list>
				<bean class="com.sh.springmvc.conversion.DateConverter" />
			</list>
		</property>
	</bean>

配置方式2(瞭解):
<!--註解介面卡 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
	<property name="webBindingInitializer" ref="customBinder"></property>
</bean>

<!-- 自定義webBinder -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
	<property name="conversionService" ref="conversionService" />
</bean>

<!-- 轉換器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<property name="converters">
		<set>
			<bean class="com.sh.springmvc.convert.DateConverter" />
		</set>
	</property>
</bean>

七、springmvc與struts2不同

1、springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過濾器。
2、springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。
3、Struts採用值棧儲存請求和響應的資料,通過OGNL存取資料, springmvc通過引數解析器是將request請求內容解析,並給方法形參賦值,將資料和檢視封裝成ModelAndView物件,最後又將ModelAndView中的模型資料通過request域傳輸到頁面。Jsp檢視解析器預設使用jstl。
原始碼參考:https://github.com/AmazeLee/Spring-MVC.git

相關推薦

Spring——Spring MVC

本文主要依據《Spring實戰》第五章內容進行總結 Spring MVC框架是基於模型-檢視-控制器(Model-View-Controller,MVC)模式實現,它能夠構建像Spring框架那樣靈活和鬆耦合的Web應用。 1、Spring MVC起步 1.1、

通過專案逐步深入瞭解Spring MVC

相關閱讀: 如果覺得不錯的話,歡迎給個 star , 如果你想完善這個專案的話,你也可以 fork 後修改然後推送給我。 轉載請註明出處和保留以上文字! 瞭解 Spring: 一個好的東西一般都會有一個好的文件解釋說明,如果你英語還行,建

Spring MVC

一、Spring MVC概述 1、Spring MVC是什麼? Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來,如下圖: 2、Spring MVC處理流程 二、入門程式 需求:

Spring框架

原因 getmethod 意思 myba model 找我 except 類型 程序代碼 Spring:   Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由 Rod Johnson在其著作 Expert One-On-On

spring學習helloworld編寫總結

cati 流程 spring學習 一個 1-1 png cat 其中 XML 配置Bean: 配置bean的方式:1.基於xml文件的方式 2.基於註解的方式。 Bean的配置方式;1.通過全類名(反射)2.通過工廠方法 IOC容器:ApplicationContext和

MVC-MVC的基礎認知

del action 減少 數據 瀏覽器 習慣 一次 格式 關註 MVC是一種編程模式和設計思想,MVC大致切割為三個主要單元:Model(實體模型),View(視圖),Contrller(控制器),MVC主要目在於簡化軟件開發的復雜度,讓程序代碼形成一個松耦合。 彼此的關

我們一起學習SpringSpring簡介

邏輯 style 發的 nfa 不同的 構建 john 局限 認識   首先聲明,我是一個spring初學者,寫這篇blog的目的是為了能和大家交流。文中不當之處還望大佬指出,不勝感激!   好了,現在我們開始進入正題。   很多小夥伴在學習Java的時候都會有人建議你去學

Spring入門— IOC、DI

使用 splay 1.0 了解 ngs eth text 實例 sts 一、Spring介紹   Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集

【SSH框架】之Spring系列

oca getc per 名稱 寫入 xmla java開發 無需 不能 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、前言 前面更新過幾篇關於 Struts2 框架和 Hibernate 框架的文章,但鑒於

Spring實戰筆記:Spring核心

spring bean spring core一.簡介: 1.依賴註入(DI) 優點:解耦 Spring 通過應用上下文(Application Context)裝載bean的定義,並把它們組裝起來。 Spring應用上下文負責對象的創建和組裝。 ClassPathXm

spring-學習

相關 細節 mvc 客戶端和服務器 web應用 利用 例如 常見 註入 概述 Spring 是最受歡迎的企業級 Java 應用程序開發框架。主要用來在java EE平臺上開發web應用。 好處 spring可以使開發人員使用pojos開發企業級的應用程序。 spring是有

Spring BootHello World

pri tags IT pla reload art blank info 輸入 Spring Boot適合與微服務,方便快速開發,簡化配置(約定>配置)。 準備工作: SpringBoot 2.0 jdk8 IDEA或者eclipse+Spring Tool Suits

spring boot

springSpring boot簡述 spring boot使用“習慣優於配置”的理念,可以讓項目快速的運行; 使用spring boot很容易創建一個獨立運行(內嵌servlet容器)基於spring框架的項目,開發者可以不用或者只使用很少的spring配置。基本配置 入口類:sprin

Android MVC MVC簡介

mvc tar .com 程序 tro view 用戶界面 lis 代碼 今天有朋友和我提到Android中的MVC模式,自己就在這裏總結下,如有不妥,大家盡情批評指教 MVC框架簡介   MVC全名是Model View Controller,是模型(model)-視圖(

Spring事務JDBC方式下的事務使用示例

ive jdbc action mem 得到 getbean char ransac 配置連接 摘要: 本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。若有描述錯誤之處,歡迎指正。 目錄 一、創建數據表結構 二、創建對應數據表的PO

Spring Boot—— Spring Boot 入門

mpi cti 準備 enc 標簽 martin 發的 nbsp oot 1、Spring Boot 簡介 簡化Spring應用開發的一個框架; 整個Spring技術棧的一個大整合; J2EE開發的一站式解決方案; 2、微服務 微服務:架構風格(服務微化) 一個應用

Spring boot----入門篇

包括 圖片 control pre 兩個 onf project tps eclipse 一、什麽是spring boot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行

spring-session揭秘

imp redis key 共享session eba linked 存儲器 執行 映射關系 訪問時間 前言 在開始spring-session揭秘之前,先做下熱腦(活動活動腦子)運動。主要從以下三個方面進行熱腦: 為什麽要spring-session 比較traditi

Spring MVC3Spring MVC 高級應用

ann 默認 chap coo cto 合作 視圖解析器 eric 不同   一、Spring MVC 的數據轉換和格式化   前面的應用,都只是用HandlerAdapter去執行處理器。     處理器和控制器不是一個概念,處理器是在控制器功能的基礎上加上了一層包裝,有

Spring Boot

new lec 一行 查看 resource 熱啟動 傳統 gmv 其中 (二期)4、springboot的綜合講解 【課程四】springbo...概念.xmind64.5KB 【課程四】spring裝配方式.xmind0.2MB 【課程四預習】spri...解讀