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



本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/283477,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值