客户化Struts标签checkbox

我用的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>
 
 
经测试,效果是我需要的。可能是本人考虑问题不全面,尚且存在很多问题。
如果你发现代码存在问题,请留言交流。欢迎批评指点。

你可能感兴趣的:(struts,职场,checkbox,休闲,客制化标签)