关于Struts2.5版本的ActionContext.getContext().getParameter()的返回值的问题
最近, 我开始学习struts2了, 有点小激动, 毕竟开始学新知识了, 然后自然而然就碰到了一些问题, 就比如标题上说的
我们要获取请求参数对应的Map时,在struts2.3中是这样的
Map<String, Object> parameters = ActionContext.getContext().getParameters();
题外话
讲句题外话, getParameter() 这个方法返回的是一个 Map<String, Object> 对象, 但我一直在想返回一个 Map<String, String[]> 对象是不是看起来更加好一点, 我相信很多人(尤其是初学者), 在获取这个Map<String, Object>对象之后, 打印其中的请求参数时, 直接有意无意的就把这个Object对象当成了String对象了
比如, 我转发一个请求
http:localhost:8080/struts2_war_exploded/TestActionContext.action?name=DeepClouds
我们想获取这个请求里的name参数, 那么有的人就直接这样写
Map<String, Object> parameters = ActionContext.getContext().getParameters();
System.out.println(parameters.get("name"));// 错误
然后打印值就是[Ljava.lang.String@地址值], 而不是预期的"DeepClouds"
有的人不理解为什么不是String, 举个例子, 还是转发一个请求
http:localhost:8080/struts2_war_exploded/TestActionContext.action?name=Deep&name=Clouds
这个时候, 一个String怎么装两个name?所以肯定是String[]
可能有大佬看我这篇文章, 千万别喷我😂, 我也还在学习中, 不过你要是知道为什么返回Object而不是String[]的话, 请告诉我一下, 谢谢哥哥姐姐弟弟妹妹🙂
正文来了
返回正题, 我要说的是, 这样写👇
Map<String, Object> parameters = ActionContext.getContext().getParameters();
在用struts2.5时是会报错的, 编译时就会报错!!!
在struts2.5中, getParameters()这个方法返回值是一个HttpParameters对象, 这个类是实现Map<String, parameter> 的, 所以有的人可能会说了, 那为什么会报错呢?不是可以向上类型转换吗?
其实这个HttpParameters对象还实现了Cloneable接口, 当时给我想了半天, 上百度查也没查出个所以然来(可能是我太菜了😭), 后来看了源码才发现的
那么怎么用呢?还是这个请求
http:localhost:8080/struts2_war_exploded/TestActionContext.action?name=Deep&name=Clouds
HttpParameters parameters = ActionContext.getContext().getParameters();
Parameter parameter = parameters.get("name");
System.out.println(parameter.isMultiple());// true
System.out.println(parameter.getValue());// Deep
System.out.println(Arrays.toString(parameter.getMultipleValues()));// [Deep, Clouds]
例举其中的几个方法
- 1.isMultiple(): 判断这个parameter对象里是否有多个对应的value
- 2.getValue(): 得到parameter里的第一个value
- 3.getMultipleValues(): 得到装有全部value的一个String数组