【struts2】前端页面上多个name相同的input text,在action中的获取方式20 比如页面上有



【struts2】前端页面上多个name相同的input text,在action中的获取方式20
比如页面上有

<input type=”text” name=”kp” />
<input type=”text” name=”kp” />
<input type=”text” name=”kp” />

页面被提交后,在后台action用List<String> kp = new ArrayList<String>(); 就可以得到3个input的值了

我知道同名checkbox可以用系统自带的拦截checkbox的拦截器拦截获得选中的值,但是多个name相同的input text是怎么在后台得到的数据,是什么原理?是param拦截器来做这个事吗?有谁能给讲解下原理吗?谢谢
问题补充:
cwx714 写道
这是依赖于ValueStack对象为相应的Action属性赋值。ValueStack对象贯穿整个Action的生命周期。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点。所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。
在使用值栈时,我们无须关心目标对象的作用域。如果要使用名为“kp”的属性,直接从值栈中进行查询就可以了。值栈中的每一个元素,都会按照排列顺序依次检查是否拥有该属性。如果有的话,那么就返回对应的值,查询结束。如果没有的话,那么下一个元素就会被访问,直到到达值栈的末尾。这个功能非常强大,我们根本不需要知道所需要的值在什么地方(存在于Action,模型或是HTTP请求中)只要这个值存在,它就会被返回。

 

系统自带的params拦截器会将请求的参数放到ValueStack中的,对于一般的单个参数,如果有对应名字的action中属性,就会在类型转换后通过反射调用setter方法放到参数中。

我这里想知道的是同名的多个参数,会被自动的放置在List或者数组中,我想知道是怎么实现的,因为取一个参数和取多个同名的参数是不同的方法:
一个是request.getParameter
一个是request.getParameterValues

所以猜测会有一个其他的方式来实现的,或者params内部有不同的分支来执行的,但我没找到,所以想问下有谁知道原理的
Struts
2010年5月08日 22:54 djj2007 djj2007
0
0 0 2

Comment添加评论关注(0)
3个答案 按时间排序 按投票排序

0
0
采纳的答案
引用
我这里想知道的是同名的多个参数,会被自动的放置在List或者数组中,我想知道是怎么实现的,因为取一个参数和取多个同名的参数是不同的方法:
一个是request.getParameter
一个是request.getParameterValues
先解释一下:

Struts或则XWorlk提供的Interceptor,操作的是已经被封装好的Parameters的Map了。相信你应该看到过这句话。(在CheckboxInterceptor中有)

Java代码 收藏代码
Map parameters = ai.getInvocationContext().getParameters();

 

关于你的问题:


如果你说的是,同名的多个参数如何以List或者数组的方式,放在Parameter的Map中。

这个应该是属于Servlet规范中的内容。在HTTP协议的Request传递到ServletContainer中后,Container就会为该次请求生成一个HTTPServletRequest对象,在HTTPServletRequest对象中,参数和值,放入到了Map中。

在Tomcat的实现代码中,可以看到,同名的参数的值,被加入的String数组中。单个的参数,也是放在数组中的。
Java代码 收藏代码

/**
* Put name and value pair in map. When name already exist, add value
* to array of values.
*
* @param map The map to populate
* @param name The parameter name
* @param value The parameter value
*/
private static void putMapEntry( Map map, String name, String value) {
String[] newValues = null;
String[] oldValues = (String[]) map.get(name);
if (oldValues == null) {
newValues = new String[1];
newValues[0] = value;
} else {
newValues = new String[oldValues.length + 1];
System.arraycopy(oldValues, 0, newValues, 0, oldValues.length);
newValues[oldValues.length] = value;
}
map.put(name, newValues);
}
引用
因为取一个参数和取多个同名的参数是不同的方法:
一个是request.getParameter
一个是request.getParameterValues

都可以使用request.getParameterValues的方法,通过循环来得到值、或者赋值。
如果你说的是,同名的多个参数如何以List或者数组的方式,放在Action中。

那就需要看Struts的OGNL实现的源码,Interceptor只是将值转移到ValueStatck上,而后由ONGL进行赋值的。
总结:你在Interceptor中是看不到你期望的判断语句的。因为,封装的判断语句在Servlet的容器中实现;解封装的语句,在struts2的OGNL中实现。Interceptor只是对其中值,稍微做些处理

 

 

2010年5月09日 08:40xiaolongfeixiang xiaolongfeixiang
3000
0 0 2
Comment添加评论
0
0
这是依赖于ValueStack对象为相应的Action属性赋值。ValueStack对象贯穿整个Action的生命周期。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点。所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。
在使用值栈时,我们无须关心目标对象的作用域。如果要使用名为“kp”的属性,直接从值栈中进行查询就可以了。值栈中的每一个元素,都会按照排列顺序依次检查是否拥有该属性。如果有的话,那么就返回对应的值,查询结束。如果没有的话,那么下一个元素就会被访问,直到到达值栈的末尾。这个功能非常强大,我们根本不需要知道所需要的值在什么地方(存在于Action,模型或是HTTP请求中)只要这个值存在,它就会被返回。

2010年5月08日 23:17cwx714 cwx714
2
0 0 5
Comment添加评论
0
0
checkbox拦截器? 好像没有这种东西吧!前后端是通过http协议传输的, 后端接收到的就是一堆键值对,web容器会将同名的参数映射为一个List对象,然后struts映射到action的kp对象

2010年5月08日 23:09chemzqm chemzqm
1110
0 0 0

 

 

http://www.iteye.com/problems/41857