Je suis un développeur PHP mais j'ai récemment dû travailler sur un projet utilisant Google App Engine (Java). En PHP je peux faire quelque chose comme ça ( en terme de modèle MVC):
// controllers/accounts.php
$accounts = getAccounts();
include "../views/accounts.php";
// views/accounts.php
print_r($accounts);
Je regarde quelques démos de Google App Engine Java utilisant Servlet et JSP. Ce qu'ils font est le suivant:
// 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"));
}
}
Fondamentalement, dans le cas Java, il s'agit de 2 requêtes HTTP différentes (la seconde étant automatiquement forcée), non? Donc, dans le fichier JSP, je ne peux pas utiliser les données calculées dans le servlet.
Existe-t-il un moyen de le faire similaire à la méthode PHP?
Vous devrez définir les données récupérées dans le servlet dans la portée de la demande afin que les données soient disponibles dans JSP
Vous aurez la ligne suivante dans vos servlets.
List<Account> accounts = getAccounts();
request.setAttribute("accountList",accounts);
Ensuite, dans JSP, vous pouvez accéder à ces données en utilisant le langage d'expression comme ci-dessous
${accountList}
J'utiliserais les dépêches de demande au lieu de sendRedirect
comme suit
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(req, res);
Si vous pouvez utiliser RequestDispatcher
, vous pouvez stocker ces valeurs dans l'objet request
ou session
et accéder à d'autres JSP.
Y a-t-il un but spécifique d'utiliser request.sendRedirect
?. Sinon, utilisez RequestDispatcher
.
Voir ce lien pour plus de détails .
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);
}
}
Ce que vous voulez faire, c'est d'abord définir un objet pour représenter les informations de getAccounts () - quelque chose comme AccountBean.
Ensuite, dans la fonction doPost ou doGet de vos servlets, utilisez les informations de demande pour remplir votre objet AccountBean.
Vous pouvez ensuite stocker l'objet AccountBean dans le contexte de demande, de session ou de servlet à l'aide de la méthode setAttribute et transmettre la demande à la page JSP.
Les données AccountBean de votre page jsp sont extraites à l'aide des balises et.
Voici peut-être un exemple de votre 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);
}
Votre page JSP aurait alors les éléments suivants pour afficher les informations de compte:
<jsp:useBean id="accountBean" type="myBeans.AccountBean" />
Your account is <jsp:getProperty name="accountBean" property="status" />
Outre ce qui est mentionné ci-dessus à propos de l'utilisation de l'expression lang, vous pouvez également passer des attributs via la demande elle-même. Dans doGet () de Servlet, nous écrivons quelque chose comme:
Account[] accounts = AccountManager.getAccountList();
request.setAttribute("accountList", accounts );
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl);
rd.forward(req, resp);
Dans JSP, nous pouvons récupérer l'attribut de la demande:
<%
Account[] accounts= (Account[])request.getAttribute("accountList");
if (accounts.length>0) {
for (Account account: accounts) {
%>
<blockquote>account name: <%= account.getName() %></blockquote>
<%
}
}
%>
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 ();
}
}
}
Dans le code ci-dessus, le servlet ne créera pas 2 demandes différentes. Il transmettra et conservera également toutes les données de la demande d'origine.
request.setAttribute ("somename", "someValue"); // to save your temporary calculations.
C'est ma compréhension de votre question - vous voulez rediriger ou envoyer vers une nouvelle page JSP avec les données calculées dans Servlet, non? Pour ce faire, vous devez définir les attributs de demande avant d'envoyer la demande.
Vous pouvez définir des attributs à l'aide de l'objet HttpServletRequest
(req.setAttribute("attribute name", "attribute value")
). La valeur d'attribut peut être n'importe quel objet Java.
Vous pouvez récupérer la valeur par req.getAttribute("attribute name")
. Vous devrez également taper cast l'objet pendant que la fonction getAttribute () de l'utilisateur.
Vous pouvez définir les données dans Java beans et accéder facilement à ces données sur la page jsp lorsque le contrôle passe à jsp. Définir la date dans Java beans utilisant des setters obtenir l'accès ces données sur la page jsp en incluant ce bean dans 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"/>
comme cela, vous pouvez accéder à autant de propriétés que votre classe de bean peut avoir.