質問

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 '&nbsp;'
   }
%>
<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()' メソッドを使用することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top