我用的struts得版本是1.3。现在简单的把在开发过程中遇到的问题描述一下。相信,开发的朋友可能遇到过和我类似的苦恼吧。
场景是这样子的。比如有这么一个字段【兴趣】。该字段是多选框,且多选框的内容是从数据库中读取的。actionform 中对应的是String类型。问题就出在这里,我们是可以选择多选的,但是不知道为什么struts checkbox标签只能得到第一个选项。其他的都忽略了。简单的描述一下,就是不管我在前台选择几种【兴趣】,struts 只能得到一个【兴趣】。多选,变成了“名副其实”的单选radio了,毫无意义。在以前的开发过程时候,我都放弃了使用struts提供的标签。
当然,这个问题可以换另外一种方式解决。 就是将“兴趣”对应的类型,换成 字符串数组类型。情况是这样子的。这时候数据是可以正常得到了。但是我们使用struts标签的很大原因,是自带的默认选中功能。算了,个人口才不怎么地,还是结合例子解释一下。就是我已经选中了“读书,看报”2个兴趣了。这时候,从action跳转的时候,是可以初始化选中的。这个功能确实本人比较喜欢的。但是如果使用字符串数组 对应 checkbox 就“放弃”了 初始化选中这个功能了。
struts chebox 标签真是 一个大大的“鸡肋”啊。所以,把struts html 标签简单的研究了一下。总之,我想要的效果得到了,不知道是不是这样子解决的,是不是合格,规范.
下面是我得JAVA代码
package com.randy.tag;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.taglib.TagUtils;
import org.apache.struts.taglib.html.CheckboxTag;
import org.apache.struts.taglib.html.Constants;
import org.apache.struts.taglib.html.OptionsTag;
import org.apache.struts.taglib.html.SelectTag;
import org.apache.struts.util.IteratorAdapter;
public class CheckboxsTag extends CheckboxTag {
protected boolean isChecked() throws JspException {
Object result =
TagUtils.getInstance().lookup(pageContext, name, property, null);
if (result == null) {
result = "";
}
boolean isarr = result instanceof Object[];
String[] arr = null;
String checked = "";
System.out.println( "result:"+result);
if(isarr){
System.out.println( "数组处理");
String[] temp = (String[])result;
arr = temp[0].split( ",");
System.out.println( "arr的长度:"+arr.length);
} else{
System.out.println( "字符串处理");
result = result.toString();
checked = (String) result;
arr= result.toString().split( ",");
}
for( int i=0;i<arr.length;i++){
if(arr[i].equals( this.value)){
System.out.println( "我加了自己的判断");
return true;
}
}
return (
checked.equalsIgnoreCase( this.value)
|| checked.equalsIgnoreCase( "true")
|| checked.equalsIgnoreCase( "yes")
|| checked.equalsIgnoreCase( "on"));
}
}
就是继承Struts 的Checkbox Tag 类,然后客制化了isChecked()方法。
然后修改struts_html.tld文件。
下面是我测试的Action代码
package com.randy.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.ActionDispatcher;
import org.apache.struts.actions.DispatchAction;
import com.randy.tag.ResnodesVO;
public class RegisterAction extends DispatchAction {
private ActionDispatcher dispatcher = new ActionDispatcher( this,
ActionDispatcher.DISPATCH_FLAVOR);
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println( "execute() 执行了");
return dispatcher.execute(mapping, form, request, response);
}
public ActionForward toupdate(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println( "RegisterAction toupdate 方法------------");
RegActionForm regform = (RegActionForm) form;
regform.setSelect( "01");
String str2 = "00,01";
regform.setCheckbox2(str2);
String[] array = { "00,01"};
regform.setCheckbox1(array);
request.setAttribute( "checkboxlist", getCheckboxlist());
regform.setCheckbox2( "01,02");
request.setAttribute( "selectlist", getSelectlist());
return mapping.findForward( "success");
}
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
RegActionForm regform = (RegActionForm) form;
System.out.println( "RegisterAction update 方法------------");
System.out.println( "regform.checkbox2:"+regform.getCheckbox2());
System.out.println( "---------------");
String[] strs =request.getParameterValues( "checkbox2");
System.out.println( "提交的数据:"+array2string(strs));
System.out.println( "提交的数据checobox1:"+regform.getCheckbox1().length);
return null;
}
private String array2string(String[] arr){
StringBuffer sb = new StringBuffer();
for( int i=0;i<arr.length;i++){
if(i == arr.length-1){
sb.append(arr[i]);
} else{
sb.append(arr[i]).append( ",");
}
}
return sb.toString();
}
public List<Map<String, String>> getSelectlist() {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put( "key", "00");
map1.put( "value", "select0");
list.add(map1);
Map<String, String> map2 = new HashMap<String, String>();
map2.put( "key", "01");
map2.put( "value", "select1");
list.add(map2);
Map<String, String> map3 = new HashMap<String, String>();
map3.put( "key", "02");
map3.put( "value", "select2");
list.add(map3);
return list;
}
public List<Map<String, String>> getCheckboxlist() {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put( "key", "00");
map1.put( "value", "checkbox0");
list.add(map1);
Map<String, String> map2 = new HashMap<String, String>();
map2.put( "key", "01");
map2.put( "value", "checkbox1");
list.add(map2);
Map<String, String> map3 = new HashMap<String, String>();
map3.put( "key", "02");
map3.put( "value", "checkbox2");
list.add(map3);
return list;
}
public void test() {
List<ResnodesVO> nodelist = new ArrayList<ResnodesVO>();
ResnodesVO vo1 = new ResnodesVO();
vo1.setId( "01");
vo1.setName( "value1");
nodelist.add(vo1);
ResnodesVO vo2 = new ResnodesVO();
vo2.setId( "01");
vo2.setName( "value1");
nodelist.add(vo2);
}
}
主要是toupdate() 和update() 方法。toupdate 是跳转到【修改JSP页面】,在该函数里,我故意为checkbox 标签设定默认的值。 update 就是获取数据,并处理业务逻辑。
下面是对应的jsp 页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
< %@ page isELIgnored ="false"% >
< %@taglib prefix ="html" uri ="/WEB-INF/struts-html.tld" % >
< %@taglib prefix ="logic" uri ="/WEB-INF/struts-logic.tld" % >
< %@taglib prefix ="bean" uri ="/WEB-INF/struts-bean.tld" % >
< !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html:html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< title >Insert title here </title>
</head>
< body >
< html:form action ="/register" method ="post" >
< input type ="hidden" name ="method" value ="update" >
< table >
< tr >
< td >
checkbox1:
</td>
< td >
< logic:iterate id ="ch" name ="checkboxlist" >
< html:checkbox property ="checkbox1" value ='${ch.key}' >
< bean:write name ="ch" property ="value" />
</html:checkbox>
</logic:iterate>
</td>
</tr>
< ! -- 显式注释 -- >
< tr >
< td >
checkbox2:
</td>
< td >
< logic:iterate id ="ch" name ="checkboxlist" >
< html:checkbox property ="checkbox2" value ='${ch.key}' >
< bean:write name ="ch" property ="value" />
</html:checkbox>
</logic:iterate>
</td>
</tr>
< tr >
< td colspan ="2" >
< html:submit >submit </html:submit>
</td>
</tr>
</table>
</html:form>
</body>
</html:html>
经测试,效果是我需要的。可能是本人考虑问题不全面,尚且存在很多问题。
如果你发现代码存在问题,请留言交流。欢迎批评指点。