Dorado 5 : 12.4._controllers_ (RF1)

控制器(Controller)是一组具有相关功能的动作(Action)的集合,一般来讲我们可以把一个控制器(Controller)看作相对独立的功能模块。例如:我们可以把产品维护看作是一个控制器(Controller),而把对产品的增加、修改、删除、查询都看作是控制器(Controller)的动作(Action)。
在任何一个控制层单元(Unit)中定义的控制器(Controller)都是全局的,只须通过控制器(Controller)的名称就可以访问到。 每一个控制器(Controller)都拥有一个默认的Action,当用户访问一个控制器(Controller)且没有指定要访问的Action 时系统会自动的激活默认Action,默认Action 的name 是空字符串""。相关属性说明如下:

属性

说明

clazz

指定与<controller>元素对应的控制器类的名字,可以为任何继承于com.bstek.dorado.action.Controller 的控制器类。
特别说明:系统默认提供一种AbstractAccessController类型的控制器类,所有继承于它的控制器类都将默认得到一个login,logout 方法,该类型的控制器类主要用于管理用户登录状态。

description

控制器说明

name

控制器的逻辑名称(必须),需要注意的是,由于controller 的全局性,控制单元<mapping>元素的prefix 属性与name 组合的名称:prefix+name,必须整个系统保持唯一性,否则无法准确定位一个controller

safe

如果利用dorado 的登陆机制做用户管理,这儿决定是否要做用户的登陆状态检查。
特别注意:当clazz 为继承于AbstractAccessController的实现类时,不要设置safe 为true,否则会造成权限处理逻辑错误

scope

设定的controller 对象实例化之后的生存期限,可以设定为
(request, session, application)默认为request

XML 范例代码:

<controller name="access" clazz="sample.mapping.AccessController">
<action>
<forward name="success" path="/login.jsp" />
</action>
<action name="login">
<forward name="success" path="/success.html" />
<forward name="failure" path="/login.jsp" />
</action>
<action name="logout">
<forward name="success" path="access.d" />
</action>
</controller>

图示说明:
选择controllers 节点添加控制器并设置相关属性

图表 86

控制器实现类

一般来说,如果只是简单的实现页面流的转发,我们无需定义控制器实现类,直接利用<controllers>的配置即可实现页面跳转,如果需要做更深层次的业务逻辑处理,我们可以定义控制器实现类,进而对其中各Action 方法默认地跳转进行详细的控制。控制器实现类在Dorado 中都是继承于基类
com.bstek.dorado.action.Controller,主要方法有:

protected void checkAccess(Action action, HttpServletRequest
request, HttpServletResponse response) throws AccessDeniedException

方法说明:用于检测用户登录状态,一般情况下不需要实现该方法,而是由系统提供的CheckAccess类来实现,如果我们需要在当前的Controller中使用特定的监测机制,可以覆盖该方法实现特殊检测机制。

public ActionForward doAction(Action action,
HttpServletRequest request, HttpServletResponse response) throws Throwable

方法说明:系统内置函数,用于处理未在控制器类中实现Action 方法的默认调用。这意味着我们无法为Controller 定义一个名称为"action"的动作(Action).

AccessController

在应用开发中还有一个特殊的控制器类:AbstractAccessController,该类位于com.bstek.dorado.action.impl 包中,它主要用于用户登录状态的管理,一般我们都在用户登录控制器中使用该类型的控制器实现类,在内部做用户登录状态的管理,因为它也继承自com.bstek.dorado.action.Controller,所以它也包含Controller 的两个方法,checkAccess 与doAction,但是在AbstractAccessController的子类中不要重载checkAccess 方法,而是由该类所提供的另外两个方法来维护用户登录状态:

public abstract boolean login(Action action, HttpServletRequest
request, HttpServletResponseresponse) throws Throwable;

方法说明:校验用户登入与设定用户登录状态。

public abstract void logout(Action action, HttpServletRequest
request, HttpServletResponseresponse) throws Throwable;

方法说明:用户登出处理在用户登录控制器的实现类中继承AbstractAccessController,并覆盖login,logout 方法维护用户的登录状态。