2013-05-17 8 views
24

Ho questo sulla welcome.jspCome passare il parametro a jsp: includere tramite c: set? Quali sono gli scopi delle variabili in JSP?

<c:set var="pgTitle" value="Welcome"/> 
<jsp:include page="/jsp/inc/head.jsp" /> 

E questo a head.jsp:

<title>Site Name - ${pgTitle}</title> 

Ma la variabile è vuota, e l'uscita è semplicemente

Site Name - 

ho leggi molti articoli e non riesco a capire quale sia il problema. Se echo ${pgTitle} altrove all'interno dello stesso welcome.jsp, viene emesso correttamente.

Sto includendo la libreria di tag principale su entrambe le pagine.

risposta

31

Questo perché la variabile pgTitle è impostata nello scope della pagina. Controllalo here (mi dispiace non posso avere una documentazione ufficiale per questo).

Se si desidera eseguire questa operazione, è necessario impostare almeno la variabile in ambito di richiesta. Per impostare la variabile a richiesta campo di applicazione, utilizzare l'attributo scope su <c:set>:

<c:set var="pgTitle" value="Welcome" scope="request" /> 

Per il tuo commento, nello sviluppo web, la portata delle variabili importa perché definisce in cui la variabile può essere usato (simile a una variabile dichiarata come campo in una classe e una variabile dichiarata localmente in un metodo). Esistono quattro ambiti in JSP noti come contesto:

  • Ambito di pagina (gestito da PageContext). Le variabili possono essere raggiunte solo se impostate come attributi nella pagina corrente. Questo significa che solo la pagina corrente può accedere a questi attributi, le pagine incluse sono pagine diverse, quindi non possono accedere a questi attributi.
  • Ambito della richiesta (gestito da ServletRequest). Le variabili possono essere raggiunte solo se impostate come attributi nella richiesta corrente. Ciò significa che ogni pagina gestita nella stessa richiesta può accedere a questi attributi. Nota importante: un reindirizzamento implica un nuovo processo di richiesta/risposta. Ciò significa che se imposti attributi sulla richiesta ed esegui un reindirizzamento, questi attributi non verranno impostati come attributi nella nuova richiesta.
  • Ambito sessione (gestito da HttpSession). Le variabili possono essere raggiunte solo se impostate come attributi nella sessione utente corrente. Ciò significa che ogni pagina utilizzata nella stessa sessione utente può utilizzare questi attributi fino a quando non vengono rimossi o la sessione scade.
  • Ambito applicazione (gestito da ServletContext). Le variabili possono essere raggiunte solo se impostate come attributi nel contesto corrente. Ciò significa che ogni pagina su ogni attributo di sessione può accedere a queste variabili fino a quando non vengono rimosse da SessionContext o l'applicazione Web non è distribuita.

Maggiori informazioni:

È questo il modo giusto per realizzare quello che sto cercando di fare?

Se c'è una Servlet o un altro controller che gestisce gli attributi da impostare nella richiesta (ad esempio @Controller da Spring MVC o JSF bean gestito), quindi impostare l'attributo di lì e non nella tua pagina direttamente.

Personalmente, ci vuole un po 'di tempo per guadagnare esperienza e definire il miglior ambito delle variabili quando viene utilizzato su applicazioni web. esempi di base:

  • La scissione di un String da virgola per scopi di presentazione avrà effetto solo alla vista corrente, quindi questo può essere impostato in ambito pagina.
  • I messaggi di errore e quelli riusciti sono i più adatti nell'ambito della richiesta. Se l'utente aggiorna la pagina, probabilmente non deve visualizzare gli stessi messaggi a meno che i dati non vengano rielaborati.
  • Le informazioni utente come nome, nickname e preferenze possono essere impostate nell'ambito della sessione.
  • Se è necessario visualizzare un elenco di Paesi (che non dovrebbero cambiare in pochi giorni), è possibile memorizzare questo elenco nell'ambito dell'applicazione.
+0

Questo ha fatto nel lavoro fatto. Posso chiedere una spiegazione più tecnica di cosa sta succedendo qui? Perché jsp: include non ha accesso a una variabile impostata all'interno del genitore? Ultima domanda: è questo il modo giusto per realizzare ciò che sto cercando di fare? – vcardillo

+0

risposta @vcardillo aggiornata. –

+0

Super utile. Grazie per aver dedicato del tempo per fornire questi dettagli! – vcardillo

2

È necessario impostare la variabile su (almeno) request con ambito. Si può fare id come segue:

<c:set var="pgTitle" value="Welcome" scope="request"/> 
<jsp:include page="/jsp/inc/head.jsp" /> 

E poi, nel head.jsp, è possibile emettere la variabile in questo modo:

<c:out value="${requestScope.pgTitle}" /> 
+0

Non c'è bisogno di aggiungere 'requestScope' dato che' $ {} 'cerca già la variabile in tutti gli attributi degli ambiti. –

+0

Non è richiesto, ma è più chiaro. :) –

4

Un modo è quello di passare variabili ad un includere tramite parametri di query:

<jsp:include page="/WEB-INF/views/partial.jsp?foo=${bar}" /> 

<jsp:include page="/WEB-INF/views/partial.jsp"> 
    <jsp:param name="foo" value="${bar}" /> 
    <jsp:param name="foo2" value="${bar2}" /> 
</jsp:include> 

È quindi possibile accedere a tali params con ${param.foo}

Un altro potrebbe essere quella di utilizzare i tag personalizzati:

/WEB-INF/tags/head.tag

<%@ attribute name="title" %> 

<head> 
    <title>${title}</title> 
</head> 

somePage.jsp

<%@ taglib prefix="layout" tagdir="/WEB-INF/tags" %> 

<html> 
    <layout:head title="myRadTitle" /> 
    <body></body> 
<html/> 
Problemi correlati