Spring MVC 通過參數綁定將 HTTP 請求參數自動映射到 Controller 方法參數,支援簡單類型、POJO、集合及自定義類型轉換。本文系統梳理綁定流程、支援類型、常用註解與最佳實踐。
客戶端請求 → HandlerAdapter → 參數解析器 → 綁定到方法形參。關鍵點:Spring MVC 通過方法形參接收數據,而非 Controller 成員變量,保證線程安全。
HttpServletRequest、HttpServletResponse、HttpSessionModel/ModelMap:向請求域填充數據InputStream/OutputStream、Reader/Writer@RequestMapping("/editItems")
public String editItems(Model model,
@RequestParam(value = "id", required = true, defaultValue = "1") Integer itemsId) {
// required=true 時必須傳參,否則拋異常
// defaultValue 指定默認值
return "editItems";
}
不使用 @RequestParam 時,要求請求參數名與形參名完全一致。
規則:表單 input name 與 POJO 屬性名一致即可自動綁定(非形參名)。框架內部使用反射遍歷 POJO 屬性匹配。
public class Items {
private Integer id;
private String name;
private Float price;
// getter/setter 省略
}
// JSP: → 自動綁定到 items.name
POJO 包含 Date 類型屬性時,需註冊 Converter<String, Date>。
public class CustomDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source);
} catch (ParseException e) {
return null; // 綁定失敗返回 null
}
}
}
Spring 配置註冊轉換器
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.iot.learnssm.firstssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
| 維度 | Spring MVC | Struts 2 |
|---|---|---|
| 開發基礎 | 方法級(單例 Bean) | 類級(多例 Action) |
| 參數接收 | 方法形參 | 類成員變量 |
| 線程安全 | 天然線程安全 | 需開發者保證 |
| 性能 | 較高 | 標簽庫導致較慢 |
Spring MVC 基於方法開發,Controller 可安全單例;Struts 2 基於類開發,Action 必須多例,且標簽庫渲染較慢,建議搭配 JSTL 使用。