DWR (Direct Web Remoting) 實現 JavaScript 與 Java 對象雙向轉換,核心接口 org.directwebremoting.convert.Converter,內置 20+ 轉換器覆蓋常見類型。
| 名稱 | 適用 Java 類型 | 轉換器類 |
|---|---|---|
| null | void, Void | NullConverter |
| enum | Enum | EnumConverter |
| primitive | 基本類型及包裝類 | PrimitiveConverter |
| bignumber | BigInteger, BigDecimal | BigNumberConverter |
| string | String | StringConverter |
| array | 基本類型數組 | ArrayConverter |
| map | Map | MapConverter |
| collection | Collection | CollectionConverter |
| date | Date, Calendar, SQL Date/Time/Timestamp | DateConverter |
| dom/dom4j/jdom/xom | 各類 XML 文檔模型 | DOMConverter 等 |
| servlet | ServletConfig, HttpServletRequest 等 | ServletConverter |
| bean | 任意 JavaBean | BeanConverter |
| object | Object (兜底) | ObjectConverter |
| hibernate2/3 | Hibernate 代理/持久化對象 | H2BeanConverter/H3BeanConverter |
| url | URL | URLConverter |
| exception | Exception/Throwable | ExceptionConverter/MinimalistExceptionConverter |
註冊於 dwr.xml:<converter id="date" class="org.directwebremoting.convert.DateConverter"/> → <convert converter="date" match="java.util.Date"/>
BaseCallMarshaller 通過反射 method.getParameterTypes()[i] 獲取類型,查找 Converter MapDefaultConverterManager.convertOutbound() 中動態確定所有 Converter 繼承 BaseV20Converter implements Converter,僅需實現兩方法:
Object convertInbound(Class paramType, InboundVariable data, InboundContext ctx):JS → JavaOutboundVariable convertOutbound(Object data, OutboundContext ctx):Java → JS復雜類型遞歸轉換:如 {id:1, name:'A', blogs:[...]} → Person{int id; String name; String[] blogs} 經歷 bean → primitive → array 三層 Converter。
參考 DateConverter:
convertInbound:解析字符串為 Date/Time/Timestamp/CalendarconvertOutbound:返回 new SimpleOutboundVariable("new Date(" + millis + ")", ctx, true) 生成 JS new Date() 代碼實現 getPropertyMapFromObject()、createTypeHintContext(),適合 JSON 庫輔助的對象序列化。
<converter id="special" class="com.example.dwr.SpecialConverter"/>
<convert converter="special" match="com.example.model.SpecialObject"/>
InboundVariable/OutboundVariable 結構dwr.xml 獨立管理,不混雜在 Spring 配置中