SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決

z1340954953發表於2018-06-08

處理器方法繫結形參

* 預設支援的引數型別

HttpSerlvetRequest,HttpServletResponse,HttpSession,Model/ModelMap

除了ModeAndView外,還可以使用Model/ModelMap向頁面傳遞引數,Model.addattribute(key,value)

處理器方法,修改如下,返回檢視名和資料

@Controller
public class ItemController {
	@RequestMapping("/itemList.action")
	public String itemList(HttpServletRequest request,
			HttpServletResponse response,
			HttpSession session,
			Model model
			){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		List<Item> list = new ArrayList<Item>();
		list.add(new Item(1, "小米1", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(2, "小米2", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(3, "小米3", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(4, "小米4", sdf.format(new Date()), "千元神機!"));
		list.add(new Item(5, "小米5", sdf.format(new Date()), "千元神機!"));
		model.addAttribute("list", list);
		return "itemList";
	}
}

* 繫結簡單型別

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

例如請求的url: http://localhost:8080/mfo?id=1,可以繫結到形參下;

public String itemList(Model model,
			Integer id
			)

引數型別建議使用包裝資料型別,因為基礎資料型別不能為null,舉個例子說明:

如果提交的引數型別是int,沒有提交這個形參的時候,得到的是0 ,無法分別到底是提交的0還是沒有提交

@RequestParam

用於處理簡單型別的繫結,屬性說明

value:入參的引數名稱

required:請求中是否一定要攜帶引數,如果設定為true,沒有引數,將報錯

defaultValue:預設值

public String itemList(Model model,
			@RequestParam(value="itemId",required=false,defaultValue="")
			Integer id
			)

這樣,請求中的引數itemId將和形參的id進行繫結

* 繫結pojo型別資料

要求:pojo物件的屬性名和表單中input的name屬性一致

表單:

<form action="${pageContext.request.contextPath}/insertItem.action" method="post">
 編號:<input name="id" ><br/>
 名稱:<input name="name" ><br/>
 出廠時間:<input name="time" ><br/>
 備註:<input name="remark" ><br/>
 <input type="submit" value="提交">
</form>

對映處理器方法:

@RequestMapping(value={"/insertItem.action"})
	public String insertItem(Model model,Item item){
		return "itemList";
	}

測試下,打斷點,可以看到提交的引數,都已經封裝到pojo屬性中


注意到:提交的表單不要有日期型別的資料,否則會報錯400,如果需要提交日期型別的資料,需要自定義引數繫結的內容

SpringMVC亂碼解決

post中文亂碼

 <!-- 解決post提交亂碼 -->
  <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>*.action</url-pattern>
  </filter-mapping>

get中文亂碼

* 修改tomcat的server.xml 

  <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

* 手動轉碼

new String(request.getParameter("id").getBytes("iso8859-1"), "utf-8");

繫結pojo包裝型別

包裝類:

public class QueryVo {
	private Item item;

	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}
	
}

處理器方法

public String insertItem(QueryVo queryVo){
表單
<form action="${pageContext.request.contextPath}/insertItem.action" method="post">
 編號:<input type="text" name="item.id" ><br/>
 名稱:<input type="text" name="item.name" ><br/>
 出廠時間:<input type="text" name="item.time" ><br/>
 備註:<input type="text" name="item.remark" ><br/>
 <input type="submit" value="提交">
</form>

注意:提交的引數的名稱和包裝類中屬性一致


自定義引數繫結(解決日期型別轉換)

SpringMVC無法將字串轉換為日期型別,需要自定義引數繫結。

前端控制器接受到請求後,是以處理介面卡適配@RequestMapping標記的方法,並進行引數繫結。

在使用<mvc:annoation-driven/>註解驅動載入處理器介面卡,並在此進行轉換器配置。

自定義轉換器

public class DateConverter implements Converter<String, Date>{

	@Override
	public Date convert(String datetime) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		Date date = null;
		try {
			date = sdf.parse(datetime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
}

xml配置

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
	<!-- 轉換器配置 -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="cn.bing.converter.DateConverter" />
			</set>
		</property>
	</bean>

pojo類Item的time型別,改為Date,再測試,頁面還是上面的頁面

測試,斷點捕獲,型別轉換成功。

SpringMVC和Struts2的比較

1. SpringMVC的入口是一個前端控制器,Struts2入口是一個filter

2. SpringMVC是基於方法開發,一個url對應一個方法,設計為單例的,Struts2是基於類開發,傳遞引數通過類的屬性,一個請求,一個例項,設計為多例的

3. Struts採用值棧儲存和響應資料,OGNL存取資料,Spring通過ModelAndView物件封裝資料。jstl取資料



相關文章