Org.directwebremoting 包结构 (转)

本文深入解析了DirectWebRemoting的包结构,包括AjaxFilter、Container、Hub等关键组件的功能与作用,以及如何通过auth.js进行身份验证,详细阐述了DirectWebRemoting在实现AJAX交互方面的优势。
Org.directwebremoting 包结构 

 

AjaxFilter.java

两种类型接口
 1,认证,日志,安全   2,延迟
 org.directwebremoting.filter.ExtraLatencyAjaxFilter  一般和AjaxFilterChain合作

 Container  容器

 Hub

集线器,提供多个ajax互相操作接口,使得一个界面中多个ajax可以互相调用,参考openajax联盟制定的规则,dwr已

经是联盟的会员之一

org.directwebremoting.export包会用到,具体细节不清楚

 ScriptBuffer   采用list储存script,功能类似于StringBuffer                           

 ServerContext  服务器端上下文

 WebContext  浏览器上下文,好像是每个客户一个(红色表示没仔细看)                         

  auth.js 

                                   AuthHandler负责读取这个js文件
                                 细节由CachingFileHandler读取
                                 readResource()将字节符转换为字符串
                                 继承JavaScriptHandler接口,专门处理读取js文件

 

                                JavaScriptHandler extends TemplateHandler implements

CachingFileHandler implements Handler

     CachingFileHandler
                                    读取数据文件,根据req的报头属性判断,如果修改过,那么重新下载,否则不      

用下载读取资源文件,由不同的handle处理,这些handle都继承于JavaScriptHandler如:AuthHandler extends JavaScriptHandler

实际上客户端会将js文件下载到缓存区,这种机制可以使得浏览的时候检查是否js文件内容发生变化。从而重新下载

  dwr20.dtd   org.directwebremoting.impl.DTDEntityResolve处理

 dwr20.xsd 实际上没用到
                                             两种xml框架类型文件,可以被parse识别

 engine.js   引擎js,在浏览器缓存中会发现这个文件已经下载到本地。EngineHandler处理

  messages.properties  语言资源文件
由org.directwebremoting.util.Messages读取

     private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("org.directwebremoting.messages");

按照你的方法配置后报错SEVERE: Servlet threw load() exception java.io.IOException: Missing config file: '/WEB-INF/dwr.xml' at org.directwebremoting.impl.DwrXmlConfigurator.setServletResourceName(DwrXmlConfigurator.java:78) at org.directwebremoting.impl.StartupUtil.configureFromDefaultDwrXml(StartupUtil.java:616) at org.directwebremoting.impl.StartupUtil.configureContainerFully(StartupUtil.java:730) at org.directwebremoting.servlet.DwrServlet.configureContainer(DwrServlet.java:113) at org.directwebremoting.servlet.DwrServlet.init(DwrServlet.java:72) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4149) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4458) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:987) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:909) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:495) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:722) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:583) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
最新发布
11-12
[root@yfw ~]# cd /opt/openfire [root@yfw openfire]# # 回到临时目录 [root@yfw openfire]# cd /tmp [root@yfw tmp]# [root@yfw tmp]# # 下载官方构建版本(示例,需替换为真实 URL) [root@yfw tmp]# wget https://github.com/romanrue/openfire-rest-api-plugin/releases/latest/download/restapi.jar --2025-10-02 22:37:34-- https://github.com/romanrue/openfire-rest-api-plugin/releases/latest/download/restapi.jar Resolving github.com (github.com)... 20.205.243.166 Connecting to github.com (github.com)|20.205.243.166|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-10-02 22:37:35 ERROR 404: Not Found. [root@yfw tmp]# [root@yfw tmp]# # 或者如果你有本地构建的 jar [root@yfw tmp]# cp /path/to/your/restAPI-1.11.0-SNAPSHOT.jar restapi.jar cp: cannot stat '/path/to/your/restAPI-1.11.0-SNAPSHOT.jar': No such file or directory [root@yfw tmp]# [root@yfw tmp]# # 部署到 Openfire [root@yfw tmp]# cp restapi.jar /opt/openfire/plugins/restapi.jar cp: cannot stat 'restapi.jar': No such file or directory [root@yfw tmp]# chown openfire:openfire /opt/openfire/plugins/restapi.jar chown: cannot access '/opt/openfire/plugins/restapi.jar': No such file or directory [root@yfw tmp]# chmod 644 /opt/openfire/plugins/restapi.jar chmod: cannot access '/opt/openfire/plugins/restapi.jar': No such file or directory [root@yfw tmp]# systemctl start openfire [root@yfw tmp]# [root@yfw ~]# cd /opt/openfire [root@yfw openfire]# tail -f /opt/openfire/logs/openfire.log 2025.10.02 22:38:40.509 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[component-directTLS] - Started. 2025.10.02 22:38:40.514 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[connection_manager] - Started. 2025.10.02 22:38:40.518 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[connection_manager-directTLS] - Started. 2025.10.02 22:38:40.522 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.EncryptionArtifactFactory - Creating new SslContextFactory instance 2025.10.02 22:38:40.529 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.http.HttpSessionManager - Starting instance 2025.10.02 22:38:40.648 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.http.HttpBindManager - HTTP bind service started 2025.10.02 22:38:41.808 INFO [socket_c2s-thread-2]: org.jivesoftware.util.cache.CacheFactory - Created cache [org.jivesoftware.util.cache.DefaultLocalCacheStrategy] for Locked Out Accounts 2025.10.02 22:38:42.085 INFO [socket_c2s-thread-2]: org.jivesoftware.util.cache.CacheFactory - Created cache [org.jivesoftware.util.cache.DefaultLocalCacheStrategy] for Sequences 2025.10.02 22:39:23.036 INFO [Jetty-QTP-AdminConsole-29]: org.directwebremoting.log.startup - Starting: DwrServlet v3.0.3-dev on jetty/10.0.18 / JDK 11.0.13 from Red Hat, Inc. at 2025.10.02 22:39:23.078 INFO [Jetty-QTP-AdminConsole-29]: org.directwebremoting.log.startup - Starting: Using container abstraction org.directwebremoting.server.servlet3.Servlet30ContainerAbstraction
10-03
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name></display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:applicationContext*.xml classpath*:*Context.xml </param-value> </context-param> <context-param> <param-name>webAppRootKey</param-name> <param-value>rms.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>com.hg.filter.UrlAuthListen</listener-class> </listener> <listener> <listener-class>com.hg.filter.WebConfigListener</listener-class> </listener> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter </filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>XssFilter</filter-name> <filter-class>com.hg.aop.XssFilter</filter-class> </filter> <filter-mapping> <filter-name>XssFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- dwr 配置 --> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <description>How quickly do scriptSessions timeout?</description> <param-name>scriptSessionTimeout</param-name> <param-value>1800000</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <listener> <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class> </listener> <!-- dwr 配置 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>具体解释一下web.xml的配置
07-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值