ajax框架 问题

ajax框架 问题,第1张

Ajax是时下比较流行的一种web界面设计新思路,其核心思想是从浏览器获取XMLHttp对象与服务器端进行交互. DWR(Direct Web Remoting)就是实现了这种Ajax技察友术的一种web框架. 最近做的项目中我也将它用上了,感觉很是方便,比如动态生成javascript代码,隐藏的http协议,java代码和javascript交互的是javascript的对象(或字符串). 下面是我整理的文档.

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配置快速简便导入


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12295879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存