JSP

2010-03-26 33 views
34

'da öznitelik denetimi var, bir üst sınıfı genişleten bazı sınıflarım var ve JSP'de bu sınıfların bazı özelliklerini göstermek istiyorum. Sadece bir tane JSP yapmak istiyorum, ancak eğer nesnenin bir özelliği varsa ya da bilmiyorsa, önceden bilmiyorum. Bu yüzden bir JSTL ifadesine veya geçirdiğim nesnenin bu özniteliğe sahip olduğunu kontrol eden bir etikete (javascript'te, ancak sunucuda olduğu gibi) ihtiyacım var.JSP

<c:if test="${an expression which checks if myAttribute exists in myObject}"> 
    <!-- Display this only when myObject has the atttribute "myAttribute" --> 
    <!-- Now I can access safely to "myAttribute" --> 
    ${myObject.myAttribute} 
</C:if> 

Bunu nasıl alabilirim?

Teşekkürler. Eğer JSTL c:catch ait

<c:if test="#{not empty myObject.myAttribute}"> 

cevap

50

Yap kullanımını yapabileceği bir liste ise

<c:if test="${not null myObject.myAttribute}"> 
    <!-- Now I can access safely to "myAttribute" --> 
</C:if> 

veya başka varyantını

<c:if test="${myObject.myAttribute != null}"> 
    <!-- Now I can access safely to "myAttribute" --> 
</C:if> 

:

+27

Sadece ben miyim? Bunun bir değişkenin var olup olmadığını görmek için çirkin bir yol olduğunu düşünüyorum. Onun yerine java NullPointerException yakalamak gibi? '(if! = null)' –

+5

@Shervin: Gerçekten de kötü bir tasarım. Ancak bu, tek gereksinimi elde etmenin tek yolu. – BalusC

+0

@Shervin Asgari Bence "null" çirkin. Üçüncü parti API'sı yapmadıkça. Tüm istisnai yol temizleyicilere dikkat etmelisiniz. – magulla

1

böyle bir şey demek istiyorsunuz.

<c:catch var="exception">${myObject.myAttribute}</c:catch> 
<c:if test="${not empty exception}">Attribute not available.</c:if> 
+3

Hayır, eğer myObject.myAttribute öğemi yaparsam ve myObject benimAttribute için gether almazsa PropertyNotFoundException alırım. Bir nesnenin, bu özelliğe sahip olmadığı null değeri olan bir özelliği olduğu aynı değildir. – Javi

+0

Ama diğer mülke nasıl erişeceksin? Bildiğim kadarıyla sadece alıcılar yoluyla erişebilir. Değişken halka açık olsa bile, bir alıcıya ihtiyacınız olduğuna inanıyorum. Neden sadece bir alıcı oluşturmuyorsunuz? –

+3

Özellik, her alt sınıfta mevcut değil, bu yüzden özellik mevcut olduğunda, bunun için bir alıcı var. Sorun şu ki, alt sınıflardan hangisinin geçeceğini bilmiyorum. – Javi

13

Özelliği denetlemek için vivin's blog post uyarınca özel bir işlev oluşturabilirsiniz. Kısacası

, zaten kendi taglib statik 'hasProperty' yöntemi yaratma onun meselesi varsa ...

import java.beans.PropertyDescriptor; 
import org.apache.commons.beanutils.PropertyUtils; 

... 

public static boolean hasProperty(Object o, String propertyName) { 
    if (o == null || propertyName == null) { 
     return false; 
    } 
    try 
    { 
     return PropertyUtils.getPropertyDescriptor(o, propertyName) != null; 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 

... ve TLD beş satırları ekleyerek ...

<function> 
    <name>hasProperty</name> 
    <function-class>my.package.MyUtilClass</function-class> 
    <function-signature>boolean hasProperty(java.lang.Object, 
     java.lang.String) 
    </function-signature> 
</function> 

... ve BalusC büyük bir cevabın JSP

<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}"> 
    <c:set var="foo" value="${myObject.myAttribute}" /> 
</c:if> 
2

Sadece daha detaylı (tipik?) kullanımında çağırmak

BalusC cevabı yorumlarında Shervin işaret ettiği gibi
<%-- 
    [1] sets a default value for variable "currentAttribute" 
    [2] check if myObject is not null 
    [3] sets variable "currentAttribute" to the value of what it contains 
    [4] catches "property not found exception" if any 
     - if exception thrown, it does not output anything 
     - if not exception thrown, it outputs the value of myObject.myAttribute 

--%> 
<c:set var="currentAttribute" value="" /> <%-- [1] --%> 
<c:if test="${not empty myObject}"> <%-- [2] --%> 
    <c:set var="currentAttribute"> <%-- [3] --%> 
     <c:catch var="exception">${myObject.myAttribute}</c:catch> <%-- [4] --%> 
    </c:set> 
</c:if> 

<%-- use the "currentAttribute" variable without worry in the rest of the code --%> 
currentAttribute is now equal to: ${currentAttribute} 

, bu muhtemelen en temiz çözüm ancak "şu ana kadar tuhaf şartı ulaşmak için tek yol" BalusC tarafından cevap DEĞİLDİR.

Kaynaklar

1

kabul cevap sadece nesne alan varsa test etmek istediğinizde bazı yan etkileri var, ama yapabilir alanın değerini çıkarmak istemiyorum. Belirtilen durumlarda, bu pasajın kullanılmasını umuyorum:

<c:catch var="exception"> 
     <c:if test="${object.class.getDeclaredField(field) ne null}">    
     </c:if> 
</c:catch> 

.