简体   繁体   English

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

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

I have a HashMap which looks like this: 我有一个看起来像这样的HashMap:

HashMap<QualifiedProduct,List<Date>

so my java code looks like this: 所以我的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;

}

as i read in many other postings on stackoverflow like here ,or here the best way to show it in JSF 1.2 is using the good old jsp tag <c:forEach 正如我在stackoverflow上阅读的许多其他文章一样,或者 这里 ,在JSF 1.2中显示它的最好方法是使用良好的旧jsp标记<c:forEach

So i used in my code: 所以我用我的代码:

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>

The JSF output is: 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@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=] 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 =],其值为:

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: 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 =],其值为:

So the value is always empty. 因此,该值始终为空。

but if i use a HashMap like this HashMap<String,List<Date>> everything works: 但是如果我使用像这样的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;

}

and the result is: 结果是:

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] 两个,值是:[2015年6月11日星期四,2015年6月11日星期四14:54:22 CEST,2015年6月11日星期四14:54:22]

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] 一个值是:[CEST 2015年6月11日星期四,CEST 2015年6月11日星期四14:54:22,CEST 2015年6月11日星期四14:54:22]

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] 三,值是:[2015年6月11日星期四,2015年6月11日星期四14:54:22,2015年6月11日星期四14:54:22]

Where is the differenct in using a non Standard object as a key??? 使用非标准对象作为键的区别在哪里???

Updating the answer as you changed the question. 更改问题时更新答案。

If you want to use custom object as key in HashMap , you have to override hashCode() and equals() method in your custom object. 如果要将自定义对象用作HashMap键,则必须在自定义对象中重写hashCode()equals()方法。 here is the example of how to do that . 是如何做的例子。


Previous answer for checking size of list in jsp ( original question.) 检查jsp中列表大小的先前答案(原始问题。)

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

EL works on getters and setter. EL在吸气剂和吸气剂上工作。 If you are doing list.size , it looks for a method list.getSize() on List object, which is not there. 如果正在执行list.size ,它将在List对象上查找方法list.getSize() ,该方法不存在。 It has list.size() instead. 它有list.size()代替。 So we have to use this jstl function to retrieve size of list. 因此,我们必须使用此jstl函数来检索列表的大小。

as far as i recognized, the forEach is not working with a non java-standard object. 据我所知,forEach不适用于非Java标准对象。 the best is to make a wrapper 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;
    } 

}

than it is no problem at all to loop over every product: 遍历每个产品完全没有问题:

<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