2011-03-24 65 views
17

He sido desarrollador de PHP pero recientemente necesito trabajar en algún proyecto usando Google App Engine (Java). En PHP que puedo hacer algo como esto (en términos de modelo MVC):¿Pasar datos de Java Servlet a JSP?

// controllers/accounts.php 
$accounts = getAccounts(); 
include "../views/accounts.php"; 

// views/accounts.php 
print_r($accounts); 

que echar un vistazo a algunas demos de Google App Engine Java utilizando Servlet y JSP. Lo que están haciendo es la siguiente:

// In AccountsServlet.java 
public class AccountsServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String action = req.getParameter("accountid"); 
    // do something 
    // REDIRECT to an JSP page, manually passing QUERYSTRING along. 
    resp.sendRedirect("/namedcounter.jsp?name=" + req.getParameter("name")); 
    } 
} 

Básicamente, en el caso de Java son las 2 diferentes peticiones HTTP (el segundo siendo forzado automáticamente), ¿verdad? Entonces en el archivo JSP no puedo hacer uso de los datos calculados en el Servlet.

¿Hay alguna manera en que pueda hacerlo de manera similar a PHP?

+0

para el registro. Otro amigo me sugirió deshacerse de JSP. Vaya con Java Servlet y Closure http://code.google.com/closure/ – huy

Respuesta

30

Usted tendrá que configurar los datos recuperados en el servlet en la solicitud de alcance a fin de que los datos están disponibles en JSP

Tendrá siguiente línea en su servlets.

List<Account> accounts = getAccounts(); 
request.setAttribute("accountList",accounts); 

Luego, en JSP se puede acceder a estos datos utilizando el lenguaje de expresión, como a continuación

${accountList} 

yo usaría solicitud envía en lugar de la sendRedirect de la siguiente manera

RequestDispatcher rd = sc.getRequestDispatcher(url); 
    rd.forward(req, res); 

Si puede utilizar RequestDispatcher luego puede almacenar estos valores en el objeto request o session y obtener otros JSP.

¿Existe algún propósito específico de usar request.sendRedirect?. Si no, use RequestDispatcher.

See this link for more details.

public class AccountServlet extends HttpServlet { 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    List<Account> accounts = getAccountListFromSomewhere(); 

    String url="..."; //relative url for display jsp page 
    ServletContext sc = getServletContext(); 
    RequestDispatcher rd = sc.getRequestDispatcher(url); 

    request.setAttribute("accountList", accounts); 
    rd.forward(request, response); 
    } 
} 
+3

también getServletContext(). GetRequestDispatcher (url) .forward (solicitud, respuesta); – tomasb

2
import javax.servlet.http.*; 

public class AccountsServlet extends HttpServlet { 

    public void doGet (HttpServletRequest request, HttpServletResponse response) { 

     try { 
      // Set the attribute and Forward to hello.jsp 
      request.setAttribute ("somename", "someValue"); // to save your temporary calculations. 
      getServletConfig().getServletContext().getRequestDispatcher("/namedcounter.jsp?name=" + req.getParameter("name")).forward(request, response); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

En el servlet código no creará 2 peticiones diferentes. Reenviará, también retendrá todos los datos de la solicitud original.

request.setAttribute ("somename", "someValue"); // to save your temporary calculations. 
2

Este es mi entendimiento de su pregunta - que desea redirigir o envío a una nueva página JSP, junto con los datos calculados en servlet, ¿verdad? Para hacerlo, debe establecer atributos de solicitud antes de enviar la solicitud.

Puede establecer atributos utilizando el objeto HttpServletRequest (req.setAttribute("attribute name", "attribute value")). El valor del atributo puede ser cualquier objeto Java.

Puede recuperar el valor req.getAttribute("attribute name"). También necesitará escribir el lanzamiento del objeto mientras la función getAttribute() del usuario.

8

Lo que quiere hacer es definir primero un objeto para representar la información de getAccounts(), algo así como AccountBean.

Luego, en su función servlets doPost o doGet, use la información de solicitud para rellenar su objeto AccountBean.

Puede almacenar el objeto AccountBean en el contexto de solicitud, sesión o servlet utilizando el método setAttribute y reenviar la solicitud a la página JSP.

Los datos de AccountBean en su página jsp se extraen utilizando las etiquetas y.

Aquí podría ser un ejemplo de nuestro servlet:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 

    // get data from request querystring 
    String accountId = req.getParameter("accountid"); 

    // populate your object with it (you might want to check it's not null) 
    AccountBean accountBean = new AccountBean(accountId); 

    // store data in session 
    HttpSession session = req.getSession(); 
    session.setAttribute("accountBean", accountBean); 

    // forward the request (not redirect) 
    RequestDispatcher dispatcher = req.getRequestDispatcher("account.jsp"); 
    dispatcher.forward(req, resp); 
} 

Entonces su página JSP tendría el siguiente para mostrar la información de la cuenta:

<jsp:useBean id="accountBean" type="myBeans.AccountBean" /> 
Your account is <jsp:getProperty name="accountBean" property="status" /> 
+0

Creo que esta es la mejor solución ... el uso de los granos de Java es más limpio que los métodos anteriores. – AJed

1

Es posible ajustar los datos dentro de Java Beans y Acceda fácilmente a esos datos en la página jsp cuando el control vaya a jsp. establezca la fecha en beans Java usando setters para acceder a esos datos en la página jsp al incluir that bean en jsp.

<%@page contentType="text/html"%> 
<jsp:useBean id="man" class="beans.Person"/> 
<jsp:setProperty name="man" property="*"/>  
First Name: <jsp:getProperty name="man" property="firstName"/> 

de esta manera puede acceder a tantas propiedades puede tener su clase de frijoles.

5

Además de lo mencionado anteriormente sobre el uso del lang de expresión, también puede pasar atributos a través de la solicitud. En doGet de servlet(), escribimos algo como:

Account[] accounts = AccountManager.getAccountList(); 
request.setAttribute("accountList", accounts); 
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl); 
rd.forward(req, resp); 

en JSP, podemos recuperar el atributo de solicitud:

<% 
    Account[] accounts= (Account[])request.getAttribute("accountList"); 

     if (accounts.length>0) {  
     for (Account account: accounts) {    
       %> 
       <blockquote>account name: <%= account.getName() %></blockquote> 
       <% 
      } 
     } 
%> 
Cuestiones relacionadas