我有一个表,其中包含在java类的构造函数中设置的各种属性。我需要显示所有属性,但是当我想要这样做时,我可以轻松获得nullpointers。我已经尝试过jstl if和jstl选择这样做。
<c:choose>
<c:when test="${empty animal.getEarSize()}">
not set!
</c:when>
<c:otherwise>
${animal.getEarSize()}
</c:otherwise>
</c:choose>
但是当我尝试运行它时,我得到HTTP状态500 - 处理JSP页面时发生异常。 动物是jstl for循环中的变量,并非所有动物都在构造函数中有耳朵化。
我在这里做错了什么? 有没有其他方法可以做到这一点,或者这是使用jstl选择或if?
执行此操作的唯一方法编辑:我在控制器中使用一种方法,该方法为地图提供了动物对象,我可以在其中循环。
public AfricanElephant(String color, String bodyCovering, String name, double weight, Gender gender, int earSize) {
super(color, bodyCovering, name, weight, gender, maxNumberOfEggs, earSize);
}
public Parrot(String color, String bodyCovering, String name, double weight, Gender gender) {
super(color, bodyCovering, name, weight, gender, maxNumberOfEggs);
}
这些是elephant构造函数中的两个示例构造函数,其中有一个用于earize的变量,但在parrot构造函数中,没有用于earize的变量。
编辑:我已将选择更改为:
<td>
<c:if test="${animal.getClass().name eq 'myPackage.MyPath.AfricanElephant'}">${animal.earSize}</c:if>
这会修复HTTP状态500错误,但现在它在表格中显示0而不是我设置的earize。
我的控制员:
@Controller("animalController")
公共类AnimalController {
ArrayList<Animal> animals = new ArrayList<Animal>();
@RequestMapping(value = "/animaloverview", method = RequestMethod.GET)
public String animals(Map<String, Object> model, @RequestParam(value = "race", required = false, defaultValue = "") String race){
if(race.isEmpty()){
model.put("animals", Zoo.getInstance().getAllAnimals());
}
else{
model.put("animals", Zoo.getInstance().getAnimalsByRace(race));
}
return "animalkingdom";
}
答案 0 :(得分:0)
你不能这样检查。 EL empty
仅适用于空字符串或null,不适用于不存在的属性。您可以向Parrot添加getEarSize()
方法,返回null
,或检查动物是否为instanceof
AfricanElephant,然后打印${animal.earSize}
(不是getEarSize()! )。
类似的东西:
<c:if test="${animal.getClass().name eq 'package.path.AfricanElephant'}">
另外,Amit Goel的回答是错误的。 EL正在使用getter方法,而不是直接访问属性(并且它们应该是私有的)。如果你有一个方法,例如:getFullSize()
,它会返回计算结果,但你不能t有fullSize属性,你仍然可以说${animal.fullSize}
,它会显示结果。
答案 1 :(得分:-1)
不要使用java getter getEarSize()
。如果您的实体拥有属性earSize,请检查
<c:when test="${empty animal.earSize}">