2011-08-19 13 views

risposta

2

Assegnare al JSP un riferimento a un'istanza della classe che ha il metodo e chiamarlo.

Probabilmente stai chiedendo chi fornisce a JSP quell'istanza: si tratta di un servlet nella disposizione MVC modello 2.

Ecco come il flusso funzionerà:

  1. inviare una richiesta GET/POST da una JSP per un servlet.
  2. Servlet agisce su tale richiesta e lavora per conto di JSP. Mette tutti gli oggetti necessari in richiesta, sessione o altro ambito appropriato.
  3. Servlet indirizza la risposta al JSP successivo, che potrebbe essere uguale al JSP richiedente.
  4. Risciacquare, ripetere.
0

Se si utilizza JSF, è possibile utilizzare un bean act come modello in View Scope e caricare automaticamente dall'origine dati. E se stai usando JSP, che ne dici di usare il tag TLD? E usando il tag JSTL <c:foreach>? Salva la memoria dal salvataggio nella sessione, o salva in sessione e rimuovila quando si carica l'evento? Alcuni come come questo (JSTL + TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p"> 
    Product name: ${p.productName} 
</c:forEach> 
+0

Sto usando le tessere di puntoni. Potresti per favore aggiungere una spiegazione, più oltre dobbiamo chiamare un metodo che accetta un parametro, qui saranno i valori ollean impostati in JSP. –

55

È possibile richiamare solo metodi con argomenti a EL, se ci si rivolge e l'esecuzione di un contenitore di 3.0 compatibile Servlet (ad esempio Tomcat 7, Glassfish 3, JBoss AS 6, ecc) con un certificato Servlet 3.0 conforme a web.xml. Questa versione servlet è accompagnata da EL 2.2 che consente di invocare metodi di istanza arbitrari con argomenti.

Supponendo che hai un ${bean} nel campo di applicazione che fa riferimento a un'istanza di una classe che ha un metodo simile public Object[] getArray(String key), allora si dovrebbe essere in grado di fare questo:

<c:forEach items="${bean.getArray('foo')}" var="item"> 
    ${item} <br /> 
</c:forEach> 

o anche con un altro variabile come argomento

<c:forEach items="${bean.getArray(foo)}" var="item"> 
    ${item} <br /> 
</c:forEach> 

Ma se non bersaglio un contenitore di Servlet 3.0, allora non si può invocare metodi con argomenti a EL affatto. La soluzione migliore è fare il lavoro nel servlet di pre-elaborazione come suggerito da Duffymo.

Object[] array = bean.getArray("foo"); 
request.setAttribute("array", array); 
// ... 

Come alternativa completamente diversa, è possibile creare una funzione EL che deleghi la chiamata al metodo. Puoi trovare un esempio di kickoff da qualche parte vicino al fondo di this blog. Ti piacerebbe finire qualcosa come come:

<c:forEach items="${util:getArray(bean, 'foo')}" var="item"> 
    ${item} <br /> 
</c:forEach> 

con

public static Object[] getArray(Bean bean, String key) { 
    return bean.getArray(key); 
} 
+1

Sto facendo qualcosa di simile con l'oggetto request, invocando 'isUserInRole ('role')' ma eclipse pensa che questo sia un metodo get e si lamenta del metodo 'getIsUserInRole()' non esistente. Sai come può essere risolto? Sto usando glassfish v3. Grazie, D. – Daniel

+2

@Daniel: Eclipse è debole per quanto riguarda il controllo e la convalida della sintassi EL. Basta disabilitare la convalida EL in Eclipse o installare JBoss Tools. – BalusC

+0

Grazie. L'ho disabilitato e ha funzionato. – Daniel

4

È possibile che questo lavoro non ha ancora una soluzione per me. Ho avuto una funzione getRemitanceProfileInformation(user) nella mia classe java. Ho creato un'useBean di classe Java e quindi invocato

<c:set var="paymentValueCode" value='remittanceaddr.getRemitanceProfileInformation("${user}")'/> 

e ha funzionato.

+3

Riferimento errato, chissà quale era la soluzione * sopra * quando hai risposto. – madth3

Problemi correlati