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

grails的requestDispatcher的forward问题

阅读更多
java web开发关于请求的处理转发有两种方式,
  
  • 一是redirect ,返回302状态和一个新Location给浏览器,让浏览器重新请求
  •    二是requestDispatcher,可以用forward方法把请求转发给目标处理器。
  • grails 1.03现在的controller只提供了redirect方法,没有提供forward方法。
    即使自己使用request.getRequestDispatcher("/controller/action").forward(request,response)方法或在Controller中返回ModelAndView("forward:/controller/action"),想让grails转发请求,grails也不支持,会得到404错误。
   web 2.4规范filter对请求的处理方式REQUEST(外部请求)、FORWARD(内部转发)、INCLUDE(包含) 和 ERROR(错误),grails的URLMapping Filter只处理REQUEST,所以就处理不到forward的请求。
   解决方法:   [list]
  
  • 1:修改grails源码和web.xml对filter配置,不过grails的jira中已经宣称在1.1版本中会在Controller中支持forward方法
  •    [*]2:看看grails的web.xml配置,所有的.dispatch结尾的请求会有GrailsDispatcherServlet来处理,在看看grails的源码
    public class UrlMappingsFilter extends OncePerRequestFilter {
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    ...
    if(viewName == null || viewName.endsWith(GSP_SUFFIX) || viewName.endsWith(JSP_SUFFIX)) {
                                String forwardUrl = WebUtils.forwardRequestForUrlMappingInfo(request, response, info);
                                if(LOG.isDebugEnabled()) {
                                    LOG.debug("Matched URI ["+uri+"] to URL mapping ["+info+"], forwarding to ["+forwardUrl+"] with response ["+response.getClass()+"]");
                                }
    
                            }
    }
    }
    
    public class WebUtils extends org.springframework.web.util.WebUtils {
    
    		...
    		
    		public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, HttpServletResponse response, UrlMappingInfo info) throws ServletException, IOException {
            return forwardRequestForUrlMappingInfo(request, response, info, Collections.EMPTY_MAP);
        }
    
        public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, HttpServletResponse response, UrlMappingInfo info, Map model) throws ServletException, IOException {
            GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();
            String forwardUrl = buildDispatchUrlForMapping(info);
    
            //populateParamsForMapping(info);
            RequestDispatcher dispatcher = request.getRequestDispatcher(forwardUrl);
            populateWebRequestWithInfo(webRequest, info);
    
            exposeForwardRequestAttributes(request);
            exposeRequestAttributes(request, model);
            dispatcher.forward(request, response);
            return forwardUrl;
        }
        
        public static String buildDispatchUrlForMapping(UrlMappingInfo info) {
            final StringBuffer forwardUrl = new StringBuffer();
    
            if (info.getViewName() != null) {
                String viewName = info.getViewName();
                forwardUrl.append(SLASH).append(viewName);
            }
            else {
            		// GRAILS_SERVLET_PATH="/grails" SLASH='/' GRAILS_DISPATCH_EXTENSION=".dispatch"
                forwardUrl.append(GrailsUrlPathHelper.GRAILS_SERVLET_PATH);
                forwardUrl.append(SLASH)
                                  .append(info.getControllerName());
    
                if(!StringUtils.isBlank(info.getActionName())) {
                    forwardUrl.append(SLASH)
                              .append(info.getActionName());
                }
                forwardUrl.append(GrailsUrlPathHelper.GRAILS_DISPATCH_EXTENSION);
            }
    
            return forwardUrl.toString();
        }
    }
    
    按照grails处理规则,只要forward的url为/grails/controller/action.dispatch,grails就可以处理了。
      [/list]
       所以暂时的解决方法就是返回一个ModelAndView(forwardurl),forwardurl的格式为"forward:/grails/${controllerName}/${actionName}.dispatch"
       
    分享到:
    评论

    相关推荐

      Grails Grails Grails

      **Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之上,旨在简化开发过程并提高生产力。Grails 的设计深受Ruby on Rails的影响,提供了MVC(模型-视图-控制器)架构模式...

      grails技术应用问题总汇

      这个是我在开发中用到的技术,很多都是第一次使用。

      Eclipse下搭建Grails项目

      - 在`Windows -> Preferences -> Groovy`中,勾选"Disable Groovy Compiler Generating Class Files",防止groovy文件生成class文件,以免引起不必要的问题。 - 将Grails命令配置为Eclipse的外部工具,方便直接在...

      Grails权威指南 Grails权威指南

      《Grails权威指南》是一本全面深入探讨Grails框架的专著,旨在帮助读者掌握这一强大的Web开发工具。Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同...

      grails学习遇到的问题

      在学习Grails的过程中,初学者可能会遇到一系列的问题。Grails是一个基于Groovy语言的Web应用框架,它借鉴了Ruby on Rails的理念,强调“规约优于配置”,以提高开发效率。以下是一些关键知识点: 1. **环境配置**...

      grails-用户手册

      《Grails用户手册》 Grails,作为一个基于Groovy语言的开源Web应用框架,深受开发者喜爱,它简化了Java开发的复杂性,提供了强大的MVC(Model-View-Controller)架构,以及丰富的插件系统。这份用户手册将帮助你...

      eclipse开发grails插件

      对于Grails开发,我们需要的是Eclipse中的Grails插件,它能够提供对Grails项目的创建、运行、调试等一系列功能。 **Grails**是基于Groovy语言的全栈式Web开发框架,它借鉴了Ruby on Rails的设计理念,提供了快速...

      grails快速开发web

      - **Groovy & Grails 的 FAQ**:对于常见问题,社区提供了丰富的 FAQ 资源。 #### 五、Grails 实战指南 - **轻松入门系列**:介绍了如何搭建 Grails 开发环境、通过与 Java 的比较快速掌握 Groovy 语法,以及 ...

      Grails入门指南 -- 针对grails1.0.4更新

      ### Grails入门指南知识点 #### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。它旨在简化开发过程,提高开发效率,尤其受到那些希望保留Java环境同时寻求更高效...

      grails中文入门简介

      Grails是一个基于Groovy语言的全栈框架,它遵循约定优于配置的原则,并且紧密集成Spring和Hibernate等流行的Java库,简化了开发流程。Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式...

      Grails 中文参考手册

      《Grails 中文参考手册》是一本全面介绍Grails框架的指南,旨在帮助开发者快速上手并深入理解Grails的各个核心概念和技术。Grails是一个基于Groovy语言的开源Web应用框架,它提供了高效的开发环境和强大的功能,使得...

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

      4. 版本兼容:虽然grails-fckeditor-0.9.5是较旧的版本,但理解其工作原理有助于我们理解如何集成第三方库,以及在更新到新版本时需要注意的问题。 总结,Grails框架及其中文文档为开发者提供了强大的工具和丰富的...

      the definitive guide to grails 2

      《Grails 2 的终极指南》是一本深入探讨Grails框架精髓的专业书籍,该书以英文撰写,旨在为读者提供全面、深入的Grails框架学习资料。Grails框架基于Groovy语言,是一种高度动态、敏捷的Java应用开发框架,它简化了...

      eclipse插件grails(groovy)

      Eclipse 插件 Grails(Groovy)是一个强大的开发工具,它使得在Eclipse环境中进行Groovy和Grails应用的开发变得更为便捷。Groovy是一种动态、面向对象的编程语言,而Grails则是一个基于Groovy的开源Web应用框架,...

      Grails中文参考手册

      **Grails 概述** Grails 是一个基于 Groovy 语言的开源 web 应用程序框架,它构建在 Java 平台上,旨在提高开发效率,简化常见 Web 开发任务。Grails 遵循 Model-View-Controller (MVC) 架构模式,允许开发者快速...

      grails-2.4.4.zip

      《Grails 2.4.4 框架深度解析》 Grails 2.4.4 是一个基于Java的开源Web应用框架,它利用Groovy语言的强大特性,为开发者提供了一种高效、灵活的开发环境。这个压缩包“grails-2.4.4.zip”包含了完整的Grails 2.4.4...

      grails login

      **Grails登录系统详解** Grails是一个基于Java的开源Web应用程序框架,它使用Groovy语言进行开发,提供了高效、简洁的编程模型。在Grails中实现用户登录功能是构建任何Web应用的基础,它确保了数据的安全性和用户...

      Groovy和Grails配置方法

      ### Groovy和Grails配置方法 #### 一、Groovy与Grails简介 Groovy是一种强大的面向对象编程语言,它运行在Java平台上,并且能够直接与Java代码进行交互。Groovy支持函数式编程特性,拥有丰富的语法糖以及简洁的...

    Global site tag (gtag.js) - Google Analytics