DWR对象作用范围

来源:互联网 发布:java审批流 编辑:程序博客网 时间:2024/05/16 06:28
  • DWR系列
DWR脚本AjaxJavaScriptWeb 
DWR对象作用范围
在应用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一般都会采用类的全路径。



原创粉丝点击