簡體   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