/*
* Copyright 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.portlet.handler;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
/**
* Interceptor to forward a request parameter from the <code>ActionRequest</code> to the
* <code>RenderRequest</code>.
*
* <p>This can be useful when using {@link ParameterHandlerMapping ParameterHandlerMapping}
* or {@link PortletModeParameterHandlerMapping PortletModeParameterHandlerMapping}.
* It will ensure that the parameter that was used to map the <code>ActionRequest</code>
* to a handler will be forwarded to the <code>RenderRequest</code> so that it will also be
* mapped the same way.
*
* <p>When using this Interceptor, you can still change the value of the mapping parameter
* in your handler in order to change where the render request will get mapped.
*
* <p>Be aware that this Interceptor does call <code>ActionResponse.setRenderParameter</code>,
* which means that you will not be able to call <code>ActionResponse.sendRedirect</code> in
* your handler. If you may need to issue a redirect, then you should avoid this Interceptor
* and either write a different one that does this in a different way, or manually forward
* the parameter from within your handler(s).
*
* <p>Thanks to Rainer Schmitz for suggesting this mapping strategy!
*
* @author John A. Lewis
* @since 2.0
* @see ParameterHandlerMapping
* @see PortletModeParameterHandlerMapping
*/
public class ParameterMappingInterceptor extends HandlerInterceptorAdapter {
/** Request parameter name to use for mapping to handlers */
public final static String DEFAULT_PARAMETER_NAME = "action";
private String parameterName = DEFAULT_PARAMETER_NAME;
/**
* Set the name of the parameter used for mapping.
*/
public void setParameterName(String parameterName) {
this.parameterName = (parameterName != null ? parameterName : DEFAULT_PARAMETER_NAME);
}
/**
* If request is an {@link javax.portlet.ActionRequest ActionRequest},
* get handler mapping parameter and add it to the ActionResponse.
*/
@Override
public boolean preHandleAction(ActionRequest request, ActionResponse response, Object handler) {
String mappingParameter = request.getParameter(this.parameterName);
if (mappingParameter != null) {
response.setRenderParameter(parameterName, mappingParameter);
}
return true;
}
}
|