La sessione e la sessione sono uguali in JSP EL?

public class LoginAction extends ActionSupport { private String username; private String password; @Override public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); Integer counter = (Integer)ctx.getApplication().get("counter"); // put counter into application ctx.getApplication().put("counter", counter); // put username into session ctx.getSession().put("user", username); if (getUsername().equals("crazyit.org") && getPassword().equals("leegang")) { ctx.put("tip", "Login Success! "); return SUCCESS; } else { ctx.put("tip", "Login Falied!"); return ERROR; } } } 

Metto "counter" nell’applicazione "user" in session e "tip" in ActionContext . In JSP posso usare ${session.user} e ${sessionScope.user} per fare riferimento alla proprietà “user”. ${request.tip} e ${requestScope.tip} come riferimento.

Le mie domande:

  1. La sessione, la richiesta, l’applicazione sono le stesse di sessionScope , requestScope , applicationScope in EL?
  2. Qual è la relazione tra ActionContext e request(requestScope) ?

PS:

Sottopongo ${request == requestScope} che è vero, questo significa che sono uguali?

    Con il linguaggio di espressione (EL), gli oggetti di ambito sono mappe di valore degli attributi negli oggetti a cui si riferiscono. Ad esempio, requestScope è una rappresentazione mappa dei valori nell’object richiesta. Questo è spiegato in dettaglio abbastanza chiaro in questa pagina: Java Servlet e JSP . Se leggi le sezioni EL, noterai un punto sulla richiesta e lo scope di richiesta qui: Il requestScope NON è object di richiesta .

    Consiglierei di leggere questa pagina per avere una migliore comprensione di servlet / jsp in generale.

    Per quanto riguarda il modo in cui ActionContext si riferisce a questi elementi, è davvero un wrapper utilizzato dai puntoni per incapsulare il servlet. Puoi leggere più specifiche su di esso qui: Accesso a applicazioni, sessioni, oggetti di richiesta .

    Ci sono stati alcuni riferimenti ai valori impliciti qui riportati, ma mi sento di dire che è implicito in realtà non spiega molto. Quando si utilizza EL per accedere alle variabili servlet, è ansible dichiarare esplicitamente l’ambito a cui si desidera fare riferimento, ad esempio:

      ${requestScope.myVariable} 

    Puoi anche fare riferimento implicitamente omettendo l’ambito:

      ${myVariable} 

    Ora, il problema che può sorgere qui è che le variabili con lo stesso nome possono causare collisioni. EL controlla i valori impliciti in un ordine specifico: pageScope, requestScope, sessionScope e applicationScope, param, paramValues, header, headervalues, initParam, cookie, pageContext. Ciò significa che se per esempio hai una variabile nell’ambito della richiesta con lo stesso nome di una variabile in ambito di sessione o di applicazione, verrà fatto riferimento al valore dell’ambito della richiesta.

    Per impostazione predefinita page, request, session and application sono disponibili per le pagine JSP. Quindi è ansible accedere quindi utilizzando la syntax EL.

    E la seguente tabella mostra gli oggetti IMPLICIT disponibili per EL.

      Implicit object Description 1.    pageScope Scoped variables from page scope 2.    requestScope Scoped variables from request scope 3.    sessionScope Scoped variables from session scope 4.    applicationScope Scoped variables from application scope 5.    param Request parameters as strings 6.    paramValues Request parameters as collections of strings 7.    header HTTP request headers as strings 8.    headerValues HTTP request headers as collections of strings 9.    initParam Context-initialization parameters 10. cookie Cookie values 11. pageContext The JSP PageContext object for the current page 

    Quindi session e sessionScope sono uguali ma differiscono nel contesto in cui sono utilizzati. Più specificamente la session is object e sessionScope is map (key, value) of Attribute and its value .

    • Se dici ${session.sessionAttr} fa riferimento all’object di sessione disponibile per la pagina JSP.

    • Se si dice ${sessionScope.sessionAttr} si riferisce all’object di sessione IMPLICIT disponibile per EL.

    • Oppure, se dici solo {attrName}, cercherà attrName in tutto lo scope dalla pagina all’ambito dell’applicazione.
    1. sessione, richiesta, applicazione sono in realtà gli oggetti HttpSession , HttpServletRequest e ServletContext mentre sessionScope, requestScope and applicationScope forniscono l’accesso a tutti gli attributi di sessione, richiesta e ambito dell’applicazione.

    Puoi dire applicationScope> sessionScope> requestScope.

    • Gli attributi applicationScope saranno accessibili a tutte le sessioni, tutte le richieste attraverso le applicazioni web. Questi attributi rimangono in vita finché l’applicazione è viva
    • gli attributi sessionScope saranno accessibili a tutte le richieste attraverso la HttpSession corrente. Questi attributi rimangono in vita finché la sessione è viva
    • Gli attributi requestScope saranno accessibili solo dalla richiesta corrente. Una volta completata la risposta, se ne sono andati.

    ActionContext è una cosa di Struts2 e viene creata in ogni richiesta gestita dal framework. Quando viene creato, il framework lo popola insieme al materiale del servlet con le sue implementazioni proprie di request , session e applicaton . E dove lo si utilizza nell’applicazione, questi oggetti sono referenziati. Per accedere alle informazioni sui servlet, utilizzare ServletActionContext che consente di recuperare le risorse appropriate. Struts2 avvolge anche ServletRequest per fornire accesso alle proprietà dell’azione e valueStack dalle espressioni EL. sessionScope , requestScope e applicationScope utilizzati con espressioni EL per valutare gli attributi stuff del servlet. Queste sono le differenze.

    Dai un’occhiata sotto al codice che ho provato.

      <% FirstServlet first=new FirstServlet(); // it has a fileName property and getter setter for it %> <% session.setMaxInactiveInterval(10); //jsp's implicit session object request.setAttribute("session", first); //jsp's implicit request object session.setAttribute("hello", "this worked!"); pageContext.getSession().setAttribute("hello", "now this also worked!");%> // same as above ${pageContext.session.maxInactiveInterval } // client's session object ${sessionScope.maxInactiveInterval} ${session.fileName } // FirstServlet Object and gives the fileName I gave. ${sessionScope.hello } // OP: "now this also worked! ${session==sessionScope } // gives false. If using struts2 than true ${request==requestScope } // gives false. If using struts2 than true  

    in EL come dichiarato da Prasad e Captain quando si utilizza ${sessionScope} esso associa solo i nomi delle variabili con scope di sessione ai loro valori.

    se vuoi ottenere l’object sessione del client di quanto dovresti usare pageContext.session

    ma quando si usa ${session} , el cerca l’attributo associato al nome della sessione nell’ordine: page->request->session->application ambiti page->request->session->application iniziano da sinistra a destra.

    ${request == requestScope}false poiché requestScope è l’object richiesta del client quando la request farà in modo che EL cerchi l’object mappato con il nome della request in vari scopes . Ma nel tuo caso è true causa di struts2