dwr.xml中的簽名(Signatures)
signatures段使DWR能確定集合中存放的數據類型。例如下面的定義中我們無法知道list中存放的是什么類型。
public class Check
{
public void setLotteryResults(List nos)
{
...
}
}
signatures段允許我們暗示DWR應該用什么類型去處理。格式對以了解JDK5的泛型的人來說很容易理解。
<signatures>
<![CDATA[
import java.util.List;
import com.example.Check;
Check.setLotteryResults(List<Integer> nos);
]]>
</signatures>
DWR中又一個解析器專門來做這件事,所以即便你的環境時JDK1.3 DWR也能正常工作。
解析規則基本上會和你預想規則的一樣(有兩個例外),所以java.lang下面的類型會被默認import。
第一個是DWR1.0中解析器的bug,某些環境下不能返回正確類型。所以你也不用管它了。
第二個是這個解析器時"陽光(sunny day)"解析器。就是說它非常寬松,不想編譯器那樣嚴格的保證你一定正確。所以有時它也會允許你丟失import:
<signatures>
<![CDATA[
import java.util.List;
Check.setLotteryResults(List<Integer>);
]]>
</signatures>
將來的DWR版本會使用一個更正式的解析器,這個編譯器會基于官方Java定義,所以你最好不要使用太多這個不嚴格的東西。
signatures段只是用來確定泛型參數中的類型參數。DWR會自己使用反射機制或者運行時類型確定類型,或者假設它是一個String類型。所以:
不需要signatures - 沒有泛型參數:
public void method(String p);
public void method(String[] p);
需要signatures - DWR不能通過反射確定:
public void method(List<Date> p);
public void method(Map<String, WibbleBean> p);
不需要signatures - DWR能正確的猜出:
public void method(List<String> p);
public void method(Map<String, String> p);
不需要signatures - DWR可以通過運行時類型確定:
public List<Date> method(String p);
沒有必要讓Javascript中的所有對象的key都是String類型 - 你可以使用其他類型作為key。但是他們在使用之前會被轉換成String類型。DWR1.x用Javascript的特性把key轉換成String。DWR2.0可能會用toString()方法,在服務段進行這一轉換。
Comments (Hide)
如果對于遠程接口都包含public void method(Map<String, WibbleBean> p);和public void method(Map<String, String> p);的情況該怎么設置?DWR貌似會使用后面的設置,也就是好像不能夠兩種接口都成功設置。