在应用dwr的时候需要创建一个业务对象,也就是远程的业务对象。通过前台的客户端也就是js脚本,去访问这个后台的对象,这个后台对象必然有一个作用范围,为什么这么说?因为我们在开发web项目的时候,http协议是无状态的,对于无状态的协议,我们如果想保存状态的信息,怎么办?这是一个比较重要的问题。也就是说我们只有保存了这种状态,我们才可以弥补http这种无状态协议的弊端,才能保证我们web开发的进行,否则我们我们的web开发是完全没有意义的而且不可能进行下去的。所以在jsp当中,也就是web规范中给我们提供的一种可以保存信息的东西。j2ee中有request、session、application.在jsp当中,内置对象给我们提供还有page.等等这些内置的对象都给我们提供了保存对象状态的一些方法就是setAttribute(),通过getAttribute()来取得我们所保存的对象。这样就可以保存用户所操作的信息。我们可以这些信息识别用户。在web中就实现了用户识别的作用。dwr也给我们提供了对象的作用范围,通过这些范围我们也就可以确定前台调用后台的时候,在什么范围下我要去创建这个对象。这什么范围内我根本不需要去创建这个对象。而是用原来给我们提供好的,而这些东西它是如何实现的?实际上,dwr中也是把这些信息保存在了request、session、application里面。保存后,我们每调用一次就会到我们保存的对象当中去找,如果存在,就不用创建,不存在我们再创建。这些原理都是一样的。我们所学的技术呢,万变不离其中,不管以后会出什么框架,基本的原理是不变的。所以打好基本功还是很重要的。
演示dwr的作用范围:
首先在dwr.xml中位置当前这个业务对象的作用范围,这里通过scope属性来指定。默认的dwr给我们提供的是page范围。scope="page",也就是当前页面,我们就以当前页面为基准,来演示。
<create creator="new" javascript="UserLogic" scope="page">
如果要确定当前这个对象在什么范围,怎么来调试它?我们就只用通过构造方法,因为创建一个对象必然会通过它的构造方法来创建,或者通过反射机制,但是dwr中是通过默认构造方法来为我们创建这个对象。
业务逻辑里的构造方法:
public UserLogic(){
System.out.println("对象UserLogic创建成功");
}
业务逻辑方法
public void testScope(){
System.out.println("对象UserLogic的scope范围测试");
}
这样我们就每请求一个对象的时候,看看它是否会打印出对象UserLogic创建成功,也就是表明我们对象是否创建了。
index.jsp里面的业务方法:
function showscope(){
UserLogic.testScope();
}
执行结果:console上打印对象UserLogic创建成功。我们对象请求的时候会打印,但是这个对象是这对当前页面的。它的作用范围是当前页面。在执行一遍,他还是会打印,说明当前这个页面每请求一次,它就会创建一次。这也是为什么dwr给我们提供的默认的范围是page,它应该是这个范围是最小的,我每请求一次它就创建一次,然后这个对象就消亡。再请求一次在创建一次再消亡。它并不会去保存它的状态,所以我们每次请求它都会去创建一个新的UserLogic,dwr给我们提供默认的范围就是这个page.如果不配置scope,默认的就是page,我们来执行看看,它也是打印,每创建一次打印一次。所以page可以理解为最小的作用范围。它是指当前页面,创建一次就把它销毁。确切的说不能是销毁,应该是它不会保存在任何对象中。这样我们取的时候不会取到它,所以会在创建一个。
看一下request范围,scope="request"对于请求来说,我每次请求,对于dwr来说,它是封装了 ajax,也就是通过xmlHttpRequest对象来发出的异步请求。所以每请求一次就相当与发送一次异部请求。我们执行一下,它会打印。说明对于这个request范围,我们每请求一次,它就会创建一次。也就是我们每次都是请求一个request对象,请求一个request对象的时候呢,我们知道dwr封装了ajax,ajax会通过xmlHttpRequest对象来去发出这个请求。所以通过request方式和page方式应该是没有什么区别。都是采用请求一次创建一次请求一次创建一次。好这就是所谓的request.
下面看一下session
<create creator="new" javascript="UserLogic" scope="session">
执行第一次的时候,它创建了,执行第二次的时候,它并没有创建。说明两次请求是同一个session.用户在这一界面,在以后的请求中,它会给当前用户分配一个 session,而对于这个session来讲,只要这个用户不关闭浏览器,它的session是唯一的。我再请求的话,它还是在同一个session作用范围内。所以它仅仅会创建一次对象。而其他只要在同一个session中,它就会为我们提供UserLogic对象而不用我们去创建。这就是session为我们提供的作用范围。request和session的作用范围很好理解,下面我们看一下dwr为我们提供的script作用范围。
script是脚本的意思,script作用范围是针对当前页面的,当前页面的脚本,在这个范围内就是同一个对象,而不是在创建一个对象。
配置dwr.xml位置文件为script作用范围,
<create creator="new" javascript="UserLogic" scope="script">
执行第一次对象会被创建,在执行一次,对象没有被创建,对象仅仅被创建了一次。所以script作用范围相对来讲比page作用范围大一些。它的意思就是说我调用这个UserLogic,它如果在同一个脚本范围内的话,我不会去创建它。同一个页面应该调用的是同一个脚本,同一个脚本范围内,我如果去调用它的方法的时候,这个对象如果存在的话,我并不会去创建这个对象。也就是说我这个范围是存在脚本范围内,而且dwr中也给我们提供了一个script的会话,即scriptSession对象,这个对象就相当与我们的session,只不过session是相对与服务器端来说的,而scriptSession是相对与客户端来说的。所以script的作用范围能相对的比page大一些。对于page呢创建一次销毁一次创建一次销毁一次,并不会保存它的状态。而对于script范围,对于同一页面呢,它会保存其状态。这就是区别。
看一下application作用范围,
<create creator="new" javascript="UserLogic" scope="application">
第一次执行会被创建,第二次不会被创建。重启一个会话也不会被创建。现在把UserLogic保存在application对象中了。application是针对当前web同一个应用。只用服务器不重新启动,同一服务器下我们就会获得唯一的一个UserLogic,而不会出现第二个。
怎样获取它们保存在作用范围内保存的作用信息?
dwr给我们提供了一个可以获取web上下文这么一个对象,
业务逻辑:
public void testScopt(){
WebContext context = WebContextFactory.get();
HttpServletRequest request = context.getHttpServletRequest();
HttpSession session = context.getSession();
ServletContext sc = context.getServletContext();
ScriptSession ss = contxt.getScriptSession();
System.out.println("测试request************************");
Enumeration e = request.getAttributeNames();
while(e.hasMoreElements){
System.out.println(e.nextElement());
}
System.out.println("测试session************************");
Enumeration se = session.getAttributeNames();
while(se.hasMoreElements){
System.out.println(se.nextElement());
}
System.out.println("测试application************************");
Enumeration app = application.getAttributeNames();
while(app.hasMoreElements){
System.out.println(app.nextElement());
}
System.out.println("测试scriptSession************************");
Iterator ss = app.getAttributeNames();
while(ss.hasNext){
System.out.println(s.next());
}
}
首先测试application,打印出HttpServlet、jsp_classpath、tempdir、Container、ContainerList、ServletConfig、ServletContext、resources、UserLogic等等这些信息。也就是servlet容器在加载的时候,会把这些信息全部加载我们所对应的application范围内。也就是这个应用会去用的东西。这里把UserLgoic这个对象也加载到application范围内。以后引用呢,通过application去寻找,如果存在了就不会去创建。这点一定要引起重视,对于一个框架来讲。框架里面的信息是怎么样存储的?应该是在框架启动的时候就把这些信息存储在application这里面去。
测试scriptSession。打印出UserLogic。可以找到我们测试里面打印的有一个UserLogic
测试Session。打印出UserLogic。可以看出会为我们取出打印出key值,也就是我们把变量保存在了session里面,而其他范围中根本就不会存在UserLogic。通过这样我们可以了解到,dwr在根据dwr.xml配置文件中找到scope对应的范围,根据这个范围找到它对应的对象。然后把我们请求的UserLogic会放置在对应的对象里。对象对应的key采用javascript对应的UserLogic,因为javascript对应的UserLogic是唯一的。要注意我们把变量把一些状态信息保存在5个作用范围中,那个key必须是唯一的。而这个key的唯一我们往往采用类的全路径。因为类的全路径就相当于它是唯一的。这里为什么不采用类的全路径,而采用javascript对应的UserLogic。因为前台调用的时候,对应javascript来讲,它也是唯一的。只要我们能找出唯一想,取得的时候就能够取得。但是在一般的项目开发中,key一般都会采用类的全路径。
分享到:
相关推荐
- `dwr.xml` 文件是DWR的核心配置文件,用于定义哪些Java对象和方法可以被JavaScript访问。 - `<allow>` 标签定义了可以暴露给JavaScript的权限范围。 - `<create>` 标签创建一个JavaScript对象,该对象可以调用...
3. **错误处理**:DWR调用的服务器端方法如果抛出异常,可以捕获并将异常信息返回给客户端,此时可以利用DWR的错误处理机制,而不是依赖JSP的`exception`内置对象。 4. **页面更新**:DWR可以更新客户端的HTML元素...
Direct Web Remoting (DWR) 是一个开源的Java库,它允许...通过以上知识点,我们可以看到Dwr在构建动态、交互性强的Web应用中发挥着重要作用。掌握Dwr的这些功能和机制,对于提升Web开发效率和用户体验具有积极意义。
2. **自动JSON和XML转换**:DWR能够自动将Java对象转化为JavaScript对象,以及反向操作,这在处理数据交换时提供了极大的便利。 3. **安全控制**:DWR提供了安全机制,如CSRF(Cross-site Request Forgery)防护,...
8. **跨域支持**:DWR可以通过CORS(跨源资源共享)配置,实现跨域通信,扩大了Web应用的可用范围。 9. **国际化**:DWR支持多语言环境,方便开发国际化应用。 在实际项目中,DWR通常与Spring、Hibernate等其他...
- `initApplicationScopeCreatorsAtStartup`:启动时是否初始化应用范围创建者,默认为`true`。 - `maxWaitAfterWrite`:最大等待时间(毫秒),默认为`3000`。 - `debug`:调试模式,默认为`true`。 - `logLevel`:...
通过这个文件,你可以控制安全性,限制远程调用的范围,还可以配置其他高级特性,如CORS设置、转换器、安全策略等。 为了使用这些文件,你需要将它们部署到你的Web应用服务器中,通常将jar包放入WEB-INF/lib目录,...
4. **跨域支持**:放宽了同源策略限制,允许跨域调用,扩大了DWR的应用范围。 5. **模块化**:3.0版本将DWR拆分为多个模块,用户可以根据需要选择加载,减少了不必要的资源消耗。 6. **JSON支持**:增强了对JSON格式...
- 改进了跨域支持,使得DWR可以在不同域名之间安全地工作,扩大了应用范围。 - 可能加入了对AJAX库的兼容性增强,如jQuery和其他流行的前端框架。 - RC2(Release Candidate 2)意味着这是3.0正式版发布前的最后...
// 实现数据库查询,返回指定范围内的数据 } } ``` 这里的`start`是开始位置,`limit`是每页显示的记录数。 #### 2.3 JavaScript调用 在客户端,通过DWR的API调用服务端的分页方法,将当前页数和每页大小作为...
Direct Web Remoting (DWR) 是一个简化 Ajax 应用开发的框架,它允许开发者通过简单的 JavaScript 调用来访问服务器端 Java 对象。DWR 3.0 在原有基础上进行了大量的改进和完善,提供了更稳定、更高效的服务。 ####...
【DWR的作用】 DWR通过提供一套JavaScript库,使得开发人员能够轻松地从HTML页面直接调用服务器端的Java对象方法。它处理了参数类型转换和保持HTML代码可读性的问题,减轻了开发者的工作负担。DWR不强求特定的设计...
9. **跨域支持**:DWR通过CORS(Cross-Origin Resource Sharing)策略,使得JavaScript可以从不同的源(域名)访问资源,扩展了Web应用的交互范围。 10. **错误处理**:DWR提供了统一的错误处理机制,当服务器端...
### DWR文件上传功能及其配置解析 DWR(Direct Web Remoting)是一种简化Ajax应用程序开发的技术,它使得从...对于文件上传等高级功能,虽然不在`dwr.xml`直接配置范围内,但也需通过恰当的服务器端编程来实现。
5. **易于集成**:DWR可以轻松地与现有的MVC框架,如Spring、Struts等进行集成,扩展了其应用范围。 6. **易于调试**:DWR提供了一套内置的调试工具,帮助开发者在开发过程中快速定位问题。 在"DWR-2.0.2-src.zip...
DWR的核心在于XML配置文件,即`dwr.xml`,它是DWR与应用服务器交互的桥梁,定义了哪些Java对象可以被JavaScript访问,以及如何处理这些调用。对于学习Ajax的用户来说,理解并掌握`dwr.xml`的配置至关重要,因为它...
通过`dwr.xml`,你可以设置安全性限制,比如允许的IP范围、会话超时和白名单等。同时,你还可以配置转换器和适配器,以处理不同类型的Java对象和JavaScript数据类型之间的转换。 在**标签**中,我们看到"**dwr dwr....
DWR(Direct Web Remoting)是一种基于Java的远程方法调用技术,允许开发者将Java对象 Publishing 到Web页面上,提供了一个灵活的方式来实现客户端和服务器端的交互。在DWR配置中, dwr.xml 文件扮演着核心角色,它...
DWR的主要目标是简化JavaScript和Java之间的通信,使得开发者能够像操作本地对象一样操作远程服务器端的方法,极大地提升了Web应用的交互性和用户体验。 ### 1. DWR的基本概念 - **AJAX(Asynchronous JavaScript ...