dwr基础:原理,配置,使用,异常

DWR的原理:在安装DWR时会在web.xml中配置一个servlet,这个servlet负责把前台的JS参数封装成JAVA,去调用你的JAVA类,然后将返回结果(JAVA类型)再翻译成JS生成到你的JSP页面上,给你的错觉就是你用JS直接调用了JAVA方法
实际:JAVA类实现了js与java类之间的接口(DWR根据Java类来动态生成JavaScrip代码,是不是有些像JSP是由servlet生成html页面的方式)
DWR的作用:DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java代码,就像在Java代码就在浏览器中一样。还支持一个可选的commons-logging日记操作
DWR的安装使用:
1、拷贝dwr.jar到项目的lib中
  2、配置web.xml,添加:
  <servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  <init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
  3、新建dwr.xml,配置允许js调用的class
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE dwr PUBLIC
      "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
      "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
  <dwr>
  <allow>
  <create creator="new" javascript="Hello" scope="page">
  <param name="class" value="demo.Hello" />
  </create>
  </allow>
  </dwr>
  如果有自定义类型可以考虑添加下面的配置在<allow>中
  <convert converter="bean" match="x.y.Bean"/>
  现在你必须让DWR知道通过XMLHttpRequest对象,什么对象将会接收请求。这个任务由叫做dwr.xml的配置文件来完成。在配置文件中,定义了DWR允许你从网页中调用的对象。从设计上讲,DWR允许访问所有公布类的公共方法,但在我们的例子中,我们只允许访问几个方法。下面是我们示例的配置文件:
  <dwr>
  <allow>
  <convert converter="bean" match="com.yd.pojos.Userss"/>
  <create creator="new" javascript="userAction" class="com.yd.imp.UserCol"> <!--不建议class,应该使用param的方式-->
  <include method="getALlUser"/>
  </create>
  </allow>
  </dwr>
  上面的文件实现了我们例子中的两个目标。首先,<convert>标记告诉DWR将com.yd.pojos.Userss对象的类型转换为联合数组,因为,出于安全的原因,DWR默认的不会转换普通bean。第二,<create>标记让DWR暴露出com.yd.imp.UserCol类给JavaScript调用;我们在页面中使用JavaScript文件被javascript属性定义。我们必须注意<include>标记,它指明了com.yd.imp.UserCol类的哪些方法可用。
  4、页面添加:
  <script type="text/javascript" src="dwr/engine.js"></script>
  <script type="text/javascript" src="dwr/util.js"></script>
  <script type="text/javascript" src="dwr/interface/Hello.js"></script>
  说明:Hello.js 对应dwr.xml <create creator="new" javascript="Hello" scope="page">
  5、自行设计调用处理方法
  <script type="text/javascript">
  function callback(str)
  {
  alert(str);
  }
  function test()
  {
  Hello.sayHelloTo("zhangsan",callback);
  }
  </script>

其他扩展:
多dwr.xml文件的配置
可能有几种情况,我们一一列举。 一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml.
一个servlet,多个dwr.xml配置文件;

java代码: <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>

在这种配置下,param-name的值必须以config开头。param-name可以有>=0个。如果没有param-name,那么将会读取 WEB-INF/dwr.xml。如果有大于零个param-name,那么WEB-INF/dwr.xml文件将不会被读取。

多个servlet,每个servlet对应一个或多个dwr.xml

java代码: <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<!--用classes/dwr.xml-->
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>

在这种情况下,我们可以根据J2EE security来控制权限,针对不同url,加不同的角色。

 

eclipse中工具自动提示的使用:
  所有文件都含有如下表头。
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE dwr PUBLIC
      "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
      "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
  所做操作为。1,找到表头中的"http://www.getahead.ltd.uk/dwr/dwr20.dtd",
    2,在dwr.jar包中将对应的dwr20.dtd文件找到,并解压到eclipse文件

eclipse\dwr\org\directwebremoting\dwr20.dtd下(仅作提示的话无所谓放在什么地方,为了以

后的使用方便,我暂时放到eclipse工具中)
    3,window-->preferences-->XML-->XML Catalog-->Add,出现:
        location:填写绝对路径:D:\Program

Files\eclipse\dwr\org\directwebremoting\dwr20.dtd
        Key type:选择uri
        key:填写http://www.getahead.ltd.uk/dwr/dwr20.dtd
,然后点击ok。

问题1:
DWR Could not initialize class org.directwebremoting.servlet.PlainPollHandler 解决 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
Could not initialize class org.directwebremoting.servlet.PlainPollHandler

原因:在web.xml中配置了debug或其他日志模式,但是没导入相关包
缺少commons-logging.jar,加入到WEB-INF/lib中解决
问题2:
解决DWR异常 java.lang.SecurityException: No class by name:

有可能是引入的相应的JS文件,但是没有在DWR.XML文件配置相应的类或是在create里面加入class=''属性,但是不是标准方式,因此报错

即:
<dwr>
  <allow>
    <create creator="new" javascript="ProductAction">
      <param name="class" value="com.cooguo.appstore.server.action.ProductAction"/>
    </create>
  </allow>
 </dwr>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值