如果键是非标准对象,则 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;

}

正如我在 Whosebug 上的许多其他帖子中读到的那样 here,or here 在 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=two,abstractProductTypeName=type2,qualificationsCount=2,customersCount=2,qualificationDueDate=Thu Jun 11 14:47:37 CEST 2015,id=,version=,created=,modified=] and value is:

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=] and value is:

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

因此该值始终为空。

但是如果我像这样使用 HashMap 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;

}

结果是:

two and value is: [Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015]

one and value is: [Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015]

three and value is: [Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015, Thu Jun 11 14:54:22 CEST 2015]

使用非标准对象作为键有什么不同???

在您更改问题时更新答案。

如果您想使用自定义对象作为 HashMap 中的键,您必须重写自定义对象中的 hashCode()equals() 方法。 here 是如何做到这一点的例子。


jsp 中检查列表大小的上一个答案(原始问题。)

尝试使用 ${fn:length(myItem.value)} 检查列表大小。为此,在您的 jsp

中添加 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

EL 适用于 getter 和 setter。如果您正在执行 list.size,它会在 List 对象上寻找方法 list.getSize(),但该方法不存在。它有 list.size() 代替。所以我们必须使用这个 jstl 函数来检索列表的大小。

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

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>