DWR3.0简单原理介绍和案例

DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。

DWR是一个RPC库,可以很容易地从JavaScript调用Java函数并从Java调用JavaScript函数(也称为反向Ajax)

DWR由两个主要部分组成:

  • 在服务器上运行的Java Servlet,它处理请求并将响应发送回浏览器。
  • JavaScript在浏览器中运行,可以发送请求并可以动态更新网页。

DWR通过基于Java类动态生成Javascript来工作。代码执行一些Ajax使其感觉神奇执行在浏览器上发生,但实际上服务器正在执行代码,DWR正在编组数据前后。

这种从Java到JavaScript的远程处理功能的方法使DWR用户感觉非常像传统的RPC机制,如RMI或SOAP,其好处是它可以在Web上运行而无需Web浏览器插件。

案例分析

demo下载地址:https://download.csdn.net/download/u012401711/10561121

首先我们看搭建的过程

官网下载dwr的jar包和相关的js文件

将dwr.jar引入工称中,将engine.js和util.js放入到工程的静态文件区(随意放置),创建一个dwr.xml文件和web.xml同级

 首先说一下web.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>dwr-demo</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>  
            org.directwebremoting.servlet.DwrServlet  
        </servlet-class>
    <init-param>
      <param-name>crossDomainSessionSecurity</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>allowScriptTagRemoting</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>classes</param-name>
      <param-value>java.lang.Object</param-value>
    </init-param>
    <init-param>
      <param-name>activeReverseAjaxEnabled</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>initApplicationScopeCreatorsAtStartup</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>maxWaitAfterWrite</param-name>
      <param-value>3000</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>logLevel</param-name>
      <param-value>WARN</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/static/dwr/*</url-pattern>
  </servlet-mapping>
</web-app>

dwr就是通过servlet-mapping地址映射去执行相应的servlet逻辑代码,注意映射的地址就是上面提到的engine.js和util.js所在文件的地址。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC  
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"  
    "http://getahead.org/dwr/dwr20.dtd">
<dwr>
	<allow>
		<!-- Reverse Ajax Stock push Demo Config <create creator="new" javascript="StocksPusher"> 
			<param name="class" value="com.test.dwr.servlet.Test"/> </create> <convert 
			converter="bean" match="com.test.dwr.bean.Message"> <param name="include" 
			value="id,context" /> </convert> -->
		<create creator="new" javascript="RequestPush">
			<param name="class" value="cn.gumx.common.dwr.RequestPush" />
		</create>

	</allow>
</dwr>

dwr.xml的内容,class类就是我们需要编写的Java类,其中javaacript就是后面提到jsp页面引入的js的名称。

    <!-- dwr推送 strat -->
	<script type='text/javascript' src='${pageContext.request.contextPath}/static/dwr/engine.js'></script>
  	<script type='text/javascript' src='${pageContext.request.contextPath}/static/dwr/util.js'></script>
  	<script type="text/javascript" src="${pageContext.request.contextPath}/static/dwr/interface/RequestPush.js"></script>
    <!-- dwr推送 end -->

页面引入的js中上面那两个文件是存在的第三个文件则没有,这个就会生成的js名称就是在dwr.xml中提到的,文件夹路径固定的在dwr静态目录后面加上interface。

编写Java类

public class RequestPush{
	
    public static Map<Object,String> map = new HashMap<Object,String>();
	
    public void onPageLoad(String flag) {
    	//ScriptSession每个页面都存在一个
        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
        //如果一个页面存在多个推送模块,可以使用,隔开
        if(map.containsKey(scriptSession)){
        	String value = map.get(scriptSession);
        	map.put(scriptSession, value+","+flag);
        }else{
        	map.put(scriptSession, flag);
        }
        scriptSession.setAttribute("flag", map);
        DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();
        try {
               dwrScriptSessionManagerUtil.init();
               System.out.println("----dwrScriptSessionManagerUtil--初始化完成---");
        } catch (ServletException e) {
               e.printStackTrace();
               System.out.println("----dwrScriptSessionManagerUtil--初始化失败---");
        }

    }
}

里面的方法名可以随意定义,里面我做了一些业务处理。这里面的方法就是相当于页面要去订阅消息,就如订报纸有很多种每个人订阅的类型不同,我们首先要告诉服务器我要订阅什么类型的数据,服务器才能将你需要的数据推送给你。

我们看到js中调用的方法是 RequestPush.onPageLoad()发现有点眼熟,其实就是我们实现的Java类.方法 好像前端可以直接像后端一样直接调用Java的方法,我们都知道这是不可能的,那是怎么实现的呢?

查看之前说过的前端页面引用的的不存在的js文件中的内容发现 ,通过这个文件做桥梁来实现前后端的动态的数据交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值