@@ -17,16 +17,23 @@ package grails.artefact.controller.support
1717
1818import grails.web.UrlConverter
1919import grails.web.api.WebAttributes
20+ import grails.web.mapping.LinkGenerator
2021import grails.web.servlet.mvc.GrailsParameterMap
2122import groovy.transform.CompileStatic
2223import org.grails.plugins.web.controllers.metaclass.ForwardMethod
2324import org.grails.web.mapping.ForwardUrlMappingInfo
2425import org.grails.web.mapping.UrlMappingUtils
26+ import org.grails.web.mapping.mvc.UrlMappingsHandlerMapping
2527import org.grails.web.servlet.mvc.GrailsWebRequest
2628import org.grails.web.util.GrailsApplicationAttributes
29+ import org.grails.web.util.WebUtils
2730import org.springframework.beans.MutablePropertyValues
2831import org.springframework.beans.factory.annotation.Autowired
2932import org.springframework.validation.DataBinder
33+ import org.springframework.web.context.request.WebRequest
34+ import org.springframework.web.filter.OncePerRequestFilter
35+
36+ import javax.servlet.RequestDispatcher
3037
3138/**
3239 * A Trait for classes that forward the request
@@ -37,22 +44,27 @@ import org.springframework.validation.DataBinder
3744@CompileStatic
3845trait RequestForwarder implements WebAttributes {
3946 private UrlConverter urlConverter
47+ private LinkGenerator linkGenerator
4048
4149 @Autowired (required = false )
4250 void setUrlConverter(UrlConverter urlConverter) {
4351 this . urlConverter = urlConverter
4452 }
4553
54+ private LinkGenerator lookupLinkGenerator() {
55+ if (this . linkGenerator == null ) {
56+ this . linkGenerator = webRequest. getApplicationContext(). getBean(LinkGenerator )
57+ }
58+ return this . linkGenerator
59+ }
60+
4661 /**
4762 * Forwards a request for the given parameters using the RequestDispatchers forward method
4863 *
4964 * @param params The parameters
5065 * @return The forwarded URL
5166 */
5267 String forward(Map params) {
53- def urlInfo = new ForwardUrlMappingInfo ()
54- DataBinder binder = new DataBinder (urlInfo)
55- binder. bind(new MutablePropertyValues (params))
5668
5769 GrailsWebRequest webRequest = getWebRequest()
5870
@@ -68,18 +80,18 @@ trait RequestForwarder implements WebAttributes {
6880 def convertedControllerName = convert(controllerName. toString())
6981 webRequest. controllerName = convertedControllerName
7082 }
71- urlInfo . controllerName = webRequest. controllerName
83+ params . controller = webRequest. controllerName
7284
7385 if (params. action) {
74- urlInfo . actionName = convert(params. action. toString())
86+ params . action = convert(params. action. toString())
7587 }
7688
7789 if (params. namespace) {
78- urlInfo . namespace = params. namespace
90+ params . namespace = params. namespace
7991 }
8092
8193 if (params. plugin) {
82- urlInfo . pluginName = params. plugin
94+ params . plugin = params. plugin
8395 }
8496 }
8597
@@ -88,14 +100,21 @@ trait RequestForwarder implements WebAttributes {
88100 def request = webRequest. currentRequest
89101 def response = webRequest. currentResponse
90102
91- request . setAttribute( GrailsApplicationAttributes . FORWARD_IN_PROGRESS , true )
103+ WebUtils . exposeRequestAttributes(request, ( Map )model);
92104
93- if (params. params instanceof Map ) {
94- urlInfo. parameters. putAll((Map )params. params)
95- }
105+ request. setAttribute(GrailsApplicationAttributes . FORWARD_IN_PROGRESS , true )
96106 request. setAttribute(GrailsApplicationAttributes . FORWARD_ISSUED , true )
97- String uri = UrlMappingUtils . forwardRequestForUrlMappingInfo(request, response, urlInfo, (Map )model, true )
98- return uri
107+
108+ def fowardURI = lookupLinkGenerator(). link(params)
109+
110+
111+ RequestDispatcher dispatcher = request. getRequestDispatcher(fowardURI)
112+ webRequest. removeAttribute(GrailsApplicationAttributes . MODEL_AND_VIEW , 0 );
113+ webRequest. removeAttribute(GrailsApplicationAttributes . GRAILS_CONTROLLER_CLASS_AVAILABLE , WebRequest . SCOPE_REQUEST );
114+ webRequest. removeAttribute(UrlMappingsHandlerMapping . MATCHED_REQUEST , WebRequest . SCOPE_REQUEST );
115+ webRequest. removeAttribute(" grailsWebRequestFilter" + OncePerRequestFilter . ALREADY_FILTERED_SUFFIX , WebRequest . SCOPE_REQUEST );
116+ dispatcher. forward(request, response);
117+ return fowardURI
99118 }
100119
101120
0 commit comments