使用WorkShop页面流来保存用户数据

来源:百度文库 编辑:神马文学网 时间:2024/04/30 15:36:25
文章摘要:传统的JSP编程中用户数据的存放一般都放在与用户交互的session对象中,session对象的管理是通过编程者来进行手工控制,或者是通过session的失效来进行数据的清除。本文介绍了Workshop页面流给予开发人员管理用户数据对象的方法,用户无需进行手工管理,页面流会对你的数据进行自动管理。
一.页面流介绍
WorkShop页面流(Page Flow)是架构在struts基础上的,对action和controller的一层封装,页面流将表单验证和表单数据,以及action处理集中到一个jpf(Java Page Flow)文件中,可以很方便的进行维护和使用,同时pageflow对页面之间的跳转等页面逻辑也是一种图形化的开发,页面之间关系一目了然,也省去了我们手工编辑struts-config.xml文件带来的错误和麻烦.页面流中的错误提示功能能很大程度的方便开发者对错误页面进行修改,避免了部署到服务器才发现错误的周折. 页面流还提供许多向导以自动执行常见任务和图形化显示标记库。
二.页面流管理数据
页面流有个显著的特性就是:当用户在页面流的作用域内导航时,为每个用户会话保留一个处于活动状态的页面流控制类的实例。当用户退出页面流时,此实例结束。可以使用页面流类中的实例成员变量保存用户会话状态。
借助页面流这个显著的特性,我们可以最大程度的实现我们的显示逻辑而又不增加对server的负担.。
对于比较复杂的系统,往往一些地方需要使用session来保存数据,作为数据的载体.而放在session中的这些东西如果没有使用完及时清除,那么一但我们过分依赖于这种方式,session中的数据将会是很多,而session中保存大量的数据会减慢jsp的执行速度和增加服务器的负担。虽然用户的session会随着用户退出系统或者session的timeout来进行处理, 但是这种情况也会增加垃圾收集时间的消耗和服务器的负担,而且这种处理也不具有即使性。
而页面流能够较大程度上分解这种大量数据的保存.对于一个系统我们可以分成多个页面流来进行处理.每个页面流负责他所控制页面的变量生命周期.子系统内通过页面流来作为数据传递的载体.而一旦用户退出这个页面流,那么当前页面流也会被立即清除掉,而不会给系统带来很大的负担。
例如我们要在页面间共享自定义的地址对象Addr(不考虑reqest对象传值的情况)
传统的方式把Addr放在session中,对象生命周期和session一样,除非你显示的remove掉
session.setAttribute("Addr",Addr);
页面流的方式把Addr放在页面流中,该对象生命周期和这个页面流一样.
public class TestController extends PageFlowController
{
Addr addr;
public void setAddr(Addr addr){
this.addr = addr;
}
public Addr getAddr(){
return this.addr;
}
............
............
}
从上面我们可以看出,对于第一种方式我们在调用时需要从session中取值, 而页面流在Action(当前页面流的Action)中调用时,直接使用addr就可以了.对于属于该页面流管辖的jsp中调用Addr变量也非常简单.如下
TestController testCtrl =(TestController)PageFlowUtils.getCurrentPageFlow(request) //request对象为jsp内置的request对象.
Addr addr = testCtrl.getAddr(); //也可以进行set操作.
有了页面流我们在页面共享变量的存放上也不用太担心了,页面流会管理我们对象的生命周期.页面流中的对象也不需要像session中显式的删除掉了.
页面流的销毁是通过用户退出当前页面流的操作时而销毁的.比如当用户由一个页面流直接转向另一个页面流或是转向不属于本页面流管辖的页面,但这种情况并不包含嵌套页面流的情况,因为嵌套页面流在调用前会将当前页面流压栈,当嵌套页面流调用完毕后,当前页面流再出栈进行操作。
我们可以把页面流看作是一个函数,而其中的局部变量就是我们页面中要进行局部共享的对象。
三.页面流中全局变量的管理
页面流中全局变量的管理是放在Global.app(位于WEB-INF/src/global下)对象中进行的。该对象控制页面流间的跳转,处理页面流中没有定义的Action或者异常,这里也就是我们处理全局方法(如error,exception)的一个地方。只要任何一个页面流被创建前就会产生这个全局的对象并存放在session中,除了显示的删除该对象外,该对象一直存在,直到session无效。
对这个全局变量的访问也和页面流中一样.例如我们要存储和读取一个登陆后的用户对象User.
public class Global extends GlobalApp{
User user;
public void setUser(User user){
this.user = user;
}
public user getUser(){
return this.user;
}
............
............
}
那么我们在登陆后调用这个全局变量进行用户对象的存储.
jsp中调用如下:
User usr = new User(.......);
Global global =(Global)PageFlowUtils.getGlobalApp(request);
global.setUser(user);
页面流中的调用和jsp中的有所不同.默认在页面流类中会看到下面的声明
// Uncomment this declaration to access Global.app.
//
// protected global.Global globalApp;
//
默认是将该全局对象声明注释掉,如果我们在页面流对象中要使用全局变量,反注释掉声明就可以使用了,此全局对象是在页面流创建时初始化的.我们要调用全局变量如下就行了.
globalApp.getUser();
在页面流中我们可以也可以访问request,response,session等对象,页面流提供getRequest(),getResponse(),getSession()方法访问这些对象。值的注意的是利用TestBrowser进行调试时,如果有弹出式窗口,弹出的将是IE的一个窗口,session等对象的值不会传给该弹出式窗口,这是TestBrowser的一个Bug,在IE中运行是没有问题的,所以在调试弹出式窗口时一定要注意。
四.文章总结
以上对workshop的页面流的生命周期以及使用方法进行了大体的介绍.在具体使用页面流时,可以充分利用页面流的优点,使用页面流对用户数据进行管理,减轻session负担,使我们的程序更加健壮,更易维护。