在使用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中文参考手册 学习资料 groovy
grails 中文第二版
Grails是个一栈式开发框架,它尝试通过核心技术和插件技术来解决许多Web开发难题。Grails包含了如下内容: 由 Hibernate 构成的易于使用的 Object Relational Mapping (ORM)层 称为 Groovy Server Pages (GSP) 的...
grails 中文 API grails 中文 API
Grails Grails Grails Grails Grails
Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...
grails 中文文档+grails-fckeditor-0.9.5.zip插件
Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。
grails中的上传,下载,需要的请下载
比较难找的grails的资料,我也是找了很久才找到的。需要grails相关的拿走
Groovy和Grails配置方法 教你从0入手,一步一步深入安装和测试,包含环境和语言的下载地址
Grails 中文参考手册 Grails 中文参考手册
比较详细的grails中文文档,有所有命令行解释,还有grails的一个完整的学习过程的资料
grails 中文手册,grails应该不用说明是啥东西了吧,流行的脚本语言groovy应用框架。
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
主要介绍了如何解决grails2.3.2中不能运行fork模式的异常,大家参考使用吧