1.什么是DWR
DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:
图1 DWR工作原理
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。
详情请参考:http://directwebremoting.org/
2.安装与配置
下载 dwr.jar,放到WEB-INF/lib下
整合ssh
2.1 Web.xml配置
在web.xml中加入DWRServlet
<servlet> <servlet-name>dwr</servlet-name> <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
|
2.3 dwr.xml配置
<?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 javascript="User" creator="spring"> <param name="beanName" value="userDAO"></param> </create> </allow> </dwr> |
creator:表示使用spring管理的对象
javascript:表示在js中所使用的名称
paramname="beanName" :要得到是一个bean 必须要这样写
value=“userDAO" :表示applicationContext.xml中bean的id
3.Jsp文件的编写
在jsp文件中引入相应的<javascript>标签内容值:
//<!—User.js是自动生成的 --> <script type='text/javascript' src='dwr/interface/User.js'></script> <!—-这个User.js本来是没有的,但是也需要写,要和dwr.xml文件中 javascript="User" 一样 --> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script><script> function ok(){ User.getSss(callback); //getSss是相应java类中的一个方法 // callback是回调函数 //在这里就可以调用userDAO中的各个方法了。 } function callback(data){ //data接收getSss方法的返回值 alert(data); }
</script> |
4. SSH整合后要将struts-config.xml文件中的
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property value="/WEB-INF/applicationContext.xml" property="contextConfigLocation"/>
</plug-in>
删除掉,在web.xml中添加另外一种整合方式:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
因为<plug-in> dwr无法执行到相应的操作,需要在web.xml加载中使用
较为经典的资料总结:
Web.xml 配置
1.基本配置
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
//这个参数DWR默认是false。如果选择true,我们可以通过 http://localhost:port/app/dwr看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false。
<init-param>
<param-name>exposeInternals</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
可能有几种情况,一一列举。一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml配置文件。
2.一个servlet,多个dwr.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.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文件将不会被读取。