在使用grails中发现,controller本身没有提供转发请求的方法,之后查看源码后发现按照grails的DispatchServlet的格式即/grails/controllerName/actionName.dispatch这样的URI,是可以转发的。
但发现如果在gsp或jsp中调用request.getRequestDispatcher(uri).forward(request,response),页面就会在forward的那行代码抛出NullPointerException。最近一直在研究其源码,终于找到了解决方法,这其实是grails的一个小bug吧。
首先GrailsWebRequestFilter把当前request放在ThreadLocal中,在经过UrlMappingsFilter通过查找Url映射,看是否有满足条件的Controller,如果有设置GrailsWebRequest中的Controller和action值,并转发到GrailsDispatcherServlet处理。在gsp/jsp中做转发,当前GrailsWebRequest中的Controller和action值都是null
import javax.servlet.http.HttpServletRequest
import javax.servlet.ServletException
import org.springframework.web.context.request.RequestContextHolder;
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
import org.codehaus.groovy.grails.web.servlet.GrailsUrlPathHelper
import org.codehaus.groovy.grails.web.util.WebUtils
import org.apache.commons.lang.StringUtils
import javax.servlet.http.HttpServletResponse
public class RequestDispatchUtils {
public static void forward(HttpServletRequest request,HttpServletResponse response,String controller,String action, Map params)throws ServletException, IOException {
GrailsWebRequest webRequest = RequestContextHolder.currentRequestAttributes();
webRequest.setControllerName(controller)
webRequest.setActionName(action)
if(params)
webRequest.getParams().putAll(params)
request.getRequestDispatcher(buildDispatchUrl(controller,action)).forward(request,response)
}
private static String buildDispatchUrl(String contoller,String action) {
final StringBuffer forwardUrl = new StringBuffer();
forwardUrl.append(GrailsUrlPathHelper.GRAILS_SERVLET_PATH);
forwardUrl.append(WebUtils.SLASH)
.append(contoller);
if(!StringUtils.isBlank(action)) {
forwardUrl.append(WebUtils.SLASH)
.append(action);
}
forwardUrl.append(GrailsUrlPathHelper.GRAILS_DISPATCH_EXTENSION);
return forwardUrl.toString();
}
}
//在jsp或controller中直接调用RequestDispatchUtils的forward方法就可以
分享到:
相关推荐
"Grails 中文参考手册" 是一套详细的 Grails 学习资料,涵盖了框架的所有核心组件、最佳实践和使用方法,帮助开发者快速掌握 Grails 开发技能。 总之,Grails 是一个强大而灵活的 Web 开发框架,结合 Groovy 的优点...
- **部署**:讲解了在各种Java EE容器中部署Grails应用的方法。 2. **配置**: - **基本配置**:讨论了Grails的基础配置选项,包括内置选项和日志设置。 - **数据源**:详细介绍了数据源的配置,包括与环境的...
Grails兼容广泛的Java应用服务器,包括但不限于Apache Tomcat、Jetty、Resin等,这使得Grails应用能在不同的环境中无缝运行。 8. **创建工件** Grails提供了多种命令用于生成模型类、控制器、服务等工件,如`...
Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式的应用程序。 在入门Grails之前,首先需要了解如何下载并安装这个框架。Grails官方提供了各个版本的下载链接,通常包括zip压缩包和可...
FCKEditor是一款著名的在线文本编辑器,grails-fckeditor-0.9.5插件则是将其集成到Grails应用中的解决方案。以下是关键点: 1. 安装与配置:在Grails项目中添加插件依赖,然后通过配置文件调整编辑器的参数,如默认...
验证Grails是否安装成功的方法是在命令行中输入`grails`,如果出现Grails的欢迎信息,则表示安装成功。 **3. 安装Groovy** 最后一步是安装Groovy语言。本文档中的版本为1.5.4,可以从以下地址下载: - 下载地址:...
在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载操作的深入解析,包括其实现机制、代码示例及注意事项。 ### 文件上传 ...
标题中的“grails不能运行fork模式解决方法”指的是在使用Grails框架开发应用程序时遇到的一个问题,即在Grails 2.3.2版本中,尝试运行应用时,由于内部的`Forked Grails VM`无法正常启动,导致程序出现异常。...
Grails是个一栈式开发框架,它尝试通过核心技术和插件技术来解决许多Web开发难题。Grails包含了如下内容: 由 Hibernate 构成的易于使用的 Object Relational Mapping (ORM)层 称为 Groovy Server Pages (GSP) 的...
本文将深入解析Grails中文API中的关键概念和技术点。 1. **Grails框架概述** Grails是基于Spring框架构建的,它整合了Groovy语言的强大功能和Java生态系统的优势。Grails遵循MVC(Model-View-Controller)设计模式...
Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...
7. 阅读Grails中文API文档,解决实际开发中的问题。 在学习过程中,还可以参考在线教程、视频课程和社区论坛,如Stack Overflow和Grails官方社区,以便获取更多实践经验和帮助。 总之,Grails作为Java平台上的快速...
3. **GORM 数据库访问**:Grails 的 GORM(Grailed Object Relational Mapping)提供了一个简单易用的 ORM 解决方案,用于与数据库交互。通过注解和动态方法,你可以轻松操作数据。 4. **Grails 控制器**:学习如何...
1. **模型(Model)**: 在Grails中,模型通常由Domain Classes表示,它们是持久化的实体,与数据库表对应。Domain Classes使用Groovy的元编程特性,如属性验证和动态方法,提供数据验证和业务逻辑。 2. **视图...
- Grails版本信息可以在项目的`BuildConfig.groovy`文件中找到。 **文档引擎** - 提供了文档生成工具,帮助开发者快速生成API文档。 **依赖解析** - Grails使用Ivy作为其依赖管理系统。 - 支持配置依赖关系,包括...
在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. **Grails环境安装** - 首先,你需要从Grails官网(http://grails.org/)下载最新版的Grails安装包。 - 安装完成后,确保...
Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。
Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同层次的开发者,无论你是初学者还是经验丰富的程序员,都能从中受益。 Grails框架的核心特性包括模型...