2013-06-08 12 views
19

Come passarei i parametri nascosti? Voglio chiamare una pagina (test.jsp) ma anche passare 2 parametri nascosti come un post.Passare parametri nascosti utilizzando response.sendRedirect()

response.sendRedirect("/content/test.jsp"); 
+0

@ informatik01 mia risposta copre quello coperto nella vostra eccezione del fatto che la mia aggiunge la vista parte di rimozione attributo di sessione usando JSTL. –

+0

@LuiggiMendoza Scusa amico, eliminerò il mio commento per assicurarmi che tu stia bene. A proposito, questa risposta è stata pubblicata circa 5 mesi fa) – informatik01

+1

@ informatik01 non sapeva del tuo post, ma sembra che entrambi sappiamo (tra le altre persone in tutto il mondo) come gestire questo problema. –

risposta

36

TheNewIdiot's answer spiega correttamente il problema e il motivo per cui non è possibile inviare attributi in richiesta tramite un reindirizzamento. Possibili soluzioni:

  1. Utilizzo di inoltro. Ciò consentirà che gli attributi di richiesta possano essere passati alla vista e che sia possibile utilizzarli in forma di ServletRequest#getAttribute o utilizzando Expression Language e JSTL. Breve esempio (riutilizzo del codice di risposta di TheNewIdiot)).

    Controller (il vostro servlet)

    request.setAttribute("message", "Hello world"); 
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url); 
    dispatcher.forward(request, response); 
    

    View (JSP)

    Uso scriptlet:

    <% 
        out.println(request.getAttribute("message")); 
    %> 
    

    Questo è solo per scopi informativi . L'utilizzo degli scriptlet deve essere evitato: How to avoid Java code in JSP files?. Sotto c'è l'esempio usando EL e JSTL.

    <c:out value="${message}" /> 
    
  2. Se non è possibile utilizzare l'inoltro (perché non ti piace o non ti senti in questo modo, o perché è necessario utilizzare un redirect), allora l'opzione sarebbe il salvataggio di un messaggio come attributo di sessione, quindi reindirizzare alla vista, ripristinare l'attributo di sessione nella vista e rimuoverlo dalla sessione. dalla sessione. Ricorda di avere sempre la tua sessione utente con solo i dati rilevanti. Esempio di codice

    controller

    //if request is not from HttpServletRequest, you should do a typecast before 
    HttpSession session = request.getSession(false); 
    //save message in session 
    session.setAttribute("helloWorld", "Hello world"); 
    response.sendRedirect("/content/test.jsp"); 
    

    View

    Anche in questo caso, che mostra questo utilizzando scriptlet e quindi EL + JSTL:

    <% 
        out.println(session.getAttribute("message")); 
        session.removeAttribute("message"); 
    %> 
    
    <c:out value="${sessionScope.message}" /> 
    <c:remove var="message" scope="session" /> 
    
3

In genere, non è possibile inviare una richiesta POST utilizzando sendRedirect() metodo. È possibile utilizzare RequestDispatcher a forward() richieste con parametri all'interno della stessa applicazione Web, stesso contesto.

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp"); 
dispatcher.forward(request, response); 

La specifica HTTP indica che tutti i reindirizzamenti devono essere sotto forma di GET (o HEAD). È possibile prendere in considerazione la crittografia dei parametri della stringa di query se la sicurezza è un problema. Un altro modo è POSSIBILIZZARE il bersaglio avendo un modulo nascosto con il metodo POST e inviandolo con javascript quando la pagina viene caricata.

+0

Cosa posso usare invece, qualsiasi altra funzione ??? –

+0

@AshishAnand Vedere la mia risposta modificata, è possibile utilizzare 'RequestDispatcher' nella stessa app Web. – NINCOMPOOP

1

Utilizzando session, ho superato con successo un parametro (name) dal servlet # 1 al servlet # 2, usando response.sendRedirect nel servlet # 1.Servlet # 1 Codice:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
    String name = request.getParameter("name"); 
    String password = request.getParameter("password"); 
    ... 
    request.getSession().setAttribute("name", name); 
    response.sendRedirect("/todo.do"); 

In Servlet # 2, non è necessario per ottenere name indietro. È già connesso alla sessione. Potresti fare String name = (String) request.getSession().getAttribute("name"); --- ma non ne hai bisogno.

Se Servlet # 2 chiama una JSP, è possibile mostrare name in questo modo sulla pagina web JSP:

<h1>Welcome ${name}</h1>