`
bloodwolf_china
  • 浏览: 131613 次
社区版块
存档分类
最新评论

grails中RequestDispatch的forward终极解决方法

阅读更多
  在使用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方法就可以 
2
0
分享到:
评论
2 楼 bloodwolf_china 2009-02-06  
引用
在save action里面,如果我用这个forward方法

这个类的forward的方法是把当前请求转发到另一个Controller中处理,提供了两个参数String controller,String action
如果在同一个controller中,不需要forward,直接调用另一个方法就可以了。
1 楼 seanwon 2009-02-03  
兄弟,有一点小问题。

我们拿Book的domain类来举例,我创建以后save,在save action里面,如果我用这个forward方法,那么就会被提示没有save.gsp。因为默认的action和view的映射是根据名字的。

而原来用redirect(action:show)是会到show.gsp页面呈现的。

除了重新创建一个view以外,还有别的解决方案嘛?

相关推荐

    Grails中文参考手册

    "Grails 中文参考手册" 是一套详细的 Grails 学习资料,涵盖了框架的所有核心组件、最佳实践和使用方法,帮助开发者快速掌握 Grails 开发技能。 总之,Grails 是一个强大而灵活的 Web 开发框架,结合 Groovy 的优点...

    Grails 中文参考手册

    - **部署**:讲解了在各种Java EE容器中部署Grails应用的方法。 2. **配置**: - **基本配置**:讨论了Grails的基础配置选项,包括内置选项和日志设置。 - **数据源**:详细介绍了数据源的配置,包括与环境的...

    grails中文参考手册

    Grails兼容广泛的Java应用服务器,包括但不限于Apache Tomcat、Jetty、Resin等,这使得Grails应用能在不同的环境中无缝运行。 8. **创建工件** Grails提供了多种命令用于生成模型类、控制器、服务等工件,如`...

    grails中文入门简介

    Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式的应用程序。 在入门Grails之前,首先需要了解如何下载并安装这个框架。Grails官方提供了各个版本的下载链接,通常包括zip压缩包和可...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    FCKEditor是一款著名的在线文本编辑器,grails-fckeditor-0.9.5插件则是将其集成到Grails应用中的解决方案。以下是关键点: 1. 安装与配置:在Grails项目中添加插件依赖,然后通过配置文件调整编辑器的参数,如默认...

    Groovy和Grails配置方法

    验证Grails是否安装成功的方法是在命令行中输入`grails`,如果出现Grails的欢迎信息,则表示安装成功。 **3. 安装Groovy** 最后一步是安装Groovy语言。本文档中的版本为1.5.4,可以从以下地址下载: - 下载地址:...

    grails中的上传,下载

    在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载操作的深入解析,包括其实现机制、代码示例及注意事项。 ### 文件上传 ...

    grails不能运行fork模式解决方法

    标题中的“grails不能运行fork模式解决方法”指的是在使用Grails框架开发应用程序时遇到的一个问题,即在Grails 2.3.2版本中,尝试运行应用时,由于内部的`Forked Grails VM`无法正常启动,导致程序出现异常。...

    Grails1.1中文文档

    Grails是个一栈式开发框架,它尝试通过核心技术和插件技术来解决许多Web开发难题。Grails包含了如下内容: 由 Hibernate 构成的易于使用的 Object Relational Mapping (ORM)层 称为 Groovy Server Pages (GSP) 的...

    grails中文API

    本文将深入解析Grails中文API中的关键概念和技术点。 1. **Grails框架概述** Grails是基于Spring框架构建的,它整合了Groovy语言的强大功能和Java生态系统的优势。Grails遵循MVC(Model-View-Controller)设计模式...

    Grails1.1中文文档(CHM)

    Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...

    Grails入门精通及中文API

    7. 阅读Grails中文API文档,解决实际开发中的问题。 在学习过程中,还可以参考在线教程、视频课程和社区论坛,如Stack Overflow和Grails官方社区,以便获取更多实践经验和帮助。 总之,Grails作为Java平台上的快速...

    grails中文文档

    3. **GORM 数据库访问**:Grails 的 GORM(Grailed Object Relational Mapping)提供了一个简单易用的 ORM 解决方案,用于与数据库交互。通过注解和动态方法,你可以轻松操作数据。 4. **Grails 控制器**:学习如何...

    Grails Grails Grails

    1. **模型(Model)**: 在Grails中,模型通常由Domain Classes表示,它们是持久化的实体,与数据库表对应。Domain Classes使用Groovy的元编程特性,如属性验证和动态方法,提供数据验证和业务逻辑。 2. **视图...

    grails 中文第二版

    - Grails版本信息可以在项目的`BuildConfig.groovy`文件中找到。 **文档引擎** - 提供了文档生成工具,帮助开发者快速生成API文档。 **依赖解析** - Grails使用Ivy作为其依赖管理系统。 - 支持配置依赖关系,包括...

    Eclipse下搭建Grails项目

    在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. **Grails环境安装** - 首先,你需要从Grails官网(http://grails.org/)下载最新版的Grails安装包。 - 安装完成后,确保...

    Grails 1.1 中文手册 chm

    Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。

    Grails权威指南 Grails权威指南

    Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同层次的开发者,无论你是初学者还是经验丰富的程序员,都能从中受益。 Grails框架的核心特性包括模型...

Global site tag (gtag.js) - Google Analytics