I looked at com.opensymphony.webwork.views.util.UrlHelper.java and it seems to have the exact same issue, although in this case it's not as easy a fix since it's not claiming to be a bean.
Anders Hovm�ller
/* * WebWork, Web Application Framework * * Distributable under Apache license. * See terms of license at opensource.org */ package webwork.view.taglib;
import org.apache.commons.logging.*;
import javax.servlet.http.*;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import webwork.util.TextUtil;
import webwork.util.BeanUtil;
/**
* This tag is used to create a URL. You can use the "param" tag inside the body to
provide
* additional request parameters.
*
* @see ParamTag
* @author Rickard �berg ([EMAIL PROTECTED])
* @version $Revision: 1.18 $
*/
public class URLTag
extends WebWorkBodyTagSupport
implements ParamTag.Parametric {
// Attributes ----------------------------------------------------
protected String page;
protected String valueAttr;
protected String value;
protected Map params = new HashMap();
protected StringBuffer link = new StringBuffer();
// Public --------------------------------------------------------
/**
* @deprecated use value instead
*/
public void setPage(String aName) {
page = aName;
}
public void setValue(String aName) {
valueAttr = aName;
}
public void addParameter(String name, Object value) {
if (params == null)
params = new HashMap();
if (value == null)
params.remove(name);
else {
params.put(name, BeanUtil.toStringValue(value));
}
}
// BodyTag implementation ----------------------------------------
public int doStartTag() throws JspException {
if (page == null) {
if (valueAttr != null)
value = findString(valueAttr);
} else {
value = page;
}
this.params.clear();
this.page=null;
link.delete(0, link.length());
//no explicit url set so attach params from current url, do
//this at start so body params can override any of these they wish.
if (value==null) {
try {
// Parse the query string to make sure that the parameters come from the
query, and not some posted data
HttpServletRequest req = ((HttpServletRequest) pageContext.getRequest());
String query = req.getQueryString();
if (query != null)
{
// Remove possible #foobar suffix
int idx = query.lastIndexOf('#');
if (idx != -1)
query = query.substring(0, idx-1);
params.putAll(HttpUtils.parseQueryString(query));
}
} catch (Exception e) {
LogFactory.getLog(this.getClass()).warn("Unable to put request parameters
("+((HttpServletRequest) pageContext.getRequest()).getQueryString()+") into parameter
map.", e);
}
}
return EVAL_BODY_TAG;
}
public int doEndTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
if (value != null) {
// Check if context path needs to be added
// Add path to absolute links
if (value.startsWith("/")) {
link.append(request.getContextPath());
}
// Add page
link.append(value);
} else {
// Go to "same page"
String requestURI = (String) request.getAttribute("webwork.request_uri");
// String contextPath=(String)request.getAttribute("webwork.context_path");
if (requestURI == null) requestURI = request.getRequestURI();
// if(contextPath==null) contextPath=request.getContextPath();
link.append(requestURI);
}
//if the value was not explicitly set grab the params from the request
if (params != null && params.size() > 0) {
if (link.toString().indexOf("?") == -1) {
link.append('?');
} else {
link.append("&");
}
// Set parameters
Iterator enum = params.entrySet().iterator();
while (enum.hasNext()) {
Map.Entry entry = (Map.Entry) enum.next();
String name = (String) entry.getKey();
Object value = entry.getValue();
if (value != null) {
if (value instanceof String) {
link.append(name);
link.append('=');
link.append(URLEncoder.encode((String) value));
} else {
String[] values = (String[]) value;
link.append(name);
link.append('=');
link.append(URLEncoder.encode(values[0]));
}
}
if (enum.hasNext())
link.append("&");
}
}
String result;
try {
//Category.getInstance(this.getClass().getName()).debug(link.toString());
result = response.encodeURL(link.toString());
} catch (Exception e) {
// Could not encode URL for some reason
// Use it unchanged
result = link.toString();
}
String id = getId();
if(id != null) {
pageContext.setAttribute(id, result);
pageContext.setAttribute(id, result, PageContext.REQUEST_SCOPE);
} else {
try {
pageContext.getOut().write(result);
} catch (IOException _ioe) {
throw new JspException("IOError: " + _ioe.getMessage());
}
}
return EVAL_PAGE;
}
}
/*
* WebWork, Web Application Framework
*
* Distributable under Apache license.
* See terms of license at opensource.org
*/
package webwork.view.velocity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpUtils;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.net.URLEncoder;
/**
* A utility class that is used to URL-encode links
* in Velocity templates.
*
* @author Dave Bryson ([EMAIL PROTECTED])
*/
public class URLBean
{
/** Http Request */
private HttpServletRequest request = null;
/** Http Response */
private HttpServletResponse response = null;
/** Content name */
private String page = null;
/** Path info parameters */
private Map params = new HashMap();
private StringBuffer link = new StringBuffer();
public URLBean()
{
}
/**
* @return String the page name
*/
public String getPage()
{
return page;
}
/**
* Set the page.
* @param String the page name
* @return URLBean this
*/
public URLBean setPage(String page)
{
this.page = page;
return this;
}
/**
* Add a parameter to the URL.
* Cut and paste from the UrlTag in WebWork
* @param String name
* @param Object value
* @return URLBean this
*/
public URLBean addParameter(String name, Object value)
{
if (params == null)
params = new HashMap();
if (value == null)
params.remove(name);
else
params.put(name, value.toString());
return this;
}
/**
* Set the HttpRequest
* @param HttpSevletRequest the request
*/
public void setRequest(HttpServletRequest req)
{
this.request = req;
}
/**
* Set the HttpServletResponse
* @param HttpServlet the response
*/
public void setResponse(HttpServletResponse resp)
{
this.response = resp;
}
/**
* Generates the URL. This is called automatically
* in the Velocity template. In otherwords, you do not
* need to explicitly call toString()
* This is pretty much a cut and paste of code from the URLTag
* in Webwork
* @return String the generated URI
*/
public String getURL()
{
if (page == null)
{
// No particular page requested, so go to "same page"
// Add query params to parameters
params = request.getParameterMap();
}
if (page != null)
{
if ( page.startsWith("/") )
{
// Add context to the front of the URI
String appContext = request.getContextPath();
link.append(appContext);
}
link.append(page);
}
else
{
// Go to "same page"
String requestURI = (String) request.getAttribute("webwork.request_uri");
if (requestURI == null) requestURI = request.getRequestURI();
link.append(requestURI);
}
if (params != null && params.size() > 0)
{
link.append('?');
// Set parameters
Iterator enum = params.entrySet().iterator();
while (enum.hasNext())
{
Map.Entry entry = (Map.Entry) enum.next();
String name = (String) entry.getKey();
Object value = entry.getValue();
if (value != null)
{
if (value instanceof String)
{
link.append(name);
link.append('=');
link.append(URLEncoder.encode((String) value));
}
else
{
String[] values = (String[]) value;
link.append(name);
link.append('=');
link.append(URLEncoder.encode(values[0]));
}
}
if (enum.hasNext())
link.append("&");
}
}
String result;
try
{
result = response.encodeURL(link.toString());
}
catch (Exception e)
{
// Could not encode URL for some reason
// Use it unchanged
result = link.toString();
}
// Reset params and page
this.params.clear();
this.page=null;
link.delete(0, link.length());
return result;
}
public String toString()
{
return getURL();
}
}
