`
jolestar
  • 浏览: 197239 次
  • 性别: 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  

相关推荐

    struts2对于checkboxlist的换行

    `checkboxlist`在Struts2中通常与一个Action类中的属性关联,用于收集用户的多选数据。在HTML中,复选框默认是按行显示的,但为了优化用户界面,我们可能希望将它们分成多列显示,这就涉及到了换行。 `...

    struts2的checkboxlist标签换行

    在Struts2的标签库中,`&lt;s:checkboxlist&gt;`标签主要用于创建多个复选框,每个复选框对应一个值。这个标签接受多个参数,如`list`(用于指定选项的集合)、`name`(用于指定表单字段名)和`label`(用于指定每个选项的...

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

    Freemarker是一个强大的模板引擎,常用于Web应用中的视图层渲染,与Struts2等MVC框架结合使用。在本篇文章中,我们将探讨Freemarker的基础知识,并结合Struts2中的checkboxlist进行研究。 首先,让我们理解...

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

    为了更好地理解`&lt;s:checkboxlist&gt;` 标签的使用,我们首先定义一个简单的`CheckboxBean`实体类来存储每个复选框的ID和名称。 ```java public class CheckboxBean { private int id; private String name; public...

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

    在Struts框架中,`&lt;s:checkboxlist&gt;`是一个非常实用的标签,用于在HTML表单中创建一组复选框,通常用于用户选择多个选项。本文将深入探讨如何巧妙地处理`checkboxlist`的默认选中值以及实现换行显示。 首先,我们...

    strust2 checkboxlist

    CheckboxList是Struts2展示层的一个组件,用于处理用户多选数据。 2. **CheckboxList组件** CheckboxList组件允许用户从一组选项中选择一个或多个值。它通常与一个数组或集合绑定,每个选项对应数组或集合中的一个...

    struts2.0 checkbox标签使用问题

    在提供的压缩包文件`struts2_usermgr`中,可能包含了一个用户管理的示例项目,其中可能有使用`checkbox`标签的例子。通过查看这个项目,我们可以更深入地了解Struts2.0的`checkbox`标签在实际应用中的用法,包括但不...

    解决struts2的s:checkbox显示难看问题

    5. **标签嵌套**:`s:checkbox`可能与其他Struts2标签或者HTML元素一起使用,如`s:checkboxlist`。在这些组合中,可能出现位置、间距等显示问题。检查并修正嵌套结构,确保正确渲染。 6. **JavaScript和jQuery插件*...

    struts2标签chekboxlist实现竖排代码

    `checkboxlist`是Struts2标签库中的一个组件,用于显示一组可选的复选框。在默认情况下,这些复选框通常是横向排列的。然而,在某些设计需求下,可能需要将这些复选框以竖向方式展示。本篇将详细解释如何在Struts2中...

    struts2标签使用例子

    Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建企业级Java Web应用程序。在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化...

    Struts2案例翻译篇-Using Struts2 Tag

    Struts2是一个强大的Java web框架,它提供了丰富的功能来构建MVC(模型-视图-控制器)架构的应用程序。在Struts2中,Tag库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更方便地创建动态网页。本篇将...

    struts2-tags-API,struts2标签api

    Struts2是一个强大的Java web框架,它极大地简化了MVC(模型-视图-控制器)应用的开发。在Struts2框架中,标签库是其重要组成部分,它提供了丰富的标签来帮助开发者更方便地构建用户界面。`struts2-tags-API`就是...

    struts2(checkbox_radio_select)表单标签的应用及详细事例

    Struts2是一个强大的MVC框架,它提供了丰富的标签库,使得在JSP页面中处理表单数据变得简单。本文将详细介绍Struts2中用于处理复选框(checkbox)、单选按钮(radio)以及下拉选择框(select)的表单标签,并通过...

    struts2标签库

    对于那些已经熟悉Struts1的人来说,学习Struts2将是一个相对平滑的过程。Struts2标签库是其核心组件之一,它提供了丰富的前端界面构建工具,能够帮助开发者快速构建动态网页。下面将详细介绍Struts2标签库中的部分...

    struts1.x html标签 radio,checkbox,multibox,select的使用

    Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts1.x中,HTML标签库提供了一系列的定制化标签,简化了视图层的开发,比如`html:radio`, `html:checkbox`, `...

    struts2标签使用方法

    Struts2是一个强大的MVC框架,它极大地简化了Java Web应用程序的开发。在Struts2中,标签库是其核心特性之一,它提供了一系列预定义的JSP标签,用于简化视图层的编码,提高代码的可读性和可维护性。下面我们将详细...

    Struts2-2.3.24 Html帮助文档

    在开发过程中,Struts2-2.3.24的帮助文档是一个宝贵的资源,它提供了详细的API参考、示例代码以及常见问题解答。通过查阅这些文档,开发者可以更好地理解如何利用Struts2的特性,解决开发过程中遇到的问题,提升开发...

    Struts2之struts2标签库了解和使用案例struts025

    Struts2是一个强大的Java EE应用程序框架,用于构建和维护可扩展、模块化和易于管理的Web应用程序。在Struts2中,标签库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更加专注于业务逻辑而不是繁琐的...

Global site tag (gtag.js) - Google Analytics