繁体   English   中英

如果键是非标准对象,则JSF中的HashMap不会显示该值

[英]HashMap in JSF not showing the value if the key is a non standard Object

我有一个看起来像这样的HashMap:

HashMap<QualifiedProduct,List<Date>

所以我的java代码看起来像这样:

@Name("testController")
@AutoCreate
public class TestController {
public HashMap<QualifiedProduct, List<Date>> createAndReturnHashmap(){

    HashMap<QualifiedProduct, List<Date>> hm = new HashMap<QualifiedProduct, List<Date>>();

    QualifiedProduct q1= new QualifiedProduct();
    q1.setAbstractProductId(1);
    q1.setAbstractProductCode("1-1");
    q1.setAbstractProductName("one");
    q1.setAbstractProductTypeName("type1");
    q1.setCustomersCount(1);
    q1.setQualificationDueDate(new Date());
    q1.setQualificationsCount(1);

    QualifiedProduct q2= new QualifiedProduct();
    q2.setAbstractProductId(2);
    q2.setAbstractProductCode("2-2");
    q2.setAbstractProductName("two");
    q2.setAbstractProductTypeName("type2");
    q2.setCustomersCount(2);
    q2.setQualificationDueDate(new Date());
    q2.setQualificationsCount(2);

    QualifiedProduct q3= new QualifiedProduct();
    q3.setAbstractProductId(3);
    q3.setAbstractProductCode("3-3");
    q3.setAbstractProductName("three");
    q3.setAbstractProductTypeName("type3");
    q3.setCustomersCount(3);
    q3.setQualificationDueDate(new Date());
    q3.setQualificationsCount(3);



    List<Date> dt = new ArrayList<Date>();
    Date d1 = new Date();
    Date d2 = new Date();
    Date d3 = new Date();
    dt.add(d1);
    dt.add(d2);
    dt.add(d3);
    hm.put(q1, dt);
    hm.put(q2, dt);
    hm.put(q3, dt);

    return hm;

}

正如我在stackoverflow上阅读的许多其他文章一样,或者 这里 ,在JSF 1.2中显示它的最好方法是使用良好的旧jsp标记<c:forEach

所以我用我的代码:

xmlns:c="http://java.sun.com/jstl/core"
.....
<c:forEach var="hm" items="${testController.createAndReturnHashmap()}">
  ${hm.key} <br/>
  and value is:  ${hm.value} <br/><br/>
</c:forEach>

JSF输出为:

com.dw.model.QualifiedProduct@15d97b65 [abstractProductId = 2,abstractProductCode = 2-2,abstractProductName = 2,abstractProductTypeName = type2,qualificationsCount = 2,customersCount = 2,qualificationDueDate = Thu Jun 11 14:47:37 CEST 2015,id =,version =,created =,modified =],其值为:

com.dw.model.QualifiedProduct@2393366a [abstractProductId = 1,abstractProductCode = 1-1,abstractProductName = one,abstractProductTypeName = type1,qualificationsCount = 1,customersCount = 1,qualificationDueDate = Thu Jun 11 14:47:37 CEST 2015,id =,version =,created =,modified =],其值为:

com.dw.model.QualifiedProduct@79342f17 [abstractProductId = 3,abstractProductCode = 3-3,abstractProductName = 3,abstractProductTypeName = type3,qualificationsCount = 3,customersCount = 3,qualificationDueDate = Thu Jun 11 14:47:37 CEST 2015,id =,version =,created =,modified =],其值为:

因此,该值始终为空。

但是如果我使用像这样的HashMap<String,List<Date>>一切正常:

public HashMap<String, List<Date>> createAndReturnHashmap(){

    HashMap<String, List<Date>> hm = new HashMap<String, List<Date>>();

    List<Date> dt = new ArrayList<Date>();
    Date d1 = new Date();
    Date d2 = new Date();
    Date d3 = new Date();
    dt.add(d1);
    dt.add(d2);
    dt.add(d3);
    hm.put("one", dt);
    hm.put("two", dt);
    hm.put("three",dt);

    return hm;

}

结果是:

两个,值是:[2015年6月11日星期四,2015年6月11日星期四14:54:22 CEST,2015年6月11日星期四14:54:22]

一个值是:[CEST 2015年6月11日星期四,CEST 2015年6月11日星期四14:54:22,CEST 2015年6月11日星期四14:54:22]

三,值是:[2015年6月11日星期四,2015年6月11日星期四14:54:22,2015年6月11日星期四14:54:22]

使用非标准对象作为键的区别在哪里???

更改问题时更新答案。

如果要将自定义对象用作HashMap键,则必须在自定义对象中重写hashCode()equals()方法。 是如何做的例子。


检查jsp中列表大小的先前答案(原始问题。)

尝试使用${fn:length(myItem.value)}检查列表大小。 为此,请在您的jsp中添加<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

EL在吸气剂和吸气剂上工作。 如果正在执行list.size ,它将在List对象上查找方法list.getSize() ,该方法不存在。 它有list.size()代替。 因此,我们必须使用此jstl函数来检索列表的大小。

据我所知,forEach不适用于非Java标准对象。 最好是做一个包装课

public class QualificationProductWithListOfOrderingMailingDate {

    private HashMap<QualifiedProduct,List<Date>> qualificationProductWithListOfOrderingMailingDate;

    public HashMap<QualifiedProduct,List<Date>> getQualificationProductWithListOfOrderingMailingDate() {
        return qualificationProductWithListOfOrderingMailingDate;
    }

    public void setQualificationProductWithListOfOrderingMailingDate(
            HashMap<QualifiedProduct,List<Date>> qualificationProductWithListOfOrderingMailingDate) {
        this.qualificationProductWithListOfOrderingMailingDate = qualificationProductWithListOfOrderingMailingDate;
    } 

}

遍历每个产品完全没有问题:

<ui:repeat var="x" value="#{testController.createAndReturnHashmap()}">
    #{x.qualifiedProduct.abstractProductId},#{x.qualifiedProduct.abstractProductCode}

    <ui:repeat var="dt" value="#{x.dates}">
            #{dt}
    </ui:repeat>

</ui:repeat>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM