问一个关于struts中的action里的问题

在struts的action里面,
通常我们使用HttpServletRequest request的方法
request.getParameterValues来得到JSP页面中的多选.

我想问一下,request.getParameterNames();可以得到页面JSP中所有的字段,杂个知道每一个在页面是单选,还是多选,还是text还是......?

就是HttpServletRequest 包装了页面中控件类型的信息了吗?

或者从ActionForm里得到也行...

其实这个问题不用你操心的,你用了struts的话,Struts专门有这样的拦截器去封装你的页面提交的参数值,比如说Checkbox吧,就有CheckBoxInterceptor这样的拦截器,专门封装,用的都是Map,你可以借鉴一下,引用[quote]有Servlet API 可以看出,如果你不知道 这个元素对应的 单个值还是集合值的话, 你可以统一使用 getParameterValues 来获取元素的对应内容

[/quote]

从HTTP报文的实体部分考虑。

HTTP传送的是 key=vlaue的数据。其中,key是Form元素的名称,value是这个元素的值。

没有关于 form元素类型的说明。所以不能得到除key 、value外的额外信息。

这个就是由http协议来定义的

HttpServletRequest只是解析符合http协议的消息头和内容体

[b][size=medium]
String[] getParameterValues(String name)[/size]

Returns an array of String objects containing all of the values the given request parameter has, or null if the parameter does not exist.
If the parameter has a single value, the array has a length of 1. [/b]
[color=blue][b]
有Servlet API 可以看出,如果你不知道 这个元素对应的 单个值还是集合值的话, 你可以统一使用 getParameterValues 来获取元素的对应内容[/b][/color]

[quote]我想问一下,request.getParameterNames();可以得到页面JSP中所有的字段,杂个知道每一个在页面是单选,还是多选,还是text还是......? [/quote]

UI层区分了单选和多选,但是发送http请求的时候,应该就没有这个信息了。

比如:

  • 如果是text, 就是一个 name=value传到服务器
  • 如果是单选, 就是有一个 radioname=value传到服务器,value是各个radio中你选中的radio的值
  • 如果是多选,就是有多个 chkname=value1&chkname=value3 传到服务器

总之,传到服务器,应该不知道你传过来的是单选还是多选,那时UI的事情,你只能通过参数进行判断。

[b]样例如下:[/b]

[b]name=Hello&duoxuan=b&duoxuan=c[/b]
[b]
如果是多个选项同一个名字的话,这在HTTP报文的实体部分,该选项是key=value1&key=valu2的方式,连续出现!...[/b]

知道有这个方法request.getParameterValues("paramName");
但是好象没有request.getParameterValues();
如果你知道表单参数名字为什么不直接用参数名取获取那?如果不知道你可以先获取参数名,然后再根据参数名一个一个去获取所有参数的值,你可以全部使用request.getParameterValues("paramName");方法,如果有多个值,那么肯定是复选,单个值那么就是单选或者输入框之类了

[b]
难到 要给前台每一个字段,加上一个隐藏字段,来说明 某个Form元素的类型?(最好不要吧?)

你以前写的已经很不错了![/b]

这一层都被http协议屏蔽掉了,单纯想从请求参数来判断是不太可能的,

只有你自己定义一些规则,比如名字前缀或后缀之类的,

[quote]而页面的多选经常变.[/quote]
不管怎么变,提交表单的时候肯定是固定的,可以再提交表单的时候调用一个JS;
处理这个checkbox,不一定非要在后台处理

你用不同的名字区分,标识是多选还是单选。
比如含有single字符的是单选,含有mutil字符的是多选。
[code="java"]Enumeration names = request.getParameterNames();
foreach(String str names){
if(str.contains("single")){
//处理单选
}else if(str.contains("mutil")){
//处理多选
}
}
[/code]

[quote]我为会径流选择使用js呢. [/quote]这里不需要使用到任何javascript~~

[code="java"]
String[] values = request.getParameterValues(fieldName);
StringBuffer fieldValue = new StringBuffer();
int cx = 0;
for (String string : values) {
cx++;
if (1 == cx)
fieldValue.append(string);
else
fieldValue.append("|" + string);
} [/code]

改成这样试试:

[code="java"]
String[] values = request.getParameterValues(fieldName);
// 得出的结果可能和你“|”分开的样式不一样。但是比较方便。
String fieldValue = Arrays.toString(values);

[/code]

[quote]因为,我认为js往往是有BUG时,某一行出问题后,后面的代码就都不运行了... [/quote]

用用jquery