如果键是非标准对象,则 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>
我有一个如下所示的 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>