`
jolestar
  • 浏览: 195455 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2 checkboxlist 的一个问题

    博客分类:
  • java
阅读更多

用struts2的checkboxlist遇到一个问题。

 

   下面是java对象。

package cn.jolestar.struts;

/**
 * @author jolestar
 * 
 */
public class Language {

	private Long id;
	private String name;

	/**
	 * 
	 */
	public Language() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Language other = (Language) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}

    

    

package cn.jolestar.struts;

import java.util.List;

/**
 * @author jolestar
 *
 */
public class Album {

	private Long id;
	private String name;
	private List<Language> languages;
	/**
	 * 
	 */
	public Album() {
	}
	public List<Language> getLanguages() {
		return languages;
	}
	public void setLanguages(List<Language> languages) {
		this.languages = languages;
	}
	
}

 

 

下面是jsp标签:

 

<s:checkboxlist  name="album.languages" list="languages" listValue="name" listKey="id" >
</s:checkboxlist>
 

 

action中有个getLanguages()方法,返回数据库中的所有语言。按道理我编辑Album的时候,checkboxlist中Album的已经拥有的语言会自动选中。但怎么弄,它就是不选中。没办法,看了一下struts2的相关源码,才明白了。

 

struts2 checkboxlist 的freemarker模板:

<#assign itemCount = 0/>
<#if parameters.list?exists>
    <@s.iterator value="parameters.list">
        <#assign itemCount = itemCount + 1/>
        <#if parameters.listKey?exists>
            <#assign itemKey = stack.findValue(parameters.listKey)/>
        <#else>
            <#assign itemKey = stack.findValue('top')/>
        </#if>
        <#if parameters.listValue?exists>
            <#assign itemValue = stack.findString(parameters.listValue)/>
        <#else>
            <#assign itemValue = stack.findString('top')/>
        </#if>
<#assign itemKeyStr=itemKey.toString() />
<input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}"<#rt/>
        <#if tag.contains(parameters.nameValue, itemKey)>
 checked="checked"<#rt/>
        </#if>
        <#if parameters.disabled?default(false)>
 disabled="disabled"<#rt/>
        </#if>
        <#if parameters.title?exists>
 title="${parameters.title?html}"<#rt/>
        </#if>
        <#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
        <#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
/>
<label for="${parameters.name?html}-${itemCount}" class="checkboxLabel">${itemValue?html}</label>
    </@s.iterator>
<#else>
   
</#if>
 

 

if tag.contains(parameters.nameValue, itemKey)这个if语句决定该checkbox是否选中。tag.contains()最终调用的是org.apache.struts2.util.ContainUtil中的这个方法:

 

 

   public static boolean contains(Object obj1, Object obj2) {
        if ((obj1 == null) || (obj2 == null)) {
            //log.debug("obj1 or obj2 are null.");
            return false;
        }

        if (obj1 instanceof Map) {
            if (((Map) obj1).containsKey(obj2)) {
                //log.debug("obj1 is a map and contains obj2");
                return true;
            }
        } else if (obj1 instanceof Collection) {
            if (((Collection) obj1).contains(obj2) || ((Collection) obj1).contains(obj2.toString())) {
                //log.debug("obj1 is a collection and contains obj2");
                return true;
            }
        } else if (obj1.getClass().isArray()) {
            for (int i = 0; i < Array.getLength(obj1); i++) {
                Object value = null;
                value = Array.get(obj1, i);

                if (value.equals(obj2)) {
                    //log.debug("obj1 is an array and contains obj2");
                    return true;
                }
            }
        } else if (obj1.toString().equals(obj2.toString())) {
            //log.debug("obj1 is an object and it's String representation equals obj2's String representation.");
            return true;
        } else if (obj1.equals(obj2)) {
            //log.debug("obj1 is an object and equals obj2");
            return true;
        }

        //log.debug("obj1 does not contain obj2: " + obj1 + ", " + obj2);
        return false;
    }

 

tag.contains(parameters.nameValue, itemKey)的参数parameters.nameValue是該标签的值,在这里就是album.languages, parameters.list 是languages,itemKey是循环中的当前language的id。album.languages包含的是Language对象,而struts2却在其中查找itemKey--就是Language的id,当然就无法查找到,所以不能自动选中。

 

我把checkboxlist的模板改了一下。

 

<#assign itemCount = 0/>
<#if parameters.list?exists>
   <@s.iterator value="parameters.list" id="it">
        <#assign itemCount = itemCount + 1/>
        <#if parameters.listKey?exists>
            <#assign itemKey = stack.findValue(parameters.listKey)/>
        <#else>
            <#assign itemKey = stack.findValue('top')/>
        </#if>
        <#if parameters.listValue?exists>
            <#assign itemValue = stack.findString(parameters.listValue)/>
        <#else>
            <#assign itemValue = stack.findString('top')/>
        </#if>
<#assign itemKeyStr=itemKey.toString() />
<input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}"<#rt/>
        <#if tag.contains(parameters.nameValue,it)>
 checked="checked"<#rt/>
        </#if>
        <#if parameters.disabled?default(false)>
 disabled="disabled"<#rt/>
        </#if>
        <#if parameters.title?exists>
 title="${parameters.title?html}"<#rt/>
        </#if>
        <#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
        <#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
/>
<label for="${parameters.name?html}-${itemCount}" class="checkboxLabel">${itemValue?html}</label>
	</@s.iterator>
<#else>
   
</#if>

 就是将tag.contains(parameters.nameValue, itemKey)改成了tag.contains(parameters.nameValue,it),it就是当前循环的Language对象,在struts2的iterator 标签里设置

<@s.iterator value="parameters.list" id="it">.(注意:如果是最新版的struts2,应该用var 而不是id).

 

这样就好了。需要注意的是language必须正确overwrite  equals和hashCode方法。

 

分享到:
评论
2 楼 poincare 2010-11-18  
  换行呢?
1 楼 muqingren 2010-01-13  

相关推荐

    freemarker初探 附 freemarker中文手册 与 struts2 checkboxlist的研究

    freemarker初探 附 freemarker中文手册 与 struts2 checkboxlist的研究 入门适用!

    (原创)struts标签之checkboxlist选中值并换行处理

    (原创)struts标签之checkboxlist选中值并换行处理

    struts2对于checkboxlist的换行

    NULL 博文链接:https://xueyue.iteye.com/blog/1158510

    巧用struts标签之checkboxlist选中默认值换行处理

    巧用struts标签之checkboxlist选中默认值换行处理

    struts2的checkboxlist标签换行

    NULL 博文链接:https://simle-google.iteye.com/blog/586373

    struts2标签chekboxlist实现竖排代码

    实现struts2标签chekboxlist竖排; 可以实现checkboslist横向放置个数(自行修改)

    配置Struts 2开发环境,了解和熟悉Struts 2的开发流程、了解和熟悉Struts2标签的使用方法.rar

    5.掌握常用标签textfield、radio、paaaword、checkboxlist、select、data的使用方法,实现页面与Action的交互操作 6.要求在创建过程中,包的名称要体现班级和学号,项目名称不需要按照实验手册中书写。在做的过程中...

    Struts2标签库

    &lt;%@ taglib uri="/struts-tags" prefix="s" %&gt; 结合例子,重点掌握以下标签的用法 (1) (2) (3) &lt;s:if&gt; 、、 (4) (5) (6) 、 (7) 、、&lt;s:checkbox&gt;、 (8) 、、&lt;s:checkboxlist&gt;

    用struts2 实现注册

    用struts2实现用户的注册,涉及到的知识点包括用户名和密码的校验(正则表达式验证);国际化;radio,checkboxlist,optiontransferselect等标签的使用,文件的上传等。

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

    Struts2 批量接收页面 checkbox 或对象数据 源码(有图有真相)

    前台checkbox提交的数据,Struts2在后台自动封装成数组/List。 but 前台向后台批量提交对象数据,struts2就显得力不从心了,本案例着重介绍,批量向后台提交对象数据,源码,有图有真相哦! 欢迎交流、吐槽、指导...

    struts2 标签库 帮助文档

    checkboxlist标签:根据一个集合属性创建一系列的复选框。 combobox标签:生成一个单选文本框和一个下拉列表框的组合。 doubleselect标签:生成一个相互关联的列表框,该标签由两个下拉选择框组成。 ...

    Struts 2 Form Tags

    In this tutorial we'll explore some of the other Struts 2 form controls. In our previous ... This tutorial will explore using the Struts 2 select, radio, checkbox, and checkboxlist form controls.

    struts2.5+框架使用通配符与动态方法常见问题小结

    主要介绍了struts2.5+框架使用通配符与动态方法常见问题 ,在文中给大家提到了Struts2.5框架使用通配符指定方法 ,需要的朋友可以参考下

    customcheckboxlist.ftl

    解决struts2里checkboxlist 换行 在struts核心jar包下的template里创建custom文件夹。把该文件放到custom下。替换工程里的jar文件。解决问题。 &lt;s:checkboxlist list="perList" theme="custom" template=...

    struts2标签大全

    &lt;s:checkboxlist list=""&gt;&lt;/s:checkboxlist&gt;-----多选框 &lt;s:combobox list=""&gt;&lt;/s:combobox&gt;-----下拉框 &lt;s:component&gt;&lt;/s:component&gt;-----图像符号 D: &lt;s:date/&gt;-----获取日期格式 &lt;s:datetimepicker&gt;&lt;/s:...

    Struts2标签库的所有

    &lt;%@ taglib uri="/struts-tags" prefix="s" %&gt; 结合例子,重点掌握以下标签的用法 (1) (2) (3) &lt;s:if&gt; 、、 (4) (5) (6) 、 (7) 、、&lt;s:checkbox&gt;、 (8) 、、&lt;s:checkboxlist&gt;

    JSP_struts2标签大全

    8.checkboxlist 8 9. combobox 9 10. conponent 9 11. date 11 12. datetimepicker 12 13. debug 12 14. div 12 15. doubleselect 13 16. else 15 17. elseif 15 18. fielderror 16 19. file 16 21. generator 17 22...

Global site tag (gtag.js) - Google Analytics