存在しない可能性があるプロパティの JSP Bean タグ
質問
JSPでは、タグ$ {object.Property}を使用して、Beanのプロパティを参照できます。
存在しない可能性のあるプロパティを処理する方法はありますか?さまざまな型を処理する必要がある JSP ページがあります。例:
public class Person {
public String getName()
}
public class Employee extends Person {
public float getSalary()
}
JSP で、名前と給与の列を持つ人物のテーブルを表示したいと考えています。その人が従業員ではない場合、給与は空白にする必要があります。HTML 行は次のようになります。
<tr>
<td><c:out value="${person.name}"></td>
<td><c:out value="${person.salary}"></td>
</tr>
残念ながら、その人が従業員ではない場合、給与を見つけることができず、エラーが発生します。JSP でこれを解決するにはどうすればよいでしょうか?
編集:ありますか? インスタンスの JSPタグ言語をチェックしますか?
解決
スコープ付き属性である場合は、EL空演算子を使用するだけです。残念ながら、employee.salaryを使用して式を囲むには、<!> lt; c:catch <!> gt;:
を使用する必要があります。<c:catch var="err">
<c:out value="${employee.salary}"/>
</c:catch>
instanceof が本当に必要な場合は、カスタムタグを検討できます。
他のヒント
クラスが必要な場合は、${person.class}
を使用します。 ${person.class.name eq 'my.package.PersonClass'}
<!> quot; default <!> quot;も使用できます。 c:outで。
<c:out value='${person.salary}' default="Null Value" />
簡潔だがチェックされていない。
<tr>
<td>${person.name}</td>
<td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>
JSPタグ言語でのinstanceofチェックはありますか?
この執筆時点ではありません。 ELの instanceof キーワードは将来的に予約される可能性があると、どこかで読みました。さらに、この特定のタグを持つライブラリが利用可能です。独自のカスタムタグを作成することを決定する前に、それを調べてください。リンクは、非標準タグライブラリです。
1つの方法は、カスタムタグライブラリを作成し、その中にポリモーフィズムを使用して、Person
is-a Employee
の場合を処理することです。
JSPではこれをしばらく行っていませんが、GSP(Groovy / Grails Server Pages)で同様の手法を頻繁に使用しています。
それ以外の場合、JSP
にテストするために<=>(理想的ではない)にいくつかのロジックを入れることができます:
<%
String salary
if (person instanceof Employee) {
salary = person.salary
} else {
salary = "" // or ' '
}
%>
<td><c:out value="${salary}"></td>
いつでも type フィールドを持つことができます。
public class Person {
public String getType() { return "Person"; }
public String getName()
}
public class Employee extends Person {
public String getType() { return "Employee"; }
public float getSalary()
}
あなたの JSP は次のようになります
<tr>
<td><c:out value="${person.name}"></td>
<td><c:if test="'Employee' eq person.type"><c:out value="${person.salary}"></c:if></td>
</tr>
もちろん、Class クラスにはすでにこれがあります...
<tr>
<td><c:out value="${person.name}"></td>
<td><c:if test="'Employee' eq person.class.simpleName"><c:out value="${person.salary}"></c:if></td>
</tr>
`isEmployee()' メソッドを使用することもできます。