dwr.xml中的簽名(Signatures)
signatures段使DWR能確定集合中存放的數(shù)據(jù)類型。例如下面的定義中我們無法知道list中存放的是什么類型。

public class Check
{
  public void setLotteryResults(List nos)
  {
      ...
  }
}
signatures段允許我們暗示DWR應(yīng)該用什么類型去處理。格式對(duì)以了解JDK5的泛型的人來說很容易理解。

<signatures>
  <![CDATA[
  import java.util.List;
  import com.example.Check;
  Check.setLotteryResults(List<Integer> nos);
  ]]>
</signatures>
DWR中又一個(gè)解析器專門來做這件事,所以即便你的環(huán)境時(shí)JDK1.3 DWR也能正常工作。

解析規(guī)則基本上會(huì)和你預(yù)想規(guī)則的一樣(有兩個(gè)例外),所以java.lang下面的類型會(huì)被默認(rèn)import。

第一個(gè)是DWR1.0中解析器的bug,某些環(huán)境下不能返回正確類型。所以你也不用管它了。

第二個(gè)是這個(gè)解析器時(shí)"陽光(sunny day)"解析器。就是說它非常寬松,不想編譯器那樣嚴(yán)格的保證你一定正確。所以有時(shí)它也會(huì)允許你丟失import:

<signatures>
  <![CDATA[
  import java.util.List;
  Check.setLotteryResults(List<Integer>);
  ]]>
</signatures>
將來的DWR版本會(huì)使用一個(gè)更正式的解析器,這個(gè)編譯器會(huì)基于官方Java定義,所以你最好不要使用太多這個(gè)不嚴(yán)格的東西。

signatures段只是用來確定泛型參數(shù)中的類型參數(shù)。DWR會(huì)自己使用反射機(jī)制或者運(yùn)行時(shí)類型確定類型,或者假設(shè)它是一個(gè)String類型。所以:

不需要signatures - 沒有泛型參數(shù):

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可以通過運(yùn)行時(shí)類型確定:

public List<Date> method(String p);
沒有必要讓Javascript中的所有對(duì)象的key都是String類型 - 你可以使用其他類型作為key。但是他們?cè)谑褂弥皶?huì)被轉(zhuǎn)換成String類型。DWR1.x用Javascript的特性把key轉(zhuǎn)換成String。DWR2.0可能會(huì)用toString()方法,在服務(wù)段進(jìn)行這一轉(zhuǎn)換。


Comments  (Hide)
如果對(duì)于遠(yuǎn)程接口都包含public void method(Map<String, WibbleBean> p);和public void method(Map<String, String> p);的情況該怎么設(shè)置?DWR貌似會(huì)使用后面的設(shè)置,也就是好像不能夠兩種接口都成功設(shè)置。