JSF与DWR的整合

来源:互联网 发布:apktool mac 编辑:程序博客网 时间:2024/05/19 20:20

JSF与DWR的整合

    博客分类: 
  • DWR学习开发应用
DWRJSFJavaScriptAjaxJSP 

①、在正常配置DWR(包括reverse ajax配置)及JSF之后在web.xml中做如下定义:

 

    <filter>
        <filter-name>DwrFacesFilter</filter-name>
        <filter-class>
            org.directwebremoting.faces.FacesExtensionFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>DwrFacesFilter</filter-name>
        <url-pattern>/dwr/*</url-pattern>
    </filter-mapping>

 


②、在jsp页面中,引入DWR的一些js脚本,并编写你自己的javascript,例如:

  <script type='text/javascript' src='/DWRTest/dwr/engine.js'> </script>
  <script type='text/javascript' src='/DWRTest/dwr/util.js'> </script>
  <script>
  function alertTest(msg){
   alert(msg);
  }
  </script>

 


在<body>标签中增加一个reverse ajax的显式设置:<body onload="dwr.engine.setActiveReverseAjax(true);">

③、ManagedBean中,写一个actionListener方法

 FacesContext facesContext = FacesContext.getCurrentInstance();
 ServletContext servletContext = (ServletContext)facesContext.getExternalContext().getContext();
 ServerContext sctx = ServerContextFactory.get(servletContext);
Collection sessions = sctx.getScriptSessionsByPage("/DWRTest/test.faces");
Util pages = new Util(sessions);
pages.addFunctionCall("alertTest", "hello dwr");

 


注意,不能采用DWR在普通jsp中获取ServletContext的方法,因为在那种方式中,URL的解析是通过DWRServlet解析的,而在JSF中是由FacesServlet来解析的,所以使用WebContextFactory.get().getServletContext() 会得到NullPointerException.

此处不用在dwr.xml中定义相应的内容,因为客户端不需要调用服务器端,而是服务器端调用客户端。 



JSF中配置dwr

    博客分类: 
  • 软件开发
JSFDWRSpringJS调用Java方法 

本文以实例形式描述在jsf中配置dwr的方法。

 

应用要求:在javascript方法中调用后台Bean的方法和Spring容器中服务的方法。

 

步骤如下:

     1、  JAR包支持

 

dwr.jar、json-lib-2.3-jdk13.jar,ezmorph-1.0.6.jar

说明:依赖的jar包:commons-collections-XX.jar,版本必须在3.0以上

 

2、web.xml配置DwrServlet和FacesExtensionFilter

 

Xml代码  收藏代码
  1. <!-- dwr begin -->  
  2.   <servlet>  
  3.     <servlet-name>dwr-invoker</servlet-name>  
  4.     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  5.     <init-param>  
  6.       <param-name>debug</param-name>  
  7.       <param-value>true</param-value>  
  8.     </init-param>  
  9.     <init-param>  
  10.       <param-name>crossDomainSessionSecurity</param-name>  
  11.       <param-value>false</param-value>  
  12.     </init-param>  
  13.     <load-on-startup>1</load-on-startup>  
  14.   </servlet>  
  15.   <servlet-mapping>  
  16.     <servlet-name>dwr-invoker</servlet-name>  
  17.     <url-pattern>/dwr/*</url-pattern>  
  18.   </servlet-mapping>  
  19.   <!--DWR/Faces 过滤器允许你不在JSF的生命周期里调用FacesContext中的Bean。-->  
  20.   <filter>  
  21.     <filter-name>DwrFacesFilter</filter-name>  
  22.     <filter-class>org.directwebremoting.faces.FacesExtensionFilter</filter-class>  
  23.   </filter>  
  24.   <filter-mapping>  
  25.     <filter-name>DwrFacesFilter</filter-name>  
  26.     <url-pattern>/dwr/*</url-pattern>  
  27.   </filter-mapping>  
  28.  <!-- dwr end -->  

 

 

 

<!--[if !supportLists]-->   3、  <!--[endif]-->在WEB-INF下建立dwr.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">  
  3. <dwr>  
  4.     <allow>  
  5.         <!--调用jsf后台Bean的方法-->  
  6.         <create creator="jsf" javascript="BranchMerg">  
  7.             <param name="managedBeanName" value="BranchMerg" />  
  8.             <param name="class"  
  9.                 value="cn.ccb.zjtsrmbp.security.web.bb.BranchMerg" />  
  10.         </create>  
  11. <!--直接调用spring容器内服务的方法-->  
  12. <create javascript="billBranch" creator="spring">  
  13.             <param name="beanName" value="securityBillBranchNewUCCTarget" />    
  14.         </create>  
  15.     </allow>  
  16. </dwr>  

 

 4、  Service里的方法范例

 

Java代码  收藏代码
  1. public String getSubBillBranch(String orgNo) {  
  2.   
  3.     List objects=XXX;//可序列化的对象  
  4.     JSONArray jsonArray = JSONArray.fromObject(objects);//通过json方式进行序列化  
  5.     String jsonStr = jsonArray.toString();  
  6.     return jsonStr;  
  7. }  

 

5、JS方法调用DWR

 

Html代码  收藏代码
  1. <script type="text/javascript"  
  2.         src="<%=request.getContextPath()%>/js/util.js"></script>  
  3.     <script type='text/javascript'  
  4.         src='<%=request.getContextPath()%>/dwr/engine.js'></script>  
  5.     <!---下面的billBranch.js名称对应dwr.xml里的配置--->  
  6.     <script type='text/javascript'  
  7.         src='<%=request.getContextPath()%>/dwr/interface/billBranch.js'></script>  
  8. ………………………….  
  9.   
  10. <script >  
  11. 方法一:js方法里直接获取spring容器内对象,并调用方法  
  12. //参数  
  13. var tempBranchCode = '<%=request.getSession().getAttribute("logonBranchId")%>';     
  14. //直接使用,并传参,指定回调函数  
  15. billBranch.getSubBillBranch(tempBranchCode,invokeFun);  
  16. //回调函数接收java方法的json结果,并做解析  
  17. function invokeFun(data){  
  18.     alert(data);  
  19. }  
  20. 方法二:js直接调用指定后台bean的方法  
  21. function go(){  
  22.    BillFee.findFirstPage(invokeFun);  
  23.  }  
  24.  function invokeFun (){  
  25.   alert(“over!”);  
  26.  }  
  27. </script>  



JSF和DWR整合详解

    博客分类: 
  • DWR学习开发应用
DWRJSFServletBeanJava 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  5.     <context-param>  
  6.         <param-name>javax.faces.CONFIG_FILES</param-name>  
  7.         <param-value>/WEB-INF/faces-config.xml</param-value>  
  8.     </context-param>  
  9.     <servlet>  
  10.         <servlet-name>Faces Servlet</servlet-name>  
  11.         <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>  
  12.         <load-on-startup>0</load-on-startup>  
  13.     </servlet>  
  14.     <servlet-mapping>  
  15.         <servlet-name>Faces Servlet</servlet-name>  
  16.         <url-pattern>*.jsf</url-pattern>  
  17.     </servlet-mapping>  
  18.   
  19.     <servlet>  
  20.         <servlet-name>dwr-invoker</servlet-name>  
  21.         <servlet-class>  
  22.             org.directwebremoting.servlet.DwrServlet  
  23.         </servlet-class>  
  24.         <init-param>  
  25.             <param-name>debug</param-name>  
  26.             <param-value>true</param-value>  
  27.         </init-param>  
  28.         <load-on-startup>1</load-on-startup>  
  29.     </servlet>  
  30.   
  31.     <servlet-mapping>  
  32.         <servlet-name>dwr-invoker</servlet-name>  
  33.         <url-pattern>/dwr/*</url-pattern>  
  34.     </servlet-mapping>  
  35. <!--DWR/Faces 过滤器允许你不在JSF的生命周期里调用FacesContext中的Bean。-->  
  36.     <filter>  
  37.         <filter-name>DwrFacesFilter</filter-name>  
  38.         <filter-class>  
  39.             org.directwebremoting.faces.FacesExtensionFilter  
  40.         </filter-class>  
  41.     </filter>  
  42.     <filter-mapping>  
  43.         <filter-name>DwrFacesFilter</filter-name>  
  44.         <url-pattern>/dwr/*</url-pattern>  
  45.     </filter-mapping>  
  46. </web-app>  


2.UserBean.java

Java代码  收藏代码
  1. package com.jsfdemo.bean;  
  2.   
  3. public class UserBean extends Object {  
  4.   
  5.     public String testDwr(String name){  
  6.             System.out.println("Hello:"+name);  
  7.             return "Hello:"+name;  
  8.           
  9.     }  
  10. }  


3.dwr.xml

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">  
  3.   
  4. <faces-config>  
  5.     <navigation-rule>  
  6.         <from-view-id>/userLogin.jsp</from-view-id>  
  7.     </navigation-rule>  
  8.     <managed-bean>  
  9.         <managed-bean-name>UserBean</managed-bean-name>  
  10.         <managed-bean-class>  
  11.             com.jsfdemo.bean.UserBean  
  12.         </managed-bean-class>  
  13.         <managed-bean-scope>session</managed-bean-scope>  
  14.     </managed-bean>  
  15. </faces-config>  


5.jsp

<%@ page language="java" pageEncoding="UTF-8"%>   
  1. <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>   
  2. <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  4. <html>   
  5. <head>   
  6. <script type="text/javascrip   
  7.     src="<%=request.getContextPath() %>/dwr/engine.js"></script>   
  8. <script type="text/javascript"  
  9.     src="<%=request.getContextPath() %>/dwr/util.js"></script>   
  10. <script type='text/javascript'  
  11.     src='<%=request.getContextPath() %>/dwr/interface/userbean.js'> </script>   
  12.   
  13. <title>jsf整合dwr</title>   
  14. <script type="text/javascript">   
  15.         function testdwr(){   
  16.                 userbean.testDwr("lobby",back);   
  17.         }   
  18.         function back(data){   
  19.             alert(data);   
  20.         }   
  21.     </script>   
  22. </head>   
  23. <body>   
  24. <f:view>   
  25.     <h:form id="loginForm" rendered="true">   
  26.         <h:commandButton value="dwr" rendered="true" onclick="testdwr()" id="dwr" />   
  27.     </h:form>   
  28. </f:view>   
  29. </body>   
  30. </html> 




  31. DWR 的配置详解---好东西啊

    DWRSpringBeanJSFJavaScript 
    最近,公司有一个查询系统,我本来是用jsf+Spring+Hibernate 结合的,在开发过程中,发现从jsp 过渡到JSF 确实有点难度,JSf 一切作用域和组件的使用,时间listeners 监听器作用,这些,让我还是不敢开始动手JSf 的开发,所有 
    Dwr+Spring+Hibernate 作为主要技术! 
    首先,dwr jar 这些就不说了。 
    dwr.xml是DWR的配置文件。默认情况下,应该把它放到WEB-INF目录(web.xml的目录)下 

    创建dwr.xml文件 
    dwr.xml文件的结构如下: 
    web.xml 也不讲了,只是一个过滤器配置,假如需要讨论:962589149 
    <!DOCTYPE dwr PUBLIC 
        "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
        "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> 

    <dwr> 

      <!-- init is only needed if you are extending DWR --> 
      <init> 
        <creator id="..." class="..."/> 
        <converter id="..." class="..."/> 
      </init> 

      <!-- without allow, DWR isn't allowed to do anything --> 
      <allow> 
        <create creator="..." javascript="..."/> 
        <convert converter="..." match="..."/> 
      </allow> 

      <!-- you may need to tell DWR about method signatures --> 
      <signatures> 
        ... 
      </signatures> 

    </dwr> 
    术语 
    这里是一些必须理解的术语 - 参数会被converted,远程Bean会被created。所以如果你有一个叫A的bean,它有一个方法叫A.blah(B) 那么你需要一个A的creator和一个B的converter。 

    一:<allow> 
    allow段落里面定义的试DWR可以创建和转换的类。 

    二:Creators 
    dwr.xml文件中的create元素的结构如下: 

    <allow> 
      <create creator="..." javascript="..." scope="..."> 
        <param name="..." value="..."/> 
        <auth method="..." role="..."/> 
        <exclude method="..."/> 
        <include method="..."/> 
      </create> 
      ... 
    </allow>这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。 

    creator属性 是必须的 - 它用来指定使用那种创造器。 

    默认情况下DWR1.1有8种创造器。它们是: 

    new: 用Java的new关键字创造对象。 
    none: 它不创建对象,看下面的原因。 (v1.1+) 
    scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。 
    spring: 通过Spring框架访问Bean。 
    jsf: 使用JSF的Bean。 (v1.1+) 
    struts: 使用Struts的FormBean。 (v1.1+) 
    pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+) 
    如果你需要写自己的创造器,你必须在init部分注册它。 

    javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。 

    scope属性 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。 

    scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。 

    param元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。 

    include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。 

    例如要拒绝防范除了setWibble()以外的所有方法,你应该把如下内容添加到dwr.xml中。 

    <create creator="new" javascript="Fred"> 
      <param name="class" value="com.example.Fred"/> 
      <include method="setWibble"/> 
    </create>对于加入到create元素中的类的所有方法都是默认可见的。 

    auth元素 允许你指定一个J2EE的角色作为将来的访问控制检查: 

    <create creator="new" javascript="Fred"> 
      <param name="class" value="com.example.Fred"/> 
      <auth method="setWibble" role="admin"/> 
    </create> 
    -------------------------------------------------------------------------------- 

    new创造器在DWR中已经默认声明了:<creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/> 。你不需要在dwr.xml文件中添加这段话,它已经存在于DWR的内部dwr.xml文件中了。 

    这个创造器通过类默认的够早函数创造对象实例。用new创造器有一些好处: 

    安全:DWR创造的对象生存的事件越短,多次调用中间的值不一致的错误机会越少。 
    内存消耗低: 如果你的站点用户量非常大,这个创造器可以减少VM的内存溢出。 
    你可以通过下面的方式使用new创造器来创造远程调用Bean: 

    <allow> 
      <create creator="new" javascript="Blah"> 
        <param name="class" value="java.util.Date"/> 
      </create> 
      ... 
    </allow>这些代码把 java.util.Date 映射成Javascript,并且命名为Blah,所以在Javascript中当你调用Blah.toString(reply) 那么一个新的 java.util.Date 就会通过默认的构造函数创造出来, 然后 toString() 方法被调用, 然后结果数据返回给reply方法(在这个例子中date是字符串格式)。 


    -------------------------------------------------------------------------------- 

    none'创造器不创建任何对象 - 它会假设你不需要创建对象。这有可能是对的,有两个原因。 

    你可能在使用的scope不是"page"(看上面),并在在前面已经把这个对象创建到这个scope中了,这时你就不需要再创建对象了。 

    还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR会在调用创建器之前先检查一下这个方法是不是静态的。 

    对于上诉两种情况,你仍然需要class参数,用来告诉DWR它是在操作的对象类型是什么。 


    -------------------------------------------------------------------------------- 

    scripted创造器在DWR中已经默认声明了:<creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/> 

    这个创造器用BSF来执行脚本得到Bean,例如: 

    <allow> 
      ... 
      <create creator="script" javascript="EmailValidator"> 
        <param name="language" value="beanshell"/> 
        <param name="script"> 
          import org.apache.commons.validator.EmailValidator; 
          return EmailValidator.getInstance(); 
        </param> 
      </create> 
      ... 
    </allow>script创造器有如下参数: 

    参数 DWR版本 描述 
    language 1.0 脚本语言,字符串,例如'beanshell'. (必需) 
    script 1.0 要执行的脚本。 (必需,除非scriptPath参数存在) 
    scriptPath 1.1 脚本文件路径。 (必需,除非script参数存在) 
    reloadable 1.1 是否检测脚本文件的改动,以重新加载 (可选, 默认true) 
    class 1.0 创造出对象的类型(可选). 如果没有DWR通过创造器得到类型。 


    需要了解的主题 
    要使用这个创造器,你需要把一些辅助库放到WEB-INF/lib文件夹下:BSF的jar包,你要用的脚本语言的jar包。 

    当一个类是用script创造出来的,并且scope是session或application,如果你的脚本改变,session中的类和script中的类就不一致了。这样会出现错误。虽然web容器不用重启,但是用户需要先登出(或以某种方式清空session),然后再登录。 

    当clazz参数不为空,并且用来创造新实例,DWR简单的调用 class.newInstance() 方法。这种方法是没问题的,除非脚本正在用某个参数创建一个类,或者调用某个函数来配置这个类。 不幸的是,每次请求都要重新运行script并造成上面的问题。 


    -------------------------------------------------------------------------------- 

    创造器 
    让DWR和Spring一起工作的步骤 
    确认你用的是最新版的DWR。Spring创造器已经有了变化,所以你最好检查一下DWR的最新版本。 
    确认你查看过开始指南中的内容。 
    确认你的Spring的Bean在DWR外面运行良好。 
    配置DWR和Spring一起工作。 (看下面) 
    查看演示页面: http://localhost:8080/[ YOUR-WEBAPP ]/dwr ,检查spring的Bean是否出现。 
    DWR对于Spring没有运行期依赖,所以如果你不使用Spring那么Spring的支持不会产生任何影响到。 

    The SpringCreator 
    这个创造器会查找spring的中配置的Bean,用Spring去创建它们。如果你已经在使用Spring,那么这个创造器会非常有用。 

    你可以通过下面的方式来创建远程调用的Bean: 

    <allow> 
    ... 
    <create creator="spring" javascript="Fred"> 
    <param name="beanName" value="Shiela"/> 
    </create> 
    </allow>寻找你的Spring配置 
    有三种方式寻找配置文件: 

    ContextLoaderListener 
    最简单的方式是使用org.springframework.web.context.ContextLoaderListener。你不必使用所有的Spring-MVC功能,只需要这个Listener就够了,所以这是个不错的方案。你需要在WEB-INF/web.xml中做如下配置: 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/beans.xml</param-value> 
    </context-param> 
    <listener> 
    <listener-class> 
    org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
    </listener>我能找到的ContextLoaderListener的最好的文档就是javadoc。如果你知道还有更好的文档,请告知我。 

    Rob Sanheim 指出还有一个能深入了解ContextLoaderListener的文档。 

    使用location*参数 
    如果你要在dwr.xml中指定使用哪些bean,你可以使用location*参数。你可以指定任意多个文件,只要参数以location开始并且唯一即可。例如:location-1, location-2。这些location被用做Spring的ClassPathXmlApplicationContext的参数: 

    <allow> 
    ... 
    <create creator="spring" javascript="Fred"> 
    <param name="beanName" value="Shiela"/> 
    <param name="location" value="beans.xml"/> 
    </create> 
    </allow>直接设置BeanFactory 
    SpringCreator有一个静态方法 setOverrideBeanFactory(BeanFactory) 用来通过编程的方式直接设置BeanFactory。 

    配置DWR和Spring 
    Bram Smeets写了一个有意思的blog,教你配置DWR使用beans.xml代替WEB-INF/web.xml。 

    我也对于如何在beans.xml中指定dwr.xml很感兴趣,尽管这看上去有些Spring传染病的感觉。有人知道如何实现吗?请加入邮件列表并告诉大家。 


    -------------------------------------------------------------------------------- 

    整合 
    DWR包括两个JSF的扩展点,一个创造器和一个ServletFilter。 

    'jsf'创造器 
    DWR1.1中有一个体验版的JsfCreator。你可以哉dwr.xml中这样使用: 

    <allow> 
      ... 
      <create creator="jsf" javascript="ScriptName"> 
        <param name="managedBeanName" value="beanName"/> 
        <param name="class" value="your.class"/> 
      </create> 
      ... 
    </allow>这将允许你通过DWR调用ManagedBean。 

    The Servlet Filter 
    DWR/Faces 过滤器允许你不在JSF的生命周期里调用FacesContext中的Bean。 

    要使用JsfCreator,你应该把DWR/Faces过滤器加到web.xml中。 

    <filter> 
      <filter-name>DwrFacesFilter</filter-name> 
      <filter-class>uk.ltd.getahead.dwr.servlet.FacesExtensionFilter</filter-class> 
    </filter> 

    <filter-mapping> 
      <filter-name>DwrFacesFilter</filter-name> 
      <url-pattern>/dwr/*</url-pattern> 
    </filter-mapping>这两个需要放在web.xml中与其他的filter和filter-mapping放在一起。 


    -------------------------------------------------------------------------------- 

    整合Struts 
    DWR几乎可以和任何Framework一起工作。这个网站(DWR的官方网站)就是这一点的有力证明,因为它是在Drupal(PHP)中使用DWR。 

    DWR和Struts整合有两个层次。最基础的层次就是同时使用两个Framework,这是非常容易的,但是这样就不允许在DWR和Struts之间共享Action了。 

    DWR可以调用任何方法,所以没有理由不让你从DWR调用Struts的Action,除非你不想这样用。ActionForm的内容是什么,当返回ActionForward时DWR怎么做? 

    一个比较好方法是重构你想调用的Action,提取出Action的逻辑。DWR和你的Action就可以同时调用相同的方法了。 

    The 'struts' 创造器 
    DWR1.1增加了一个StrutsCreator。你可以哉dwr.xml中这样使用: 

    <allow> 
      ... 
      <create creator="struts" javascript="ScriptName"> 
        <param name="formBean" value="formBeanName"/> 
      </create> 
      ... 
    </allow>这样就允许你在DWR中调用FormBean了。 

    开始顺序 
    如果你要使用StrutsCreator那么你保证Struts在DWR之前被初始化。你可以在web.xml中把Struts的<load-on-startup>设置的比DWR低。 


    -------------------------------------------------------------------------------- 

    pageflow 创造器 

    DWR中有一个创造器可以和Weblogic或者Beehive中的PageFlow一起工作。 

    The 'pageflow' Creator 
    DWR1.1中加入了一个PageFlowCreator。你可以这样使用: 

    <allow> 
      ... 
      <create creator="pageflow" javascript="ScriptName"/> 
      ... 
    </allow>--------------------------------------------------------------------------------使用静态方法 
    DWR会在调用创建器之前先检查一下这个方法是不是静态的,如果是那么创造器不会被调用。很显然这个逻辑适用于所有创造器,尽管如此"null"创造器是最容易配置的。适用单例类 
    对于单例类的创建,最好适用BeanShell和BSF来实例化对象。详细信息参见'Scripted'创造器其他创造器 
    我么偶尔也需要一些新的创造器,最常见的是一个EjbCreator。讨论新的创造器的好地方是在邮件列表。DWR和HttpSessionBindingListeners 
    DWR1.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的 setAttribute() 
    方法。就是说,如果一个Bean在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR都会执行一次 
    session.setAttribute(yourBean) 
    。这看上去没有什么危害,但是如果你要使用servlet的事件机制的,就是说用了HttpSessionBindingListener接口,你就会发现valueBound和valueUnbound事件在每次调用时都会发生,而不是你想像的在bean被创建时以及session过期时。DWR2 只在第一次创建对象时调用 setAttribute() 。 三:Converters 
    我们必须保证所有的参数都可以被转换。JDK中的多数类型已经有转换器了,但是你需要给DWR转换你的代码的权利。一般来说JavaBean的参数需要一个<convert 
    ...>定义。默认情况下,如下类型不需要定义就可以转换:所有的原生类型 boolean,int,double, 等等 
    原生类型的对象类型 Boolean,Integer,等等 
    java.lang.String 
    java.util.Date 和SQL中的Date 
    以上类型组成的数组 
    以上类型的集合类型 (Lists, Sets, Maps, Iterators, 等) 
    从DOM, XOM, JDOM 和 DOM4J中的DOM对象 (类似 Element 和 Document) 
    下面这些转换器有单独章节介绍 

    Array Converter 
    Bean and Object Converters 
    Collection Converter 
    Enum Converter 
    DOM Objects 
    Hibernate整合 
    Servlet Objects (HttpServletRequest, HttpSession, etc) 
    基础的转换器 
    原生类型,String,像BigDecimal这样的简单对象的转换器已经有了。你不需要在dwr.xml中<allow>部分的<convert>中定义。它们默认支持。 

    默认支持的类型包括: boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String 

    Date转换器 
    Date转换器负责在Javascript的Date类型与Java中的Date类型(java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp)之间进行转换。同基础的转换器一样,DateConverter默认是支持的。 

    如果你有一个Javascript的字符串 (例如"01 Jan 2010") ,你想把它转换成Java的Date类型有两个办法:在javascript中用Date.parse()把它解析成Date类型,然后用DWR的DateConverter传递给服务器;或者把它作为字符串传递给Server,再用Java中的SimpleDateFormat(或者类似的)来解析。 

    同样,如果你有个Java的Date类型并且希望在HTML使用它。你可以先用SimpleDateFormat把它转换成字符串再使用。也可以直接传Date给Javascript,然后用Javascript格式化。第一种方式简单一些,尽管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些工具可以帮你,例如: 

    The Javascript Toolbox Date formatter 
    Web Developers Notes on Date formatting 
    其他对象 
    其实创建自己的转换器也很简单。Converter接口的Javadoc包含了信息。其实这种需要很少出现。在你写自己的Converter之前先看看BeanConverter,它有可能就是你要的。 

    四:<init> 
    可选的init部分用来声明创造bean的类和转换bean的类。多数情况下你不需要用到他们。如果你需要定义一个新的Creator [JavaDoc] 和 Converter [JavaDoc] , 那么你就需要在这里定义他们。但是建议你现检查一下DWR是不是已经支持了。 

    在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使用。这中方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import语句并不表明这个类已经被使用了。每一个creator和converter都用id属性,以便后面使用。 

    五:<signatures> 
    DWR使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,这时你可以在这里写下方法的签名来明确类型。 

    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()方法,在服务段进行这一转换。 
     

原创粉丝点击