`

09年03月27日--request 之 getParameterMap

阅读更多

在struts1的action中, status参数通过param的方式传到action中,即以下代码

document.form1.action = '${pageContext.request.contextPath}/crs/meetingAction.do?method=editSaveMeeting&status='+status;

 在action中操作完status参数后,需要转到另一个action,但是需要改变status的值,情理之中,想到下面的方法,

  request.getParameterMap().remove("status");

 

经测试在,转到下一个action中的,status值还存在。

在网上搜索到以下文章,

近做项目,用到request.getParameterMap();在对返回的Map进行操作的时候产生异常

Cannot find message associated with key parameterMap.locked,

网上找了一下解决方法,记录一下,希望对产生同样问题的朋友有所帮助,如下:

 


Map requestParams=request.getParameterMap();
......
requestParams.remove("key");

运行时会报错误:

Cannot find message associated with key parameterMap.locked
at org.apache.catalina.util.ParameterMap.remove(ParameterMap.java:204)

从输出的错误信息发现,原来request.getParameterMap();返回的不是一般的Map,而是org.apache.catalina.util.ParameterMap!
反编译ParameterMap,发现其继承自HashMap:

public final class ParameterMap extends HashMap

其中有一个加锁的方法,问题就出在这里了:

    public void setLocked(boolean locked)
    {
        this.locked = locked;
    }

其他所有修改内容的方法,都会判断是否上锁。如果处于锁定状态,就会抛出异常,比如最常用的put方法:
public Object put(Object key, Object value)
    {
        if(locked)
            throw new IllegalStateException(sm.getString("parameterMap.locked"));
        else
            return super.put(key, value);
    }

原来如此!

于是,从Tomcat下拷来了catalina.jar,代码写成

ParameterMap requestParams=(ParameterMap)request.getParameterMap();
requestParams.setLocked(false);
requestParams.remove("key");
......

运行时还是报类型转换错误:不能从org.apache.catalina.util.ParameterMap转换为org.apache.catalina.util.ParameterMap
用instanceof判断,返回的也是false,有点晕,呵呵

最后,只好用反射来搞定了:

Method method=requestParams.getClass().getMethod("setLocked",new Class[]{boolean.class});
method.invoke(requestParams,new Object[]{new Boolean(false)});

OK!运行通过!锁定已经接触,可以像操作普通的Map一样,修改request的请求参数了!



文章出处:http://www.diybl.com/course/3_program/java/javashl/2008321/105928.html

 虽然已可以解决,但是用了反射机制,感觉比较麻烦,

于是另寻解决办法。

我们公司用到了Jakarta Commons 组件,大家可以在网上查一下,很简单实用,

其中有个 import org.apache.commons.beanutils.DynaBean;类

在Action中,可以用以下代码:

public ActionForward meetingList(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DynaBean bean = (DynaBean) form;
  bean.set("status", "0");
}

 将form中强制转换为DynaBean类,然后直接用set方法就可以把 request.getParameterMap()中的key删掉!

分享到:
评论
4 楼 aaronhugo 2011-08-16  
这段时间突然遇到,总算有办法了。
3 楼 jessdy 2009-09-03  
真是不择手段啊
2 楼 litchi 2009-04-09  
返回的 parameterMap是不可变的,因此网上流传广泛的这个版本实际上是没法做到修改parameter的。。。
1 楼 litchi 2009-04-09  
正好今天也碰到这个问题,谢谢啊

相关推荐

    request.getParameterMap()返回的是String []数组1

    `request.getParameterMap()`、`request.getParameter()`和`request.getParameterValues()`是三个重要的方法,它们分别用于获取不同类型的请求参数。接下来,我们将深入探讨这三个方法的功能、用法以及它们之间的...

    作业getParameterMap()

    在Java Web开发中,`getParameterMap()`是一个非常关键的方法,尤其在Servlet编程中。这个方法是Servlet接口中的一个成员,用于获取HTTP请求中所有参数的映射。在深入讲解`getParameterMap()`之前,我们先简单回顾...

    java web 修改request携带的参数信息

    Request对象封装了客户端发送到服务器的所有数据,包括URL参数、请求头、请求体等。在某些场景下,可能需要对这些参数信息进行修改,比如安全过滤、数据校验或者日志记录等。本程序就是针对这种情况设计的一个实用...

    获取request的参数

    在Java Servlet中,可以使用`getParameter()`或`getParameterValues()`方法,但要注意,如果是POST请求,需要先调用`request.getParameter()`之前调用`request.getParameterNames()`或`request.getParameterMap()`以...

    JSP 内置对象:request 对象.pptx

    request 对象是 JSP 中九个可供使用的隐式对象之一,它属于输入/输出对象,主要用于处理客户端传送给服务器端的请求参数。 request 对象提供了多种方法来获取请求参数,例如: 1. String getParameter(String name...

    java request.getParameter中文乱码解决方法

    java request.getParameter中文乱码解决方法 在 Java Web 开发中,request.getParameter() 获取 URL 中文参数乱码是非常常见的问题。今天,我们将分享几个解决中文乱码的方法,以便大家可以参考。 问题分析 在 ...

    jsp中request中的使用获取参数

    另外,`request`对象还有其他重要方法,比如`getLocale()`用于获取用户的首选语言,`getAttribute()`和`setAttribute()`用于在请求作用域内存储和检索对象,以及`getParameterMap()`返回所有请求参数的键值对。...

    Request对象.pptx

    - `getParameterMap()`:返回一个`Map`,键是参数名,值是对应的参数值列表(如果参数有多个值,列表长度可能超过1)。 2. **处理表单数据**: - 当用户通过HTML表单提交数据时,Request对象同样能处理这些数据。...

    Request中获取相关网络信息

    例如,获取请求方法(`request.getMethod()`)、请求URI(`request.getRequestURI()`)、请求参数(`request.getParameterMap()`)等。这些信息在处理请求时非常有用,可以辅助我们理解用户的操作意图。 总的来说,通过对...

    java修改请求参数

    `getParameterMap()`返回一个`Map, String[]>`,其中键是参数名,值是该参数的所有值(因为同一个参数名可能对应多个值)。 然而,需要注意的是,`HttpServletRequest`对象通常是只读的,直接修改`getParameterMap...

    request获取url以及其参数

    Map, String[]> parameterMap = request.getParameterMap(); for (Map.Entry, String[]> entry : parameterMap.entrySet()) { String paramName = entry.getKey(); String[] paramValues = entry.getValue(); // ...

    使用HttpServletRequestWrapper在filter修改request参数

    这个子类需要覆盖`getParameter`、`getParameterMap` 和 `getParameterValues` 等方法,以便在获取参数时进行修改。例如,我们可能需要将所有空字符串参数转换为`null`,或者替换敏感字符。 ```java public class ...

    JSP2_0技术学习笔记

    - `request.getContextPath()`、`request.getMethod()`、`request.getProtocol()`、`request.getQueryString()`、`request.getRequestedSessionId()`、`request.getRequestURI()`、`request.getRemoteAddr()`和`...

    快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    快速解决SpringMVC @RequestBody 用map接收请求参数的问题 在 SpringMVC 中,使用 @RequestBody 注解可以将请求体中的数据转换为 Java 对象,但是在使用 map 接收请求参数时,经常会遇到一些问题。本文将讨论如何...

    servlet2.4doc

    The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. doGet...

    JSP中Servlet的Request与Response的用法与区别

    - `getParameterMap()`:获取所有参数的Map对象,键为参数名,值为参数值列表。 处理中文乱码问题: - GET方式提交时,由于默认编码问题,可以通过获取字节数组并转换编码解决,如`name = new String(name....

    java 获取request中的请求参数代码详解

    Java 还提供了一个更方便的方法来获取所有请求参数,即使用 `request.getParameterMap()` 方法,该方法返回一个 `Map` 对象,其中包含所有的请求参数。 ```java Map, String[]> parameterMap = request....

    java学习笔记

    - 可以通过request对象获取客户端的请求参数,例如`getParameter()`, `getParameterNames()`, `getParameterValues()`和`getParameterMap()`方法。 4. **response对象**(`javax.servlet.ServletResponse`): - ...

    JSP从入门到精通.pdf

    - `request.getParameterMap()` 获取所有表单字段及其值的映射。 - **3.1.6 表格** - 使用 `request.setAttribute("key", "value")` 设置属性以供后续使用。 - **3.2 response对象** - 用于向客户端发送响应。 ...

Global site tag (gtag.js) - Google Analytics