Grails应用开发:视图、控制器与审计日志实践

立即解锁
发布时间: 2025-08-15 02:33:25 阅读量: 37 订阅数: 43 AIGC
PDF

Groovy与Grails:敏捷Web开发入门

### Grails应用开发:视图、控制器与审计日志实践 #### 1. 回顾与应用增强 在限制用户信息修改的过程中,我们学到了很多重要知识。比如,在编辑、更新和删除操作中引入逻辑,防止用户修改他人信息,只有用户本人才能进行修改。我们还研究了请求参数和Grails URL,明白了为何这种检查必须在控制器操作中进行。在查看`UserController`时,了解了信息如何以模型的形式返回给视图,以及如何通过数据绑定将参数设置到领域对象中。同时,也对领域对象验证有了初步了解,当验证失败时,视图可以从领域对象获取错误消息。 现在,我们可以利用这些知识进一步增强应用,控制显示的类别和待办事项信息。 #### 2. 控制类别显示 当用户导航到类别列表视图时,会显示所有类别,包括其他用户的类别。这对于用户维护自己的类别来说是一种干扰,没有实际价值。我们的目标是将所学的控制器操作知识应用到`Category`控制器上。 操作步骤如下: 1. **生成视图和控制器**:执行以下命令生成类别视图和控制器: ```plaintext grails generate-views Category grails generate-controller Category ``` 2. **限制列表视图显示的类别**:在增强之前,`list`操作的代码如下: ```groovy def list = { if(!params.max)params.max = 10 [ categoryList: Category.list( params ) ] } ``` 第2行检查`params`映射中是否包含`max`键,如果没有,则创建一个键值对,`max`的值为10。动态方法`list`使用`max`参数限制返回的类别数量。第3行调用类别领域对象的动态方法`list`,并将结果返回给列表视图。 为了将类别限制为当前登录用户,需要进行如下修改: ```groovy def list = { if(!params.max)params.max = 10 def user = User.get(session.user.id) [ categoryList: Category.findAllByUser(user, params) ] } ``` 第3行根据会话中的用户信息获取当前用户。第4行查找第3行获取的用户的所有类别,这是使用动态查找器方法的一个示例。运行应用后,列表视图将只显示当前登录用户的类别。 #### 3. 移除冗余信息 由于类别视图已经限制为当前登录用户,在任何视图中显示用户信息就显得多余了。移除用户选择组件分两步进行: 1. 从视图(`grails-app/views/category/*.gsp`)中移除用户选择组件,并在保存和更新操作调用时将用户默认设置为当前登录用户。 2. 在保存和更新操作中默认设置用户。以下是增强后的`save`和`update`操作代码: ```groovy def update = { def category = Category.get( params.id ) if(session.user.id != category.user.id) { flash.message = "You can only delete your own categories" redirect(action:list) return } def user = User.get(session.user.id); if(category) { category.properties = params category.user = user if(category.save()) { flash.message = "Category ${params.id} updated." redirect(action:show,id:category.id) } } } def save = { def category = new Category() category.properties = params def user = User.get(session.user.id); category.user = user if(category.save()) { flash.message = "Category ${category.id} created." redirect(action:show,id:category.id) } else { render(view:'create',model:[category:category]) } } ``` 这里的`flash.message`是Groovy字符串(GString),`${}`允许在字符串中插入表达式,例如将`category.id`的值插入到字符串中。 #### 4. 移除类别ID 类别ID在列表和显示视图中没有实际价值,可以将其移除。移除后,视图中没有类别ID和用户名的字段,用户体验将得到显著改善。 **注意**:在列表视图中,ID字段有一个链接用于显示特定类别,要确保将链接移到类别名称上,否则将无法导航到显示视图。 同时,应将添加到`UserController`的编辑、更新和删除操作中的用户检查应用到`CategoryController`的相应操作中。并且,将对类别控制器和视图的增强应用到待办事项控制器和视图中。 #### 5. 创建审计日志 有时候,应用可能会出现问题,了解操作的输入和结果非常有用。我们可以在操作执行前显示输入,在操作结果返回前显示结果。但如果为每个操作都添加这样的打印语句,工作量大且难以维护。 Grails提供了动作拦截器机制来实现这一功能,这类似于面向切面编程(AOP),对于熟悉Servlet过滤器拦截器的开发者来说也很容易理解。Grails的实现更加简单。 Grails提供了前置和后置拦截器,我们可以使用它们来实现审计日志功能。 操作步骤如下: 1. **添加前置拦截器**:在`TodoController`中添加`beforeInterceptor`闭包,示例代码如下: ```groovy def beforeInterceptor = { log.trace("${session?.user?.userName} Start action ${controllerName} Controller.${actionName}() : parameters $params") } ``` 如果定义了`beforeInterceptor`,并且没有其他指示,它将在操作调用前被调用。它可以访问所有控制器属性和请求参数,使用日志记录审计信息。这里使用了`?.`安全解引用运算符,避免了`NullPointerException`。 2. **添加后置拦截器**:在`TodoController`中添加`afterInterceptor`闭包,示例代码如下: ```groovy def afterInterceptor = { model -> log.trace("${session?.user?.userName} End action ${controllerName}Controller.${actionName}() : returns $model") } ``` 后置拦截器与前置拦截器类似,不同的是它接收模型对象作为参数,以便将其输出到
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

单光子偏振操控揭秘:量子光学与量子通信核心技术

![单光子偏振操控揭秘:量子光学与量子通信核心技术](https://static.mianbaoban-assets.eet-china.com/xinyu-images/MBXY-CR-360b2439a7c30685623f28c2dece28c5.png) # 摘要 本文系统探讨了单光子偏振操控的基本概念、物理基础与关键技术,深入分析了光子偏振态的量子力学描述及其操控原理。文章详细介绍了偏振态的制备、调制与测量方法,并构建了高精度偏振操控系统的设计框架。进一步地,本文聚焦其在量子通信领域的关键应用,涵盖量子密钥分发、高维编码及量子网络中的偏振态控制问题,揭示了偏振操控技术对提升通

图像测量误差来源大起底:以measure_pos为例的系统性分析方法

# 摘要 图像测量误差分析是提升计算机视觉系统精度与可靠性的关键环节。本文系统梳理了图像测量误差的基本概念、分类体系与建模方法,重点围绕measure_pos算法的工作原理及其误差来源展开深入探讨。通过理论分析与实验验证相结合的方式,本文识别出图像质量、算法参数设置及测量环境等因素对测量精度的显著影响,并提出了包括自适应参数优化、多尺度边缘检测与误差补偿模型在内的多种优化策略。研究结果可为工业检测、自动化测量等应用场景中的误差控制提供理论支持与实践指导,推动图像测量技术向更高精度与更强鲁棒性的方向发展。 # 关键字 图像测量误差;measure_pos算法;误差建模;亚像素定位;参

误差来源全面曝光:斜边法MTF计算的校正方法研究

# 摘要 斜边法是光学成像系统中常用的调制传递函数(MTF)测量方法,但其在实际应用中存在多种误差来源,影响测量精度。本文系统阐述了斜边法MTF计算的基本原理,深入分析了光学系统像差、探测器响应非理想、边缘定位误差、环境噪声等导致测量偏差的关键因素。在此基础上,构建了基于数学建模的误差校正理论框架,提出了多项式拟合与误差补偿策略,并通过实验验证了校正模型的有效性与适应性。研究结果为提升MTF测量精度提供了理论支持和技术路径,同时为工程实践中实现高精度、实时MTF检测提供了可行方案。 # 关键字 斜边法;MTF;误差校正;光学像差;边缘响应;傅里叶变换 参考资源链接:[图像斜边MT

【Python类异常处理设计之道】:优雅处理错误与异常的全面方案

![【Python类异常处理设计之道】:优雅处理错误与异常的全面方案](https://img-blog.csdnimg.cn/img_convert/003bf8b56e64d6aee2ddc40c0dc4a3b5.webp) # 摘要 本文系统探讨了Python异常处理的核心理念、理论结构及其在实际开发中的应用策略。从基本语法出发,分析了异常处理的机制、分类及执行流程,并深入讨论了自定义异常的设计原则与常见设计模式。文章结合函数、模块及Web应用等实际场景,阐述了异常处理在不同层级的实践方法,并探讨了异常在系统级错误恢复、日志记录及安全控制中的关键作用。同时,针对性能瓶颈与调试难题,

非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用

![非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用](https://img-blog.csdnimg.cn/2020112915251671.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NodWlkaWRlaHVheWlyZW4=,size_16,color_FFFFFF,t_70) # 摘要 红白噪声检验在非平稳信号处理中具有重要作用,是识别信号中噪声成分、提升分析精度的关键技术。本文系统阐述了红白噪声的基本

【MFC网络功能拓展】:一键上传分享截图的HTTP集成指南(含HTTPS安全传输方案)

![MFC截图(仿QQ截图)](https://www.befunky.com/images/wp/wp-2022-07-batch-watermark-step-5-create-watermark.jpg?auto=avif,webp&format=jpg&width=944) # 摘要 本文围绕基于MFC平台实现截图上传功能的技术方案展开,系统性地分析了MFC网络通信机制、HTTP/HTTPS协议应用及截图处理流程。首先,文章解析了HTTP协议结构与MFC网络编程接口,构建了基础网络通信框架,并实现文件上传功能。随后,详细阐述了截图功能的界面设计、图像处理方法及其与上传逻辑的整合,

低耗SDK设计指南:移动环境下电量与流量控制技巧

![低耗SDK设计指南:移动环境下电量与流量控制技巧](https://img-blog.csdnimg.cn/direct/8979f13d53e947c0a16ea9c44f25dc95.png) # 摘要 随着移动应用功能日益复杂,资源消耗问题成为影响用户体验和应用性能的关键因素。本文系统研究了移动应用开发中的电量与流量优化问题,深入分析了移动设备电量消耗的主要来源与流量控制机制,探讨了Android与iOS平台在电量管理上的差异,并提出了基于用户行为的流量预测模型与优化策略。针对低耗SDK的开发实践,本文设计了模块化架构与自适应调控算法,并通过性能测试与A/B对比验证了优化效果。

DHT11异常复位难题破解:STM32H7平台底层驱动+电源设计深度剖析

![STM32H743驱动DHT11数字温湿度传感器【支持STM32H7系列单片机_HAL库驱动】.zip](https://khuenguyencreator.com/wp-content/uploads/2021/07/stm32-dht11.jpg) # 摘要 DHT11传感器在嵌入式系统中广泛应用,但其在实际使用过程中常出现异常复位问题,影响数据采集的稳定性与可靠性。本文以基于STM32H7平台的应用为研究对象,系统分析了DHT11异常复位的现象与背景,深入剖析其通信协议、驱动机制及异常处理策略。进一步从硬件电源设计角度探讨了供电稳定性对传感器复位行为的影响,并结合软硬件协同调试

高并发场景下稳定性如何保障?PowerBuilder正则表达式多线程实战解析

![高并发场景下稳定性如何保障?PowerBuilder正则表达式多线程实战解析](https://ask.qcloudimg.com/http-save/yehe-4337369/ygstpaevp5.png) # 摘要 在高并发场景下,系统稳定性成为软件架构设计中的核心挑战。本文围绕高并发系统的基本理论、多线程编程实践以及正则表达式的高效应用展开研究,系统分析了并发模型、线程调度、资源竞争、限流降级、熔断机制等关键技术点。以PowerBuilder平台为实践基础,深入探讨了多线程任务的创建、同步与优化策略,并结合正则表达式的高级应用,提出在高并发环境下提升文本处理效率的优化方案。通过

DMA中断与SPI外设冲突排查实战:快速定位问题的6大技巧

![stm32F407 SPI1/SPI2 DMA 方式读写 CH376S](https://img-blog.csdnimg.cn/direct/10c17a74ab934a1fa68313a74fae4107.png) # 摘要 本文系统性地探讨了DMA与SPI技术的基础原理、协同工作机制及其在实际应用中可能出现的中断冲突问题。通过对DMA传输机制与SPI通信协议的深入解析,结合嵌入式系统中的典型应用场景,文章重点分析了中断优先级配置、资源竞争以及时序不匹配等引发冲突的关键因素。在此基础上,提出了基于日志分析、逻辑波形捕获和分段隔离法的高效问题排查技巧,并结合实际案例展示了中断优先级