2010-04-18 11 views
9

Diciamo che ho un semplice servlet di login che controlla il passaggio name e crea l'oggetto User e lo memorizza in una sessione.Servlet Java e JSP che accedono allo stesso bean di sessione

User user = new User(); 
user.setId(name); 

request.getSession().setAttribute("user", user); 
response.sendRedirect("index.jsp"); 

Nella pagina index.jsp ho accedere all'oggetto utente attraverso jsp:useBean

<jsp:useBean id="user" scope="session" 
      class="package.name.User"/> 

<div class="panel"> 
    Welcome ${user.id} 
</div> 

Funziona così lontano.

Dalla documentazione fagioli jsp

Per individuare o un'istanza Bean, prende le seguenti passaggi, in questo ordine:

  1. tenta di individuare un fagiolo con la portata e il tuo nome specificare.
  2. Definisce una variabile di riferimento oggetto con il nome specificato.
  3. Se trova il bean, memorizza un riferimento ad esso nella variabile. Se il tipo specificato è , viene assegnato il bean .
  4. Se non trova il bean, lo istanzia dalla classe che si specifica , memorizzando un riferimento ad esso in la nuova variabile. Se il nome della classe rappresenta un modello serializzato, il bean viene istanziato da java.beans.eans.
  5. Se ha istanziato (anziché localizzato) il bean e se ha tag o elementi del corpo (tra e), esegue i tag del corpo.

Le domande:

tenta di individuare un fagiolo con la portata e nome specificato

Non specifica il processo di "localizzare". Significa che controllerà HttpServletRequest.getSession() o semplicemente controllerà se altre pagine hanno già creato questo bean o no?

Se non trova il bean, lo istanzia dalla classe specificata, memorizzando un> riferimento ad esso nella nuova variabile.

Ciò significa in realtà che Jsp può associare un fagiolo appena creato con sessione utilizzando jsp_internal_name_user. Non si sa come Jsp memorizza e trova i bean nella sessione.

Esiste un'opzione per accedere agli oggetti di sessione utilizzando ${sessionScope.user} e questo garantirà l'acquisizione di "utente" dall'oggetto di sessione Java. Lo stesso che ho messo da solo.

Java EE 5 esempio "Libreria" accede agli oggetti di sessione utilizzando l'approccio ${sessionScope.name}.

utilizzando solo ${user} funziona. E questo è ciò che mi preoccupa. Mi piacerebbe vedere una specifica frase nelle specifiche sul processo locate e se ${user} deve funzionare o se dipende dall'implementazione di riferimento JSP e/o JSTL.

risposta

6

Nel caso di un controller (servlet) che si occupa del modello, lo jsp:useBean è utile solo se l'istanza predefinita (costruita con il costruttore no-arg) espone un comportamento/stato diverso rispetto a un'istanza non esistente. Per esempio. se si desidera avere un nome utente predefinito "Utente sconosciuto", si dovrebbe fare:

public User { 
    this.id = "Unknown User"; 
} 

Else l'utente finale può affrontare una "benvenuto" al posto di visualizzazione "Benvenuto Utente sconosciuto". Nel tuo caso particolare, puoi tranquillamente rimuoverlo. È superfluo.

Tuttavia, ho anche visto l'argomento che è utile per la documentazione pura. È possibile dichiarare istanze "inutili" jsp:useBean nella parte superiore della pagina JSP in modo da avere una panoramica su quali modelli sono stati utilizzati esattamente nella pagina JSP specifica. Anche se lo trovo abbastanza intelligente, io stesso non ho mai avuto la necessità di documentare il modello in JSP. Secondo i commenti, un altro argomento è che in questo modo IDE come IDEA ed Eclipse sono in grado di completare automaticamente le proprietà dei bean in EL.

Aggiornamento: per il posizionamento, utilizza PageContext#findAttribute() per questo e quindi utilizza la riflessione/javabean introspezione per richiamare i metodi getter su di esso. Per esempio.

${user.name} 

risolve grosso modo

out.print(pageContext.findAttribute("user").getName()) 

anche vedere la JSP specification e JSP EL specification.

Update 2: il <jsp:useBean>certamente non usa un nome interno o così come prefisso dell'attributo sessione. Loop su tutti attributi di sessione voi stessi per vedere le chiavi ei valori effettivi:

<c:forEach items="${sessionScope}" var="entry"> 
    ${entry.key} = ${entry.value}<br> 
</c:forEach> 

o in un servlet

for (String name : Collections.list(session.getAttributeNames())) { 
    System.out.println(name + " = " + session.getAttribute(name)); 
} 
+0

C'è qualche documentazione che descrivono in modo esplicito il processo delle variabili risolvere in una pagina jsp? –

+0

Intellij IDEA completa i campi variabili solo in caso di dichiarazione esplicita. –

+1

1) Stai parlando di EL? Controlla la [specifica JSP EL] (https://jsp.dev.java.net/spec/jsp-2_1-fr-spec-el.pdf). In poche parole, 'PageContext # findAttribute()' per individuare gli attributi in qualsiasi ambito. 2) Questo è davvero anche un altro argomento che ho visto prima. – BalusC

2

Dalla documentazione:

L'elemento <jsp:useBean> individua o un'istanza di un componente JavaBeans. <jsp:useBean> primi tentativi per individuare un'istanza del bean. Se il bean non esiste, lo <jsp:useBean> lo istanzia da una classe o un modello serializzato .

Da "localizzare" il fagiolo è perfettamente allright quindi possiamo supporre che il fagiolo può essere reso disponibile con mezzi diversi istanziazione tramite <jsp:useBean>. Ad esempio, creandolo in un servlet.

4

Citando le specifiche JSP.5 JSP.1

La semantica di base cerca di trovare un oggetto esistente utilizzando id e l'ambito . Se l'oggetto non viene trovato, tenterà di creare l'oggetto utilizzando gli altri attributi .

In altre parole,

<jsp:useBean id="user" scope="session" class="package.name.User"/> 

si tradurrebbe approssimativamente in Java come:

package.name.User user = (package.name.User)session.getAttribute("user"); 
if (user == null){ 
    user = new package.name.User(); 
    session.setAttribute("user", user); 
} 
+0

Ehi, felice di vederti qui :) La tua risposta è davvero giusta per la particolare linea 'jsp: usebean', hai solo dimenticato' session.setAttribute ("utente", utente); 'nel blocco' if';) – BalusC

+0

Mi piacerebbe vedere la descrizione del processo "trova un esistente". Infatti jsp può memorizzare oggetti usando il nome "user_jsp_internal". –

+0

No, non è così. L'oggetto è memorizzato con la chiave dell'attributo come specificato in 'id'. In quale altro modo sarebbe possibile accedervi in ​​EL semplice da '$ {utente}' e così via? – BalusC

Problemi correlati