`

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

    getParameter()获得的是String类型,多个参数名相同默认获取第一个getParameterValues()获得的是数组,多个参数名相同时,值在同

    作业getParameterMap()

    作业getParameterMap()的显示

    java修改请求参数

    可以动态修改表达提交参数,使之修改request.getParameterMap(),不报异常。

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

    今天跟大家分享几个解决java Web开发中,request.getParameter()获取URL中文参数乱码的解决办法,需要的朋友可以参考下

    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...

    reqresp_demo 2.zip

    请求对象 request 和响应对象 response(5)_request 的 getParameterMap 方法详解

    根据数据库表自动产生javabean

    public class ObjectUtil { //public static Object request2Obj(HttpServletRequest request, Class clazz) { public static Object request2Obj(Request request, ... return request.getParameterMap(); } }

    pageDate封装参数,不用实体类

    Map properties = request.getParameterMap(); Map returnMap = new HashMap(); Iterator entries = properties.entrySet().iterator(); Entry entry; String name = ""; String value = ""; while ...

    window.open 函数的操作

    window.open 函数的操作 取出showModalDialog中传过来的数据对象 request.getParameterMap()相关的操作实例

    Struts2\constant应用

    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。 对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。 ...

    阿里云java短信验证码源码-tianjin_travel:黑马旅游网项目练习

    阿里云java短信验证码源码 黑马旅游网(web阶段...request.getParameterMap(); // 2.封装到User实体 new User(); // 3.调用service注册 userService.register(user); // 4.判断 if (getSuccess()) { // 注册成功 send

    springmybatis

    mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...

    Struts2属性文件详解

    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题.该属性的默认值是false.对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true. struts....

    j2ee中表单传值的所有方法

    j2ee利用getParameter()、getParameterValues()、getParameterMap()和getParameerNames()这些方法获得表单的传值!

    潇湘jsp多文件上传组件2.2

    修改的基础依赖于潇湘jsp多文件上传组件2.1。 由于最近几天正好用到上传组件,所以在网上...另外没有getParameterMap()方法。所以修改完善了这两个功能,其他没变。附件中有使用说明和demo,请大家根据实际情况使用。

Global site tag (gtag.js) - Google Analytics