2011-11-27 9 views
8

Bu teknolojiyi öğrenmek için JSP'de basit bir ziyaretçi defteri oluşturuyorum. Şu anda iki dersim var: guestbook/GuestBook.class ve guestbook/Entry.class (Uygulamayı henüz bitirmedim, bu yüzden sadece bu sınıflarım var) WEB-INF/libs'e eklendi ve bunlar düzgün bir şekilde dahil edildi . Index.jsp dosyasında guestbook.GuestBook sınıfını kullanıyorum; onun yöntemi Vector döndürür. Ben girdileri üzerinde yineleme ve ben girişin bir yazar yazdırmak istiyorum, ben görebilirsiniz:JSP, EL özellik bulunamadı

javax.el.PropertyNotFoundException: Property 'author' not found on type guestbook.Entry 

O Giriş Sınıfı kamu ve yazar niteliği böyle yolla bildirilir eklemelisiniz:

Bu yüzden geneldir. Ben girdileri üzerinde yineleme Bu benim kodudur:

<c:forEach items="${entries}" varStatus="i"> 
    <c:set var="entry" value="${entries[i.index]}" /> 
    <li><c:out value="${entry.author}" /></li> 
</c:forEach> 

ve

entry.class.name 

döner

sınıflar

(siz tahmin edebilirsiniz gibi) paket defterine olan guestbook.Entry, vektör girişleri pageContext'e geçti.

Bunu yapma şeklimde neyin yanlış olduğunu bilmiyorum. Bana yardım eden var mı lütfen? (Şimdiden teşekkürler!)

cevap

8

JSP EL, sınıflarınızdaki kamusal alanları tanımayacaktır, yalnızca getto yöntemleriyle çalışır (yine de iyi bir uygulamadır - sınıflarınızın durumunu asla böyle kamusal alanlar olarak göstermeyin). Hatta

<c:forEach items="${entries}" var="entry"> 
    <li><c:out value="${entry.author}" /></li> 
</c:forEach> 

veya

:

Yani

private String author; 

public String getAuthor() { 
    return author; 
} 

yerine bir yan not olarak

public String author; 

kullanın sizin JSTL aşırı karmaşık olduğunu, bunun basitleştirilmiş olabilir
<c:forEach items="${entries}" var="entry"> 
    <li>${entry.author}</li> 
</c:forEach> 
Sonuncu form yazar isminden XML kaçmasına rağmen,

.

Son olarak, Vector sınıfı geçersizdir, bunun yerine ArrayList kullanmalısınız.

3

Ayrıca, bir alıcı bulunamazsa, ortak alanlara erişmek için EL-çözücüyü de değiştirebilirsiniz. Bunu yapmak için, öncelikle özel ELResolver oluşturmak gerekir:

public class PublicFieldSupportingELResolver extends ELResolver { 

    @Override 
    public Class<?> getCommonPropertyType(ELContext context, Object base) { 
     return null; 
    } 

    @Override 
    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) { 
     return null; 
    } 

    @Override 
    public Class<?> getType(ELContext context, Object base, Object property) { 
     return null; 
    } 

    @Override 
    public Object getValue(ELContext context, Object base, Object property) { 
     try { 
      return context.getELResolver().getValue(
        context, base, property); 
     } catch(RuntimeException ex) { 
      if(property instanceof String && base != null) { 
       try { 
        Field field = base.getClass().getDeclaredField((String) property); 
        Object value = field.get(base); 
        context.setPropertyResolved(true); 
        return value; 
       } catch (Exception e) { 
        throw new PropertyNotFoundException(e); 
       } 
      } else { 
       throw ex; 
      } 
     } 
    } 

    @Override 
    public boolean isReadOnly(ELContext context, Object base, Object property) { 
     return false; 
    } 

    @Override 
    public void setValue(ELContext context, Object base, Object property, Object value) { 
    } 
} 

Sonra yardım etmek için bir sınıf gerekir bunu yapılandırın:

public class PublicFieldSupportingELResolverConfigurer implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent event) { 
     JspFactory.getDefaultFactory() 
       .getJspApplicationContext(event.getServletContext()) 
       .addELResolver(new PublicFieldSupportingELResolver()); 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
    } 
} 

Sonunda ne zaman bu configurer sınıf çalıştırmak için gereken sunucu başlatılır. senin Web.xml bir servlet dinleyici olarak bu sınıfı ekleyerek bunu yapın:

<listener> 
    <listener-class>your.package.PublicFieldSupportingELResolverConfigurer</listener-class> 
    </listener> 

Artık JSP'lerde kamu alanlarına başvurabilir.

+0

bir StackOverflowException Atar :) O 'context.getELResolver() GetValue ( bağlamda, temel, özelliği) geri görülür;.' Aynı 'getValue' uygulanmasını gerektirir. –

0

Yapı Yolu'nda bir sorun yaşadım. javax.servlet.jsp.jstl-1.2.1.jar silinmiş, ancak Yapı Yolu'ndan kaldırılmamış. Oluşturma Yolu Özelliği 'xxx' kaldırıldıktan sonra sorun bulunmadı.