SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決
處理器方法繫結形參
* 預設支援的引數型別
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取資料
相關文章
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- #翻譯#使用註解處理器生成程式碼-1 註解型別型別
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- javascript 函式引用型別和簡單型別傳參JavaScript函式型別
- struts 型別轉換器型別
- springmvc引數型別轉換三種方式SpringMVC型別
- Javascrip 之 字串處理 & 定時器 & 型別轉換Java字串定時器型別
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- MyBatis(九):MyBatis型別處理器(TypeHandler)詳解MyBatis型別
- ORACLE 自定義型別[轉]Oracle型別
- 一個簡單函式—Number型別轉換Date型別函式型別
- 自定義型別型別
- 資料型別,型別轉換資料型別
- Java註釋,識別符號,資料型別,型別轉換Java符號資料型別
- SpringMVC(三)處理器方法形參繫結(繫結陣列、集合)、異常處理器、controller方法返回值SpringMVC陣列Controller
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- PHP 型別轉換&&型別強制轉換PHP型別
- 多型關聯自定義的型別欄位的處理多型型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- Python 型別註解Python型別
- SpringMVC-方法四種型別返回值總結SpringMVC型別
- 函式匹配和實參型別轉換函式型別
- C++中的向上型別轉換和向下型別轉換C++型別
- java型別轉換與強制型別轉換(轉)Java型別
- 型別轉換型別
- 09.AutoMapper 之自定義型別轉換器(Custom TypeAPP型別
- Java資料型別及型別轉換Java資料型別
- 字元型別轉換成時間型別字元型別
- Oracle Long型別轉換為Clob型別Oracle型別
- Mybatis實踐(一)型別轉換器MyBatis型別
- WPF 型別轉換器的實現型別
- mysql bigint型別和datetime型別的轉換MySql型別
- 型別自定義格式字串型別字串
- 自定義資料型別資料型別
- Pl/SQL 自定義型別SQL型別
- SpringMVC學習筆記6-指定處理請求型別SpringMVC筆記型別
- JumpList中Recent類別和自定義型別薦型別
- 瞭解JavaScript中的型別轉換JavaScript型別