Dwr 实例教程

article/2025/10/18 19:51:58
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/9842873

一、Dwr的介绍

       Dwr 简称 Direct Web Remoting ,它是一个 Java Ajax远程调用的框架,利用这个框架开发可以让Ajax开发变得非常简单、快捷。 Dwr框架与匈奴开发人员在客户端都过javascript代码调用服务器段的java方法,这都依靠于服务器上运行的Dwr核心Servlet负责处理客户端的请求,将客户端请求委托到实际的java 对象中进行处理,并将结果返回给客户端。  另外Dwr能够很好的与spring集成,直接调用spring中注入的bean。


二、Dwr的准备条件

    dwr2.0.jar  下载地址: http://download.csdn.net/detail/ch656409110/5894411

    commons-logging.jar (查看源码可以看到Dwr运行时依赖于common-logging库)


三、Dwr执行的流程

1、首先客户端发送一个javascript的请求,dwr识别该请求之后会将请求委托到Dwr中和核心Servlet;

2、核心Servlet 会根据请求的对象以及方法去WEB-INF 下的dwr.xml中找到具体的关联对象;

3、如果满足调用的条件,那么服务器会执行该方法,并返回对应的结果,这里返回的结果会被客户端发送请求的回调函数接收;

4、客户端收到返回结果之后,做出对应的处理,整个请求结束。


四、Dwr的案例讲解

1、使用Dwr做一个简单的demo

<1>、建立Web 工程,添加Dwr的支持,这里以现有的支持struts2为基础的项目为例;

<2>、添加dwr配置文件,必须放在WEB-INF的根目录下,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN""http://getahead.org/dwr/dwr30.dtd">
<dwr><allow><create creator="new" javascript="dwrDate"><param name="class" value="java.util.Date"></param></create></allow>
</dwr>

根目录是<dwr>标签,里面的<allow>表示允许的方法列表,配置每一个对象都是<create>来区分的。

    creator:表示创建方式,取值有new,bean等等,其中new表示新建,bean表示取现有的对象。

    javascript:表示在js客户端调用的对象引用,比如这里配置的对象是java.util.Date,那么dwrDate 就是创建的对象引用,等价于java.util.Date dwrDate = new java.util.Date();

<create>里面的<param> 表示指定创建对象的声明;

    name:表示声明的name的形式;

    value:表示根据name绑定的具体值;

    name取值有class,beanName等等,其中name="class"表示value中绑定的是类的完整限定名,name="beanName"表示value绑定的是spring中注入的对象的引用。

<3>、修改web.xml 配置文件,配置Dwr的核心servlet,具体如下:

  <!-- 配置dwr框架的核心servlet --><servlet><servlet-name>dwr</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class><!-- 添加调试模式,方便调试方法,正式发布的时候可以改为false 默认值为fasle--><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>

如上配置,所有以/dwr/ 结尾的请求都会被DwrServlet匹配 执行相应的请求。

好了,接下可以调试我们的Dwr了,启动服务器,打开浏览器输入:http://localhost:8080/house/dwr  (这个是Dwr入口,将展示所有在dwr.xml中配置完的对象列表,点击进去会看到 配置的对象允许方法的方法等)

结果报错,具体如下:

严重: Allocate exception for servlet dwr
org.xml.sax.SAXException: Failed to resolve: arg0=-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN arg1=http://getahead.org/dwr/dwr30.dtd

这是因为添加的jar包是2.0版本的,但是却引用了3.0的dtd文件,所以报错了,改为如下配置即可:

<?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="dwrDate"><param name="class" value="java.util.Date"></param></create></allow>
</dwr>

修改之后再次打开dwr地址,又报错了:

Struts Problem Report

Struts has detected an unhandled exception:
Messages:     
There is no Action mapped for namespace / and action name dwr.
Stacktraces
There is no Action mapped for namespace / and action name dwr. - [unknown location]

意思就是说找不到namespace为 / 并且action名称为dwr的Action 类,这里是因为struts2 的核心控制器StrutsPrepareAndExecuteFilter,拦截了所有的请求去找action方法了,所以404。

现在要在struts.xml中过滤掉所有的以 /dwr/ 这样子结尾的请求才行,添加一个不包括访问的参数即可,具体如下:

    <!-- 核心控制器在处理页面跳转时是拦截所有跳转,当跳转到house/dwr/下进行方法测试时,struts核心控制把它看成是一个action,所以就跳不过去了,可以通过配置一个常量struts.action.excludePattern,值里面用正则表达式匹配,.  表示除了换行以外其他所有的字符 *  表示字符或表达式出现的次数零次或多次    --><constant name="struts.action.excludePattern" value="/dwr.*"></constant>
保存struts.xml 再次启动服务器,打开地址,效果如下:


这个就表示 我们在dwr.xml中配置的dwrDate对象成功了。点击dwrDate超链接,效果如下:


这里面列出了所有的java.util.Date中所有允许访问的放,点击每一个execute 表示测试该方法。。

ok....现在在Action类中添加一个方法dwrDemo() 并且对应创建一个dwrDemo.jsp 专门用于测试dwr。

具体如下:

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/common/taglib.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>永恒租房 - 首页</title><!-- 这三个js导入项必不可少 --><!-- 每一个对象都会有以一个对象为名称的那个js库 --><script type='text/javascript' src='${ctx}/dwr/interface/dwrDate.js'></script><!-- Dwr 引擎库 --><script type='text/javascript' src='${ctx}/dwr/engine.js'></script><!-- Dwr 工具库 --><script type='text/javascript' src='${ctx}/dwr/util.js'></script><script>window.onload = function(){            //输出当前时间//需要说明的是,如果在客户端输出dwrDate 对象将返回undefined,除非调用完整的函数(也就是服务器端的方法)才会调用成功//客户端接收参数的方法都是通过回调函数来获取的。dwrDate.getYear(function(data){//在回调函数里面不能使用document.write("")输出,因为第一次输出之后,浏览器会一直处于加载的状态,f12看不出在加载什么,然后后面的document.write("")也不会再执行了。document.getElementById("showTime").innerHTML += 1900 + data + " 年 ";});dwrDate.getMonth(function(data){document.getElementById("showTime").innerHTML += 1 + data + " 月 ";});dwrDate.getDate(function(data){document.getElementById("showTime").innerHTML += data + " 日 ";});};</script>
</head>
<body>
<div id="showTime">当前时间:</div>
</body>
</html>
在地址栏输入: http://localhost:8080/house/house/dwrDemo.action ,结果alert了三个文本都是 Session Error 。

这里需要在dwrServlet中添加参数crossDomainSessionSecurity,具体配置如下:

  	<!-- 这个crossDomainSessionSecurity必须配置,应该是跨区域提交设置,默认是ture,如果不设置为false就会报错:Session Error --><init-param><param-name>crossDomainSessionSecurity</param-name>   <param-value>false</param-value>   </init-param>

然后再次重启服务器打开dwrDemo页面,效果如下:


2、使用Dwr服务器对象配置允许访问的方法

接下来,新创建一个类,里面有setValue(),getValue()等等方法,具体如下:

	private String value = "default";public String getValue(){return value;}public void setValue(String value){this.value = value;}

然后在dwr.xml中自己再配置一个自己定义的对象,具体如下:

         <create creator="new" javascript="houseDwrBiz"><param name="class" value="com.struts2.biz.impl.HouseBizImpl"></param><include method="getValue,setValue"/><exclude method="getListPage"/></create>
在配置文件中 ,新添加了 <include>和<exclude>标签,他们分别表示该对象中允许客户端访问的方法,和不允许访问的方法。

好了,然后打开服务器 启动调试窗口,结果直接报错,具体如下:

[ERROR] [http-apr-8080-exec-5] - Failed to add creator: type=new, javascript=houseDwrBiz
java.lang.IllegalArgumentException: The Creator houseDwrBiz uses mixed include and exclude statements

意思是说 <include>和<exclude>不能共存,也就是一山不容二虎。

并且实践证明,<include>标签里面只能绑定一个方法,如果配置了<include>那么其他就都不允许访问,如果配置了<exclude>那么其他的方法就都允许访问。

是否允许访问可以在调试页面中的方法下面注明,如下:

(Warning: getListPage() is excluded: Method access is denied by rules in dwr.xml. Seebelow)

这样子的话 每允许访问一个方法就要加一个<inclue>标签,具体如下:

         <create creator="new" javascript="houseDwrBiz"><param name="class" value="com.struts2.biz.impl.HouseBizImpl"></param><include method="getValue"/><include method="setValue"/><!-- <exclude method="getListPage"/> --></create>

添加测试的页面,具体如下:

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/common/taglib.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>永恒租房 - 首页</title><!-- 这三个js导入项必不可少 --><!-- 每一个对象都会有以一个对象为名称的那个js库 --><script type='text/javascript' src='${ctx}/dwr/interface/dwrDate.js'></script><script type='text/javascript' src='/house/dwr/interface/houseDwrBiz.js'></script><!-- Dwr 引擎库 --><script type='text/javascript' src='${ctx}/dwr/engine.js'></script><!-- Dwr 工具库 --><script type='text/javascript' src='${ctx}/dwr/util.js'></script><script>//这里故意命名为setValue getValue ,看是否与houseDwrBiz冲突,事实发现没有问题function setValue(){var value = document.getElementById("set").value;houseDwrBiz.getValue(value,function(data){//set success});}function getValue(){houseDwrBiz.getValue(function(data){//get successdocument.getElementById("get").value = data;});}</script>
</head>
<body>
<div id="showTime">当前时间:</div>
<input id="set" value=""/><input type="button" value="setValue" οnclick="setValue()"/><br/>
<input id="get" value=""/><input type="button" value="getValue" οnclick="getValue()"/></body>
</html>

实践证明,每一个houseDwrBiz 发出的请求都是多例的,都会重新产生一个新的实例,以为上面例子 我先setValue ,然后在getValue 得到依旧是default。


3、使用Dwr转换器保存对象以及接收对象集合

上面都是一些非常简单的例子,如果涉及比如复杂的需求,比如接受一个集合 或者保存一个对象到服务器呢?接下里简单介绍下如何去做。

HouseBizImpl 添加方法,具体如下:

	public int saveDwrHouse(House house){return house==null?0:1; //1 成功,0失败}public List<House> getDwrHouseList(int dwrId){List<House> houseList = new ArrayList<House>();House house = new House();if(dwrId==1){house.setId(1);house.setDescription("好房子便宜出租!");house.setPubDate(new Date());house.setTitle("便宜的房子");house.setContact("132312312");}else{house.setId(2);house.setDescription("好房子确实很便宜!");house.setPubDate(new Date());house.setTitle("全区最低价格特价出租");house.setContact("123456789");}houseList.add(house);return houseList;}
同时,dwr.xml也要把这两个方法 包含进去,否则不允许访问。具体如下:

 		<create creator="new" javascript="houseDwrBiz"><param name="class" value="com.struts2.biz.impl.HouseBizImpl"></param><include method="getValue"/><include method="setValue"/><!-- <exclude method="getListPage"/> --><include method="saveDwrHouse"/><include method="getDwrHouseList"/></create><convert converter="bean" match="com.struts2.entity.House"></convert>
在<create>标签的同级目录多了一个<convert>转换器标签,

converter:转换器类型,一般是javabean,直接指定converter="bean"就好了;

match:表示转换器匹配的类的完整限定名。

配置完毕之后,然后再在dwrDemo.jsp调用,具体如下:

			//得到house集合houseDwrBiz.getDwrHouseList(1,function(data){if(data != null){for(var i=0; i<data.length; i++){document.getElementsByTagName("body")[0].innerHTML = "id:"+ data[i].id + "。<br/>"+ "description:" + data[i].description + "。<br/>"+ "attachUrl:" + data[i].attachUrl + "。<br/>"+ "contact:" + data[i].contact + "。<br/>"+ "floorage:" + data[i].floorage + "。<br/>";}}});//保存house对象var house = {id:111,contact:"12345"};houseDwrBiz.saveDwrHouse(house,function(data){alert(data==1?"添加成功":"添加失败");});
测试可知  getDwrHouseList返回的是一个json格式的集合,同样保存house对象的时候也要手动封装数组传递。


五、Dwr的js库

在前面的例子中,有引用三个核心的js库,具体如下:

	<!-- 这三个js导入项必不可少 --><!-- 每一个对象都会有以一个对象为名称的那个js库 --><script type='text/javascript' src='/house/dwr/interface/houseDwrBiz.js'></script><!-- Dwr 引擎库 --><script type='text/javascript' src='${ctx}/dwr/engine.js'></script><!-- Dwr 工具库 --><script type='text/javascript' src='${ctx}/dwr/util.js'></script>
houseDwrBiz.js 是Dwr根据dwr.xml中配置的对象来动态生成的js库,里面封装的就是所有允许调用的js函数,具体如下:

// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;if (houseDwrBiz == null) var houseDwrBiz = {};
houseDwrBiz._path = '/house/dwr';
houseDwrBiz.getValue = function(callback) {dwr.engine._execute(houseDwrBiz._path, 'houseDwrBiz', 'getValue', callback);
}
houseDwrBiz.setValue = function(p0, callback) {dwr.engine._execute(houseDwrBiz._path, 'houseDwrBiz', 'setValue', p0, callback);
}
houseDwrBiz.saveDwrHouse = function(p0, callback) {dwr.engine._execute(houseDwrBiz._path, 'houseDwrBiz', 'saveDwrHouse', p0, callback);
}
houseDwrBiz.getDwrHouseList = function(p0, callback) {dwr.engine._execute(houseDwrBiz._path, 'houseDwrBiz', 'getDwrHouseList', p0, callback);
}

所以,现在对Dwr调用方式一目了然了。

engine.js 对Dwr非常的重要,它是Dwr客户端的核心,用来把动态声声称的Javascript对象转换成服务器端的java对象。

并且 在上面的houseDwrBiz.js中 每一个函数都是通过dwr.engine._execute()这个函数来调用后台服务器方法的,所以用到Dwr的地方就要用到它。

util.js 这个是Dwr提供的工具类,里面提供了一些javascript的封装函数以及选择器,要是有什么不会的可以直接查看它的源码。

下面例子讲解Dwr操作Select控件和表格如下:

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/common/taglib.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>永恒租房 - 首页</title><!-- 这三个js导入项必不可少 --><!-- 每一个对象都会有以一个对象为名称的那个js库 --><script type='text/javascript' src='/house/dwr/interface/houseDwrBiz.js'></script><!-- Dwr 引擎库 --><script type='text/javascript' src='${ctx}/dwr/engine.js'></script><!-- Dwr 工具库 --><script type='text/javascript' src='${ctx}/dwr/util.js'></script><script>window.οnlοad=function(){//获取对象直接使用$("id") 不用像以前一样使用document.getElementById("id")那么麻烦$("showTime").innerHTML = "当前时间:" + new Date();//对象赋值$("set").value = "12345";//util.js中的针对表单控件赋值和取值dwr.util.setValue("showTime","67890");alert(dwr.util.getValue("showTime"));//使用dwr.util.removeAllOptions("id")删除select控件中所有的option元素//至于为什么要这么用在util.js中有清晰的函数说明dwr.util.removeAllOptions("slt");};//添加Select控件的option元素,需要传递json格式的对象function addOption(){var array = [{id:"a",name:"aaa"},{id:"b",name:"bbb"},{id:"c",name:"ccc"}];//这里面参数必须都要指定,id,封装的数组,value,name  如果不指定value,name 将添加的全是[object, Object]dwr.util.addOptions("slt",array,"id","name");}//删除table中所有的rows, 只会留一个空的table标签function removeAllRows(){dwr.util.removeAllRows("tbl");}//添加表格中的row ,同时也需要传递json格式的对象function addRows(){var array = [{id:"b",name:"bbb"},{id:"c",name:"ccc"},{id:"d",name:"ddd"}];//从上面的array的数组中封装cellFuncs 这样一个函数组,用于从传递的行数据中提取单元格数据var cellFuncs = [function(data){return "<a href='javascript:alert(\"" + data.id + "\")'>" + data.id + "</a>";},function(data){return "<a href='javascript:alert(\"" + data.name +"\")'>" + data.name + "</a>";},function(data){return "<a href='javascript:alert(\"test\")'>测试</a>";}];//添加一行,然后escapeHtml表示是否将加入的元素按文本输出还是按html格式输出,默认是true,按文本输出dwr.util.addRows("tbl",array,cellFuncs,{escapeHtml:false});}</script>
</head>
<body>
<div id="showTime">当前时间:</div>
<input id="set" value=""/><input type="button" value="setValue" οnclick="setValue()"/><br/>
<input id="get" value=""/><input type="button" value="getValue" οnclick="getValue()"/><br/>
<select id="slt"><option value="1">111</option><option value="2">222</option><option value="3">333</option>
</select>
<input type="button" value="addOption" οnclick="addOption()"/>
<table border="1" width="50%" id="tbl"><tr><td>id</td><td>name</td><td>操作</td></tr><tbody id="tbl"><tr><td>a</td><td>aaa</td><td><a href="javascript:alert('test')">测试</a></td></tr></tbody>
</table>
<input type="button" value="removeAllRows" οnclick="removeAllRows()"/>
<input type="button" value="addRows" οnclick="addRows()"/><br/>
</body>
</html>
效果图如下图所示:


六、Dwr 与 Jquery 的区别

      Dwr 是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,因为它是java特有的框架,所以可以帮助开发人员开发包含AJAX技术的网站,它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA方法,就像它就在浏览器里一样。   

而Jquery是一个优秀的Javascrīpt框架。是一个js库,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+扽等)。jQuery使用户能更方便地处理HTML documents、DOM、events、实现动画效果,并且方便地为网站提供AJAX交互,而且还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,更加丰富和友好的展示Jquery带给我们的好处。

另外Dwr和Jquery都可以发送Ajax请求,尽管语法不同,另外他们操作对象并不兼容,因为他们都是通过$符号获取对象的,那么怎么区分,可以这样,具体如下:

		//解除 jQuery 的别名 $ ,默认使用jQuery 或者引用对戏那个jq都可以重新操作jquery元素。var jq=$.noConflict(); alert(jQuery("#showTime").html());


七、Dwr 与 Spring 集成

    如何项目中用到了Spring,那么之前在dwr.xml配置的对象其实可以交给Spring去管理的,实现的方式很简单,修改原先配置的houseDwrBiz 对象的配置,改为如下配置即可:

		<create creator="spring" javascript="houseDwrBiz"><param name="beanName" value="houseBizImpl"></param><include method="getValue"/><include method="setValue"/><!-- <exclude method="getListPage"/> --><include method="saveDwrHouse"/><include method="getDwrHouseList"/></create><convert converter="bean" match="com.struts2.entity.House"></convert>

修改的地址有两个,原先<create>中的creator 都是“new”,现在交给spring去管理了,所以是"spring",另外子元素<param>中的name原先是new 所以每次调用都会产生一个新的实例,现在换成beanName,表示去spring中注入的对象中找到houBizImple 直接拿来用。

这样 有一个好处,保证之前的多例访问模式变成单例了,从而节省每次调用都要创建对象的性能开销。


    现在对Dwr一定已经有一定的理解,这些小demo虽然非常简单,即使不使用强大的Dwr也可以非常容易的实现上面的功能,但是这些小程序是为了更加友好的体验和使用Dwr框架给我们带来的好处。




http://chatgpt.dhexx.cn/article/owJRF7PL.shtml

相关文章

Dreamweaver css盒模型

CSS盒模型概述&#xff1a;CSS盒模型(Box Model)规定了元素处理元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;的方式。 下图为盒模型模型图 盒模型各部分说明…

Dreamweaver css定位

规定元素的定位类型。 说明&#xff1a;这个属性定义建立元素布局所用的定位机制。任何元素都可以定位&#xff0c;不过绝对定位或固定元素会生成一个块级框&#xff0c;而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。 通过设置top bottom l…

DWR(2):DWR配置详情

下面我们通过一个简单的入门项目来讲解DWR的配置。 首先新建一个maven项目&#xff0c;结构如下&#xff1a; 1 引入依赖 <dependency><groupId>org.directwebremoting</groupId><artifactId>dwr</artifactId><version>3.0.0-RELEASE<…

DreamWeaver下如何应用CSS样式

首先介绍一下CSS样式的属性&#xff1a; CSS样式属性被分为八大类&#xff1a;类型&#xff0c;背景&#xff0c;区块&#xff0c;边框&#xff0c;列表&#xff0c;定位&#xff0c;扩展。 类型主要定义文本的字体&#xff0c;大小&#xff0c;颜色&#xff0c;行高和修饰等…

DW的基本操作

1、首先先打开我们的DW软件。 2、进去之后点新建创建一个HTML的文档。 3、在桌面先创建一个文件夹&#xff0c;方便放文档之类的。 4、进去之后鼠标右键点右上角的Untitled- &#xff0c;再点另存为找到你之前创的那个文件夹&#xff0c;点进去&#xff0c;然后把他存放在这个文…

【CF #782 Div2】 A-D

A. Red Versus Blue 题目 分析 红方蓝方打比赛&#xff0c;确定红方比蓝方厉害&#xff0c;连胜的概率最低&#xff0c;排出比赛结果可能的序列。 因为R比B多&#xff0c;所以考虑在B之间插入R&#xff0c;b个B需要将R分为b1组&#xff0c;需要连胜数最小&#xff0c;就把R…

Dreamweaver css选择器

在 CSS 中&#xff0c;选择器是选取需设置样式的元素的模式。 下面我们介绍几种常用选择器: 元素选择器:通过选择html标签设置css样式 示例&#xff1a;直接选取p标签设置文本颜色 类选择器&#xff1a;通过设置class类设置css样式 注意&#xff1a;class命名不能以数字开头…

dw在html链接css代码怎么写,dw怎么链接css样式?

dw链接外部css样式的方式&#xff1a;在HTML文档中使用<link href"css文件的地址"rel"stylesheet"type"text/css"/>语句链接外部css样式。 Dreamweaver简称DW&#xff0c; 那么&#xff0c;我们想在外部写一个dw的外部样式&#xff0c;可是…

给DW2XLS源代码增加了同时导出多个dw的代码(合并多个dw)

给DW2XLS源代码增加了合并多个dw的代码。现在共享下载 客户定制的&#xff0c;如果后期我有修改的话&#xff0c;我会继续释放出来供下载的。 现在只是简单的合并&#xff0c;如果上下两个dw的栏位宽度不适合。需要自己修改改进。 换言之&#xff0c;适合上下两个dw栏位宽度…

PB导出数据excel格式dw2xls

PB导出数据excel格式dw2xls 使用DW2XLS控件 语法 uf_save_dw_as_excel ( dw, filename ) 参数 dw A reference to the datawindow object filename A string whose value is the name of the file you want to create. If filename is not on the operating systems sea…

FFT算法实现与分析MATLAB

FFT算法实现 厚 2.1实验目的 I、加深对快速傅里叶变换的理解。 II、掌握 FFT 算法及其程序的编写。 III、掌握算法性能评测的方法。 IV、熟悉MatLab编程。 2.2实验原理 一个连续信号Xa(t)的频谱可以用它的傅里叶变换表示为&#xff1a; 如果对该信号进行理想采样&#x…

采用FPGA实现FFT算法

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材 随着数字技术的快速发展&#xff0c;数字信号处理已深入到各个学科领域。在数字信号处理中&#xff0c;许多算法如相关、滤波、谱估计、卷积等都可通过转化为离散傅立叶变换(DFT)实现&#xff0c;从而为…

[笔记]FFT算法

前言 对于学通信的人来说&#xff0c;在学到数字信号处理时都会学到一个东东&#xff0c;叫做快速傅里叶变换(Fast Fourier Transform,简称FFT)。这东西真的挺有用的&#xff0c;但是只要有那么一点用的东西&#xff0c;就是特别难的。(现在也有很多不完整的地方&#xff0c;以…

c语言实现fft原理,新手小白一看就会,FFT算法的原理详解

原标题:新手小白一看就会,FFT算法的原理详解 相信网上现在有很多关于FFT的教程,我曾经也参阅了很多网上的教程,感觉都不怎么通俗易懂。在基本上的研究FFT,并且通过编程的形式实现之后。我决定写一篇通俗易懂的关于FFT的讲解。因此我在接下来的叙述中尽量非常通俗细致的讲解…

FFT算法实现,python,Java

FFT算法实践报告 FFT基本原理 代码链接: link. DFT 在讨论FFT之前&#xff0c;我们需要先了解以下DFT。所谓的DFT其实就是两个矩阵做点乘。 多项式可以有两种表示方法&#xff0c;一种是系数表示法&#xff0c;另一种是点值表示法。 这两种表示法之间是可以转换的&#xff…

MATLAB FFT算法的应用

目录 一&#xff0c;实验原理 二&#xff0c;实验内容 1、实现2N点实数序列 2、已知某序列​编辑在单位圆上的N64等分样点的Z变换为&#xff1a; 3、周期为N的余弦序列&#xff1a; 1&#xff0c;求该序列N点FFT 2&#xff0c;求该序列2N点FFT 3&#xff0c;求该序列N/2点…

FFT算法实现

关于FFT算法的原理这里就不多说了&#xff0c;具体参考有关书籍。 DFT与FFT运算量的比较 N点DFT的运算量 复数乘法 复数加法 一个X(k) N N-1 N个X(k)&#xff08;N点DFT&#xff09; N*N N(N-1) N点FFT的运算量 复数乘法 复数加法 N个X(k) (N/2)*log2N N*log2N 如…

使用python手写FFT算法

FFT(Fast Fourier Transform) 是 DFT(Discrete Fourier Transform)的快读实现&#xff0c;它在机理上没有改变DFT的算法&#xff0c;只是在实现上采用的巧妙的实现。 使 O ( N 2 ) O(N^2) O(N2)的实现变成了 O ( N l o g 2 N ) O(Nlog_2N) O(Nlog2​N)的实现&#xff0c;优化算…

C语言实现FFT算法

C语言实现FFT算法 fft1d.c和fft1d.h见https://download.csdn.net/download/weixin_43216875/12009644 1 fft1d.h #ifndef FFT1D_H #define FFT1D_H#include "math.h"#define PI 3.1415926535897932384626433832795028841971typedef struct complex //复数类型 {flo…

Matlab实现DITFFT算法

这段时间刚好在学习数字信号处理的快速傅立叶变换&#xff0c;也刚好应着老师布置的作业用matlab实现N点的FFT。 方法也是采用教科书上的DITFFT&#xff0c;当然关键也就是分治的思想&#xff0c;分成奇偶序列&#xff0c;再观察旋转因子和步长的不同来编写算法 该算法首先的部…