DWR框架简单实例 (http://my.oschina.net/u/1790925/blog/366346)

本文介绍如何使用DWR框架实现简单的远程调用功能,包括下载和配置DWR、配置web.xml和dwr.xml文件、编写JavaScript代码及页面配置等步骤。

文章转自《http://my.oschina.net/u/1790925/blog/366346》,感谢大牛分享!

DWR框架简单实例

   1、从DWR官网下载最新版本的jar包,地址:http://directwebremoting.org/dwr/downloads/index.html

2、将jar包放入WEB-INF的lib文件夹下。同时,dwr依赖于commons-logging.jar这个包,所以必须将这个jar包也放入到WEB-INF的lib文件夹下。




3、配置dwr的环境:

a)配置web.xml文件.

<servlet>
 <servlet-name>dwr-invoker</servlet-name>
 <servlet-class>uk.ltd.getahead.dwr.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>

web.xml中其他配置不影响,正常配置即可

b)配置dwr

<?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="Chat">
           <param name="class" value="com.epri.xts.wxqyh.app.chatroom.module.Chat"/>
       </create>
       <convert converter="bean" match="com.epri.xts.wxqyh.app.chatroom.bean.Message"/>
   </allow>
</dwr>

<!--
   <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
   <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
-->

dwr.xml是dwr的核心配置文件,主要的标签有:<converter>、<convert>、<create>这三个标签。

<create>标签是dwr中重要的标签,用来描述 java(服务器端) 与 javascript (客户端)的交互方式。其基本格式如下:

<allow>
  <create creator="..." javascript="..." scope="...">
    <param name="..." value="..."/>
    <auth method="..." role="..."/>
    <exclude method="..."/>
    <include method="..."/>
  </create>
  ...
</allow>

其中,creator和javascript是必须属性,其他可以忽略。creator包含有以下几个值:

  new:Java用“new”关键字创造对象

  none:它不创建对象  (v1.1+)

  scripted:通过BSF使用脚本语言创建对象,例如BeanShell或Groovy

  spring:通过Spring框架访问Bean

  struts:使用Struts的FormBean  (v1.1+)

  jsf:使用JSF的Bean  (v1.1+)

  pageflow:访问Weblogic或Beehive的PageFlow  (v1.1+)

  ejb3:使用EJB3 session bean  (v2.0+)

这里初学,实用java new创建对象。




4、页面配置

页面需要引入3个JS

<script src="<%=ctxPath%>/dwr/interface/Chat.js" type="text/javascript"></script>
<script src="<%=ctxPath%>/dwr/engine.js" type="text/javascript"></script>
<script src="<%=ctxPath%>/dwr/util.js" type="text/javascript"></script>


其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js ,然后是dwr自动生成的js文件,名字必须和dwr.xml中create标签的javascript属性值一样,且必须是dwr/interface开头的目录

(千万不要这样干:曾经反编译别人代码学习时将这三个js反编译后放到本地。。结果无法执行。ps:必须要自己生成)

5、javascript代码:

// 发送消息
function sendMessage() {
	var text = DWRUtil.getValue("message");
	if("" != text){
		DWRUtil.setValue("message""");
		Chat.addMessage(text, name, taskId, gotMessages);
	}
}
function gotMessages(messages) {
	var chatlog = "";
	for ( var data in messages) {
	    chatlog = "<div> <li class='even'>" + messages[data].text + "</li></div
	}
	DWRUtil.setValue("chatlog", chatlog);
	setTimeout("queryMessage()", 2000);
}

function queryMessage() {
	Chat.getMessages(taskId, gotMessages);
}

html代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
	String ctxPath = request.getContextPath();
%>
<html>
<head>
<title>聊天组</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="../css/jquery.mobile-1.4.5.min.css">
<link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css">
<link rel="stylesheet" href="../css/add.css">
<script src="../js/jquery-1.8.3.min.js"></script>
<script src="../js/jquery.mobile-1.4.5.min.js"></script>
</head>
<body class="bgc" onload="queryMessage()">

	<div data-role="page" id="pageone">

		<!-- 聊天内容显示区域 -->
		<div data-role="content" class="container" role="main">
			<ul class="content-reply-box mg10" id="chatlog">
			
			</ul>
		</div>
		
		<!-- 下方输入框 -->
		<div data-position="fixed" data-role="footer">
			<ul class="footer">
				<li class="col-xs-3">
					<span class="b_pic">
						<form action="<%=request.getContextPath()%>/chat" method="post"
							enctype="multipart/form-data" data-ajax="false" name="form"
							id="form"  target="relnews">
							<input type="hidden" name="name" id="name" value="" /> 
							<input type="hidden" name="taskId" id="taskId" value="" /> 
							<input type="file" name="image" id="image" class="photo" onchange="sendImage(this)" />
						</form>
					</span>
				</li>
				<li class="col-xs-6"><input type="text" name="fname" id="message"></li>
				<li class="col-xs-4"><a href="" data-role="button"
					class="b_submit" id="submitInfo" onclick='sendMessage();'>发送</a></li>
			</ul>
		</div>
		
	</div>
	
<!-- 隐藏域作为表单提交后页面不跳转使用 -->
	<iframe align="center" frameborder="0" marginheight="0" marginwidth="0"
		name="relnews" id="hiddenIframe" scrolling="no"
		style="width: 100%; height: 100%; display: none"> </iframe>
		
</body>
<script src="<%=ctxPath%>/dwr/interface/Chat.js" type="text/javascript"></script>
<script src="<%=ctxPath%>/dwr/engine.js" type="text/javascript"></script>
<script src="<%=ctxPath%>/dwr/util.js" type="text/javascript"></script>
<script type="text/javascript" src="../js/chat.js"></script>
</html>

6、其他

dwr可以设置是否采用异步方式访问java代码:

dwr.engine.setAsync(false);  //false为同步,true(默认)为异步

以及dwr对于异常的处理,这里标注一个简单的全局异常,细分的后续学习补充:

dwr.engine.setErrorHandler(errh);
function errh(errorString, exception) {
    errorFlag = true;
    alert("操作失败!");
}
 

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
<think>好的,用户现在的问题是解决DWR相关DTD文件未注册的问题,具体是dwr20.dtd的URL未注册。首先,我需要回忆一下DWR(Direct WebRemoting)的基本知识。DWR是一个用于改善在Web应用中Java和JavaScript之间交互的框架,它允许在客户端JavaScript中直接调用服务器端的Java方法。用户提到的问题是关于DTD文件未注册。DTD(DocumentType Definition)是XML文件的验证机制,用来定义XML文档的结构。当XML解析器处理带有DOCTYPE声明的XML文件时,通常会根据指定的DTD来验证文档的结构是否符合规范。如果DTD的URL不可访问,可能会导致解析错误或验证失败。在用户提供的引用[1]中,有一个DOCTYPE声明指向了http://www.getahead.ltd.uk/dwr/dwr20.dtd。如果这个URL无法访问,解析器在验证时就会报错。这种情况通常发生在本地开发环境中,或者当该DTD文件被移动或删除时。接下来,我需要分析用户可能的场景。用户可能在配置DWR框架时遇到了XML解析的问题,导致应用启动失败或功能异常。用户可能是在使用较旧的DWR版本,因为较新的版本可能已经不再依赖外部的DTD文件,或者转而使用其他验证方式,如XML Schema(XSD)。 解决方案方面,首先想到的是本地DTD文件的配置。如果应用无法访问远程的DTD URL,可以将DTD文件下载到本地,并在XML中引用本地路径。这样解析器会从本地读取DTD,避免网络请求失败的问题。但需要确保文件路径正确,并且有权限访问。 另一个方法是禁用DTD验证。如果用户不需要严格的XML验证,或者信任XML的结构正确性,可以通过配置XML解析器来忽略DTD验证。这可以通过设置解析器的相关属性来实现,例如在Java中设置特定的系统属性或使用解析器的特性来禁用外部实体处理。 另外,升级DWR版本可能也是一个解决方案。较新的DWR版本可能已经移除了对外部DTD的依赖,或者改用XSD进行验证。检查DWR的官方文档或更新日志,确认是否有版本解决了这个问题。在实施解决方案时,需要注意不同环境的配置差异,例如开发环境和生产环境可能需要不同的处理方式。同时,禁用DTD验证可能会带来安全风险,比如XML外部实体(XXE)攻击,因此需要评估风险后再决定是否采用此方法。 用户可能还会遇到相关的问题,例如如何配置DWR的其他部分,或者如何处理其他XML解析问题。因此,生成的相关问题需要围绕DWR配置、XML解析优化、版本升级的影响等方面展开。最后,确保回答结构清晰,分步骤说明解决方案,并提供具体的配置示例,帮助用户逐步解决问题。同时,引用用户提供的参考信息,并在适当的位置添加引用标识,如[^1],以保持回答的准确性和参考依据。</think>### 解决DWR的`dwr20.dtd`未注册问题 --- #### 一、问题定位 当XML解析器无法访问DWR的DTD文件(如`dwr20.dtd`)时,会导致以下问题: 1. **XML验证失败** XML配置文件包含DTD引用声明: ```xml <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd"> [^1] ``` 若远程DTD文件不可访问,解析器会抛出`FileNotFoundException`。 2. **依赖网络稳定性** 旧版DWR框架依赖远程DTD验证,若服务器无法连接外网或目标URL失效,会导致应用启动失败。 --- #### 二、解决方案 ##### 1. 使用本地DTD文件(推荐) **步骤**: 1. 下载`dwr20.dtd`文件到项目资源目录: ``` src/main/resources/dtd/dwr20.dtd ``` 2. 修改XML的DOCTYPE声明,指向本地路径: ```xml <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "classpath:/dtd/dwr20.dtd"> ``` 3. 配置XML解析器的实体解析策略(以SAX解析器为例): ```java SAXReader reader = new SAXReader(); reader.setEntityResolver((publicId, systemId) -> { if (systemId.contains("dwr20.dtd")) { return new InputSource(getClass().getResourceAsStream("/dtd/dwr20.dtd")); } return null; }); ``` ##### 2. 禁用DTD验证 通过配置解析器忽略外部DTD验证: ```java // 禁用DTD验证(适用于JDK1.5+) System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); ``` ##### 3. 升级DWR版本 新版DWR(如3.x+)默认使用XSD替代DTD验证,彻底避免该问题: ```xml <!-- 使用XSD的配置方式 --> <dwr xmlns="http://www.directwebremoting.org/schema/spring-dwr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"> </dwr> ``` --- #### 三、验证方法 1. **本地DTD生效测试** 在IDE中运行以下代码检查DTD加载: ```java @Test public void testDtdResolution() throws Exception { SAXReader reader = new SAXReader(); reader.read("src/main/webapp/WEB-INF/dwr.xml"); // 应无异常抛出 } ``` 2. **网络请求监控** 使用Wireshark抓包验证是否仍尝试访问`http://www.getahead.ltd.uk/dwr/dwr20.dtd`。 --- #### 四、关联配置参数 | 配置项 | 作用 | 示例值 | |--------|------|--------| | `javax.xml.parsers.DocumentBuilderFactory` | 设置XML解析器工厂类 | `com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl` | | `http://apache.org/xml/features/nonvalidating/load-external-dtd` | 禁用外部DTD加载 | `false` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值