web-dev-qa-db-fra.com

Comment appeler un servlet au chargement d'une page JSP

Je veux appeler un servlet latest_products à la charge de index.jsp page.Cette servlet a des enregistrements dans Liste. Je veux passer ça List<products> à index.jsp. Mais je ne veux pas afficher le nom du servlet dans l'URL. Existe-t-il un moyen de le faire?.

9
user3660263

Solution 1

Étapes à suivre:

  • utilisez jsp:include pour appeler le servlet à partir du JSP qui inclura la réponse du servlet dans le JSP au moment de l'exécution
  • définissez l'attribut dans la demande dans Servlet, puis lisez-le simplement dans JSP

Exemple de code:

JSP:

<body>
    <jsp:include page="/latest_products.jsp" />
    <c:out value="${message }"></c:out>
</body>

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {            
    request.setAttribute("message", "hello");
}

ÉDITER

mais je ne veux pas afficher le nom du servlet dans l'url.

Définissez simplement un url-pattern Différent et significatif pour le servlet dans le web.xml, Comme illustré ci-dessous, qui ressemble à une page JSP, mais en interne, c'est un servlet.

web.xml:

<servlet>
    <servlet-name>LatestProductsServlet</servlet-name>
    <servlet-class>com.x.y.LatestProductsServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LatestProductsServlet</servlet-name>
    <url-pattern>/latest_products.jsp</url-pattern>
</servlet-mapping>

Solution 2

Étapes à suivre:

  • premier appel au Servlet
  • traiter les derniers produits
  • définir la liste dans l'attribut de demande
  • transmettre la demande au JSP où elle est facilement accessible dans JSP en utilisant JSTL

Exemple de code:

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {            
    request.setAttribute("message", "hello");
    RequestDispatcher view=request.getRequestDispatcher("index.jsp");
    view.forward(request,response);
}

index.jsp:

<body>      
    <c:out value="${message }"></c:out>
</body>

tapez l'URL: scheme://domain:port/latest_products.jsp qui appellera la méthode doGet() du servlet.

12
Braj

(...) mais je ne veux pas afficher le nom du servlet dans l'url.

Vous n'avez pas du tout besoin d'utiliser le nom du servlet lorsque vous accédez à un servlet. En fait, vous pouvez créer votre servlet pour pointer vers l'URL souhaitée en définissant le bon modèle d'URL:

@WebServlet("/index.jsp")
public class LatestProductServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        List<Product> productList = ...
        //all the necessary code to obtain the list of products
        //store it as request attribute
        request.setAttribute("productList", productLlist);
        //forward to the desired view
        //this is the real JSP that has the content to display to user
        request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
    }
}

Ensuite, vous aurez une structure de dossiers comme celle-ci

- <root folder>
  - WEB-INF
    + index.jsp
    + web.xml

Et dans WEB-INF/index.jsp:

<!DOCTYPE html>
<html lang="es">
    <body>
        <!--
            Display the data accordingly.
            Basic quick start example
        -->
        <c:forEach items="${productList}" var="product">
            ${product.name} <br />
        </c:forEach>
    </body>
</html>

Notez que vos clients auront accès à http://<yourWebServer>:<port>/<yourApplication>/index.jsp et obtiendra le contenu souhaité. Et vous n'avez pas besoin de déclencher deux demandes GET pour récupérer le contenu de votre page spécifique.

Notez que vous pouvez aller plus loin avec cette approche: le modèle étant désormais défini dans le servlet, vous pouvez choisir de ne pas utiliser index.jsp pour vos clients, mais index.html pour accéder à votre page. Modifiez simplement le modèle d'URL dans le servlet:

@WebServlet("/index.html")
public class LatestProductServlet extends HttpServlet {
     //implementation...
}

Et les clients auront accès à http://<yourWebServer>:<port>/<yourApplication>/index.html, qui affichera les résultats dans WEB-INF/index.jsp. Maintenant, vos clients et vous serez heureux: les clients obtiendront leurs données et vous n'afficherez pas ce nom de servlet laid dans votre URL.


supplémentaire

Si vous avez index.jsp comme page d'accueil dans web.xml, cette approche ne fonctionnera pas car le servlet d'application s'attend à ce qu'il existe un véritable fichier index.jsp. Pour résoudre ce problème , créez simplement un fichier vide nommé index.jsp:

- <root folder>
  - index.jsp  <-- fake empty file to trick the application server
  - WEB-INF
    + index.jsp
    + web.xml

Et lorsque vous accédez à http://<yourWebServer>:<port>/<yourApplication>/, fonctionnera comme indiqué ci-dessus.

6
Luiggi Mendoza

Grâce à + Braj, je suis en mesure de répondre en utilisant le langage d'expression. Apparemment, cela est censé être meilleur que les scripts/balises jsp.

Servlet -

import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ProductList extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public ProductList() {
        super();
        // TODO Auto-generated constructor stub
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<String> products = new ArrayList<String>();
        products.add("Car");
        products.add("Gun");
        products.add("Shades");

        request.setAttribute("productsList", products);
    }


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

    }

}

JSP -

<%@ page language="Java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<c:import url="/ProductList" />

<c:set var="myProducts" value="${requestScope.productsList}" />

<h1>List of products from servlet</h1>
<c:forEach var="product" items= "${myProducts}" varStatus="i">
${product}<br>
</c:forEach>

</body>
</html>
0
Borat Sagdiyev