DWR主要由两部门组成。javascript与web服务器通信并更新web页;运行在web服务器的Servlet处理请求并把响应发回浏览器。
1 . 配置web.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>银宏
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2当我们想看dwr自动生成的测试页时,可在java代码
servlet中加
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
这个参数DWR默认是false.如果选择true.我们可以通过url http://localhost:port/app/dwr ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false.
3 log信息配置
我喜欢用log4j输出日志,那么在log4j.properties下加,log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。
4 配置dwr.xml (和web.xml同目录)
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
这里的多数元素都是可选的 - 你真正必须知道锋没册的是指定一个creator和一个javascript名字。
creator属性 是必须的 - 它用来指定使用那种创造器。
默认情况下DWR1.1有8种创造器。它们是:
new: 用Java的new关键字创造对象。
none: 它不创建对象,看下面的原因。 (v1.1+)
scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
spring: 通过Spring框架访问Bean。
jsf: 使用JSF的Bean。 (v1.1+)
struts: 使用Struts的FormBean。 (v1.1+)
pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)
javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。
scope属性 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。
scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。
param元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。
include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。
5 dwr.jar下载后放lib下
源码浅析
dwr的设计很象webwork2的设计,隐藏http协议,扩展性,兼容性及强。
通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作的。
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
这样/dwr/*下的所有的请求都是由这个servlet来处理,到底生理了什么呢,我们还是以例子来说明吧.
1 web服务器启动,DWRServlet init()方法调用,init主要做了以下工作。
设置日志级别、实例化DWR用到的单例类(这些类在jvm中只有一个实例对象)、读去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2 请求处理
DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。
代码
public void handle(HttpServletRequest req, HttpServletResponse resp)
throws IOException
{
String pathinfo = req.getPathInfo()
if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))
{
resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html")
} else
if(pathinfo != null &&pathinfo.equalsIgnoreCase("/index.html"))
{
doIndex(req, resp)
} else
if(pathinfo != null &&pathinfo.startsWith("/test/"))
{
doTest(req, resp)
} else
if(pathinfo != null &&pathinfo.equalsIgnoreCase("/engine.js"))
{
doFile(resp, "engine.js", "text/javascript")
} else
if(pathinfo != null &&pathinfo.equalsIgnoreCase("/util.js"))
{
doFile(resp, "util.js", "text/javascript")
} else
if(pathinfo != null &&pathinfo.equalsIgnoreCase("/deprecated.js"))
{
doFile(resp, "deprecated.js", "text/javascript")
} else
if(pathinfo != null &&pathinfo.startsWith("/interface/"))
{
doInterface(req, resp)
} else
if(pathinfo != null &&pathinfo.startsWith("/exec"))
{
doExec(req, resp)
} else
{
log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/")
resp.sendError(404)
}
}
dwr/*处理的请求也就这几种。
(1)dwr/index.html,dwr/test/这种只能在debug模式下使用,调试用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js当这个请求到达,从dwr.jar包中读取文件流,响应回去。(重复请求有缓存)
(2)当dwr/interface/这种请求到来,(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>)DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date转化为javascript函数。
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
细节也比较简单,通过java反射,把方法都写成javascript特定的方法。(我觉得这些转换可以放到缓存里,下次调用没必要再生成一遍,不知道作者为什么没这样做)。
(3)dwr/exec
javascript调用方法时发送这种请求,可能是XMLHttpRequest或IFrame发送。
当然,javascript调用的方法签名与java代码一致,包括参数,还有javascript的回调方法也传到了服务器端,在服务器端很容易实现。回调方法的java的执行结果 返回类似 <script>callMethod(结果)<script>的javascript字符串,在浏览器执行。哈,一切就这么简单,巧妙。
这个多了去了 ,apache 绝对是 开源里面的领头羊for example:
分类 项目名 说明 开发语言
服务器
(共20) Apache HTTP Server 全球第一HTTP服务器 C/C++
Tomcat Java的Web服务器 Java
James 邮件服务器 Java
SpamAssassin 反垃圾邮件 C/C++
Perl Apache的Perl编程语言支持 C/C++
Tcl TCL脚本语言 C/C++
Directory Server 超级目录服务器 Java
Axis WebServic服务器 Java
Kandula Axis中WS-Coordination、WS-AtomicTransaction、WS-BusinessActivity协议的实现 Java
Muse Axis中WS-ResourceFramework (WSRF), WS-BaseNotification (WSN), and WS-DistributedManagement (WSDM) 标准的实现(该项目Logo是个不认识的古汉字) Java
Pubscribe Web Services Notification (WSN) 标准实现 Java
Sandesha WS-ReliableMessaging 标准实现 Java
WSS4J WS-Security 标准实现 Java
WSRF Web Services Resource Framework 标准实现 Java
Addressing WebService的WS-Addressing标准(IBM、磨拍销微软、BEA发布)实现 Java
XML Security XML签名与加密瞎游标准的Java、C++实现 Java/C++
jUDDI UDDI的Java实现 Java
XML-RPC XML-RPC实现 Java
Derby 纯Java做的关系数据库 Java
Xindice XML数据库 Java
开发工具(共5) Ant 自动编译 Java
Maven 项目管理工具,比Ant强大,支持插件开发 Java
Gump 每日集成工具,支持Ant、Maven Python
JMeter Web应用性能测试 Java
DdlUtils 用XML来定义DDL Java
Web开发框架(共19) Struts MVC的Web开发框架 Java
Cocoon Web开发框架,基于可运行的XML管道语言 Java
FOP XSL-FO 打印与输出解决方案,基于Java Java
AxKit 基于XML的Web发布 Java
Tapestry Web开发框架 Java
Turbine Web开发框架 Java
Shale 基于JSF的Web开发框架 Java
MyFaces 第一贺姿个开源的JSF实现 Java
Beehive 基于Structs的J2EE框架,简化J2EE编程;含Web界面、WebService开发框架 Java
Velocity 模板引擎 Java
Portals 门户解决方案 Java
Cactus Web开发测试框架 Java
Forrest 基于Cocoon的Web发布解决方案 Java
Slide 内容管理,支持WebDAV Java
Jackrabbit 内容库,用于内容管理 Java
Lenya 内容管理,支持版本管理、工作流、所见所得编辑器 Java
Xang 基于JavaScript进行动态Web开发 Java
Xindice 纯XML数据库 Java
JCS 分布式Cache系统(Java Caching System) Java
容器(共7) Geronimo J2EE容器,类似JBoss Java
iBATIS 简单OR映射,有.NET版本 Java/C#
Torque OR映射 Java
ORB ObjectRelationalBridge,OR映射 Java
JDO JDO标准的一个实现 Java
HiveMind 类似Spring的东西,微内核DI容器 Java
Excalibur IoC容器 Java
组件(共82) APR 不同 *** 作系统间可移植运行时库 C/C++
Regexp Java正则表达式 Java
ORO Perl风格的正则表达式 Java
Xerces XML解析,Java/C两种版本 Java/C++
Crimson XML解析器 Java
AXIOM 更高效的DOM实现 Java
Lucene 全文检索,有.NET版本 Java/C#
Logging 不仅Log4j,各个语言的版本都有了 Java/C++/Perl/C#
XMLBeans XML转对象 Java
JaxMe Java/XML绑定的实现 Java
Taglibs JSP Tag库 Java
HttpComponents HTTP访问控件 Java
ECS 辅助生成标签(Element Construction Set) Java
WSIF WebService调用(Web Services Invocation Framework) Java
SOAP SOAP标准实现 Java
Woden WSDL书写工具 Java
Tuscany 简化SOA开发 Java
MIRAE 让手机支持基于XML的服务 Java
BSF 脚本语言框架(Bean Scripting Framework),支持JavaScript等多种脚本语言 Java
BCEL 用于直接生成字节码(Byte Code Engineering Library) Java
POI 存取Office文档 Java
Batik JAVA的SVG实现 Java
Attributes 访问Java 1.5语言中定义的meta 这些项目都在jakarta commons中,都是Java的
BeanUtils 反射支持
Betwixt XML/JavaBean转换
Chain 职责链模式实现
CLI 命令行参数解析
Codec 通用加密/加密算法
Collections Java容器类完善扩充
Configuration 各种来源配置文件存取
Daemon Java模拟Unix的Daemon
DBCP 数据链连接池
DbUtils JDBC辅助类
Digester XML到Java对象映射工具
Discovery 根据名称来查找资源
EL JSP 2.0 表达式标准实现
Email 发送Email类
FileUpload 文件上传辅助类
HttpClient HTTP客户端
IO IO *** 作辅助类
Jelly 基于XML的脚本引擎
Jexl JSTL 表达式语言扩展
JXPath 用XPath语言来 *** 作对象的辅助类
Lang java.lang.类扩充
Launcher 跨平台Java应用启动器
Logging 不同Log实现的封装
Math 数学、统计辅助类
Modeler 创建兼容JMX标准的MBeans
Net 各种网络协议实现
Pool 对象池
Primitives 很小的Java原始对象类型 *** 作辅助类
SCXML 状态图XML标准实现
Transaction 多层次容器、文件 *** 作事务支持
Validator 用XML定义校验器和校验规则
VFS 虚拟文件系统用于 *** 作FTP、SMB、Zip等
Compress tar、zip、bzip2压缩格式文件 *** 作 这些项目都在jakarta commons中的Sandbox中
CSV CSV文件格式支持
Exec 外部进程执行和环境设置辅助类
Finder 模拟Unix find命令
I18n 国际化辅助类
Id 生成ID辅助类
Javaflow 应用状态管理
JCI Java编译器接口
OpenPGP OpenPGP封装
Pipeline 管道辅助类用于并行或者顺序 *** 作数据
Proxy 动态代码生成辅助类
Cache 对象缓存服务 这些项目都在jakarta commons中的Dormant(睡眠)中
Clazz class *** 作和反射 *** 作
Contract 契约编程用到Java中
Convert Java对象类西转换辅助类
Events 事件管理容器
Feedparser RSS和Atom实现
Functor 用对象方式来 *** 作函数
JJar Jar *** 作
Latka HTTP功能测试
Mapper 简单封装后可以选择不同的对象映射实现
Messenger JMS用于Web开发中的辅助类
Resources 国际化资源信息查找
Scaffold Web应用开发工具
ThreadPool 线程池
Workflow 工作流管理系统框架
XMLIO XML配置快速简便导入
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)