【问题标题】:jsp:param no longer sets parameters when original request is wrapped with a HttpServletRequestWrapper当原始请求用 HttpServletRequestWrapper 包装时,jsp:param 不再设置参数
【发布时间】:2010-02-03 18:56:39
【问题描述】:

我有一个过滤器,它接受一个传入的请求,然后用一个 HttpServletRequestWrapper 包装它,而后者又具有一个 setParameter() 方法。但是,现在这在任何过滤的 servlet 中都不再起作用:

<jsp:include page="testing-include.jsp">
    <jsp:param name="testing" value="testing" />
</jsp:include>

包含页面不会接受请求参数。如果我删除过滤器,并且原始未修改的请求被发送(解包)到 servlet,那么它会再次工作。这是我的包装:

public class HttpServletModifiedRequestWrapper extends HttpServletRequestWrapper {

    Map parameters;

    @SuppressWarnings("unchecked")
    public HttpServletModifiedRequestWrapper(HttpServletRequest httpServletRequest) {
        super(httpServletRequest);
        parameters = new HashMap(httpServletRequest.getParameterMap());
    }

    public String getParameter(String name) {
        String returnValue = null;
        String[] paramArray = getParameterValues(name);
        if (paramArray != null && paramArray.length > 0){
            returnValue = paramArray[0];
        }
        return returnValue;
    }

    @SuppressWarnings("unchecked")
    public Map getParameterMap() {
        return Collections.unmodifiableMap(parameters);
    }

    @SuppressWarnings("unchecked")
    public Enumeration getParameterNames() {
        return Collections.enumeration(parameters.keySet());
    }

    public String[] getParameterValues(String name) {
        String[] result = null;
        String[] temp = (String[]) parameters.get(name);
        if (temp != null){
            result = new String[temp.length];
            System.arraycopy(temp, 0, result, 0, temp.length);
        }
        return result;
    }

    public void setParameter(String name, String value){
        String[] oneParam = {value};
        setParameter(name, oneParam);
    }

    @SuppressWarnings("unchecked")
    public void setParameter(String name, String[] values){
        parameters.put(name, values);
    }
}

如果不查看 Tomcat 的 jsp:include 和 jsp:param 标准操作的实现源,我真的很难确定会发生什么,但那里肯定存在一些冲突。任何帮助将不胜感激。

【问题讨论】:

    标签: java jsp jsp-tags


    【解决方案1】:

    我猜问题是您的包装器不提供对新参数的访问,这些新参数是在您复制后添加到原始参数映射中的。

    或许,您应该这样做(在其他方法中也是如此):

    public String[] getParameterValues(String name) {  
        String[] result = null;  
        String[] temp = (String[]) parameters.get(name);  
        if (temp != null){  
            result = new String[temp.length];  
            System.arraycopy(temp, 0, result, 0, temp.length);  
        } else {
            return super.getParameterValues(name);
        } 
        return result;  
    }
    

    【讨论】:

    • 如果新参数不遮蔽同名的旧参数,这就足够了。如果是这样,这将不起作用。希望这不常见。以上可能可行,但即使您在地图中找到匹配项,您也应该检查 super.getParameterValues 并确认值数组的长度仍然与您的匹配。如果不是,则预先添加了一个新值。
    猜你喜欢
    • 2013-05-26
    • 2015-01-23
    • 2016-12-02
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2012-09-04
    相关资源
    最近更新 更多