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方法就可以
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值