一般动作
登录
Wiki: BROPEN ▼: Document Index
»
Space: FAQ ▼: Document Index
»
Page: 使用控制器中的预定义属性与方法
搜索
zh
页面动作
导出 ▼: 以PDF格式导出 以RTF格式导出 以HTML格式导出
更多动作 ▼: 打印预览 察看源码
欢迎进入Wiki » FAQ » 使用控制器中的预定义属性与方法?

# 使用控制器中的预定义属性与方法?

在2014-08-04 16:11上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

在 Grails 中，控制器中会自动编译、或者动态注入一些预定以的属性和方法，常用的如 params、request、response 等，这些属性和方法极大的提升了开发效率。

在 BroFramework 中，我们同样定义了一批开箱即用的属性和API。

目录

- 属性
  - employee
  - osmEmployeeService
  - osmOrganizationService
  - settingService
  - attachmentService
  - processEngineService
- 方法
  - paginateParams( Integer defaultMax = null )
  - nocache
  - isAjax
  - renderAjaxMessage( Map/String message, String jsonp = null )
  - renderExport( Map modelAndView )
  - renderAjaxError( Object bean, String jsonp = null )
  - renderMessage( String message )
  - renderError( String message )
  - renderWarning( String message )
  - renderDenied( String message = null )
  - renderText( String message )
  - updateDynamicTables( Object bean, Map params, Map callbacks = null )
  - updateDynamicTable( Object bean, Class hasManyClass, String hasManyName, String belongsToName, Map params, String paramsPrefix, String requiredField, Map callbacks = null )
  - saveReferences( Object bean )
  - updateAttachments( Object bean )
  - deleteFailedAttachments( Object bean )
  - withInstance( Closure c )

# 属性

## employee

当前请求的员工对象（bropen.framework.core.osm.Employee），进而可以获得对应的用户等。
如果当前请求用户不是员工（如管理员用户 admin），则返回一个包含 name 和 email 属性的、未保存的员工实例，并且 email 属性固定为系统参数中的 bropen.framework.mail.from.email 值。
例如：

class FoobarController {
def test() {
render employee.name
}
}

## osmEmployeeService

员工服务（bropen.framework.core.OsmEmployeeService）对象，包含一些员工查询与操作的API。例如：

class FoobarController {
def test() {
render osmEmployeeService.getCurrentEmployee() == employee
}
}

## osmOrganizationService

机构服务（bropen.framework.core.OsmOrganizationService）对象，包含一些机构查询与操作的API。例如：

def test() {
render osmOrganizationService.getDeptManagers( params.orgCode )
}

## settingService

系统参数管理服务（bropen.framework.core.SettingService）对象，包含存取参数的API。例如：

def test() {
render settingService.get("bropen.framework.plugin.im.rtx.enabled", false)
}

## attachmentService

附件管理服务（bropen.framework.core.AttachmentService）对象，包含存取附件的API，下面的 updateAttachment 等附件方法都是调用本属性中的API实现的。例如：

def test() {
attachmentService.writeResponse(request, response, new FileInputStream("filepath"), "foo.zip", null, null, null)
}

## processEngineService

流程引擎服务（bropen.bpm.ProcessEngineService）对象，包含几乎所有流程引擎相关的API。如：

// 创建一个新的文档，并启动一个新的流程实例
def bean = new Foobar(xx:yy ...)
if ( bean.save(flush:true) ) {
processEngineService.start( employee, bean )
}

# 方法

## paginateParams( Integer defaultMax = null )

处理 params 中的翻页参数，主要用来处理 max；此外，同时兼容 jqGrid 的 page 参数（将其转换为 offset 参数）。

一般在脚手架模板生成的 list 操作中自动调用本方法。

- 如果 params 中包含参数 all，并且为真，则自动将 max 设为 10000、offset 设为 0
- 如果 params 中的参数 max 值大于系统参数 bropen.framework.pagination.max，则将其设置为系统参数值，即不允许一次请求太多数据
- 如果 params 中不包含 max，而调用API时的 defaultMax 参数不为空，则将 max 设为 defaultMax
- 否则，从员工的个性设置（fwk.pagination.max）或者系统默认值（bropen.framework.pagination.default）中计算 max 值

## nocache

设置 response 头（Cache-Control、Expires等），不允许浏览器缓存。

在 renderExport 方法中也会自动调用本方法。

## isAjax

判断是否是ajax请求，如果参数中有jsonp，则也认为是ajax请求（跨域的json调用）。例如：

if ( isAjax() ) {
renderAjaxMessage( [message: xxx] )
} else {
render view: xxx, model: [yyy: zzzz]
}

## renderAjaxMessage( Map/String message, String jsonp = null )

渲染AJAX消息，参数 message 为包含消息的Map，将转成JSON返回给浏览器，或者已转成JSON的字符串直接返回。如 [message:"XXXX", ...]。例如：

renderAjaxMessage( [message: 'foobar', reload: true] )

## renderExport( Map modelAndView )

渲染套打视图，参数 modelAndView 为包含view、model属性的Map，和方法 render 的参数一致。

在脚手架模板生成的 export 操作中自动调用本方法渲染套打视图，套打功能的详细开发过程可以参见开发手册。

本方法主要根据 params._export_format 或 response.format 参数设置渲染的 contentType（如 doc -> application/msword），并调用相关的服务，渲染出对应格式的文件给浏览器下载或打开。

例如：

def export() {
Foobar foobar = Foobar.get(params.id)
if ( !foobar ) renderError(message(code:'default.not.found.message', args:[message(code:c1,default:c2), params.id]))
else renderExport( [view: "${VIEW_PATH}export", model:[foobar: foobar]] )
}

## renderAjaxError( Object bean, String jsonp = null )

根据 Bean 的 errors 属性，渲染 AJAX 错误消息，渲染结果为 json 格式的 Map 对象，且每条错误之间用回车符 \n 分隔，如：

{ error: "error1\nerror2"}

## renderMessage( String message )

将一段简单的文本消息放在一个包含样式的消息页面中渲染，用于提醒用户，以提供更好用户体验。

可以通过链接查看渲染效果：/Foobar/error/message?message=Hello+World

renderMessage( "Hello World!" )

可以通过定制 grails-app/views/bropen/framework/core/Error/ 下的视图文件来个性化提醒界面。

## renderError( String message )

将文本消息渲染成一个包含样式的错误页面。

查看渲染效果：/Foobar/error/error?message=Hello+World

## renderWarning( String message )

将文本消息渲染成一个包含样式的警告页面。

查看渲染效果：/Foobar/error/warning?message=Hello+World

## renderDenied( String message = null )

将文本消息渲染成一个包含样式的拒绝访问页面。

查看渲染效果：/Foobar/error/denied?message=Hello+World

## renderText( String message )

直接渲染文本消息，注意 ContextType 将会被设置为 text/plain。

## updateDynamicTables( Object bean, Map params, Map callbacks = null )

保存（更新）客户端提交的所有动态表的数据。

在脚手器模板生成的 save、update 操作中会调用该方法，动态表的使用和参数说明详见开发手册与 bropen.toolkit.utils.grails.BeanUtils.updateDynamicTables 的 API 手册。

## updateDynamicTable( Object bean, Class hasManyClass, String hasManyName, String belongsToName, Map params, String paramsPrefix, String requiredField, Map callbacks = null )

保存（更新）客户端提交的某张动态表的数据。参数说明详见 BeanUtils 的同名方法。

## saveReferences( Object bean )

保存（更新）提交的关联对象（xxx.yyyy）的数据，一般在脚手架模板生成的 save 和 update 方法中被调用。

详细解释见 ControllersApiService 中的同名方法。

## updateAttachments( Object bean )

保存请求对象（request）中的附件，并返回附件（bropen.framework.core.Attachment）对象列表。

一般在脚手架模板生成的 save 和 update 方法中，当 bean 被保存成功后调用。

## deleteFailedAttachments( Object bean )

当bean保存失败时，删除已保存的附件。一般在 withInstance 中自动调用。

## withInstance( Closure c )

简化控制器里的操作代码，将最常用的判断放到本方法中，如判断 params.id 代表的 bean 是否存在、保存失败时自动回滚并删除本次上传的附件等。

在脚手架模板生成的多个操作中都会调用本方法。

详细说明参见 ControllersApiService 中的同名方法。

标签： BroToolkit BroFramework BroBPM
在2014-08-04 16:10上被李小翔创建

- 评论 （0）
- 附件 （0）
- 记录
- 信息

# 快速链接

- 首页
- 新闻动态
- FAQ

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号