web-dev-qa-db-fra.com

Différence entre le mécanisme d'inclusion et de transfert pour le concept de répartition des demandes?

Forward (): Cela peut être fait de deux manières par Request & ServeletContext. Transférer une demande d'un servlet à une autre ressource (servlet, fichier JSP ou fichier HTML) sur le serveur. Le transfert se fait côté serveur, à l'insu du client.

Lorsque vous appelez une demande de transfert, la demande est envoyée à une autre ressource sur le serveur, sans que le client soit informé qu'une autre ressource va traiter la demande. Ce processus se produit complètement avec dans le conteneur Web.

Simplement

inclure: inclura un autre fichier dans notre fichier actuel

forward: transmettra la demande en cours à la page de transfert

40
Ajay Takur

La principale différence est que lorsque vous utilisez forward le contrôle est transféré vers le prochain servlet/jsp que vous appelez, tandis que include conserve le contrôle avec le servlet actuel, il inclut simplement le traitement effectué par le servlet/jsp appelant (comme pour tout traitement out.println ou autre).

32
mtk

La différence entre les deux balises réside dans la façon dont elles fonctionnent. Eh bien, je vais vous donner un exemple pour que vous puissiez mieux l'imaginer.

Supposons que vous ayez deux pages, pageA et pageB. Dans la page A, vous avez écrit la balise include. Dans ce cas, le contrôle était dans la pageA jusqu'à ce que vous appeliez la balise include. À ce stade, le contrôle total va à la pageB. Une fois terminé, le contrôle est retourné à la pageA à partir du point de codage suivant après la balise include et continue jusqu'au reste de la pageA.

Eh bien, pour clarifier les choses, disons que nous avons les mêmes pages, pageA et pageB, mais cette fois, nous utiliserons la balise forward dans la pageA, pas la balise include. Encore une fois, le contrôle commencera dans la pageA jusqu'à ce que nous appelions la balise forward dans la pageA, à ​​ce stade, le contrôle est transféré vers la pageB, tout comme la balise include. Mais la différence est ce qui se passe lorsque la pageB se termine. Dans le cas de la balise forward, le contrôle ne revient plus à la pageA.

63
AmrAngry

inclure (demande, réponse);

Si la ressource est statique, la méthode include active les inclusions programmatiques côté serveur. Si la ressource est un composant Web, la méthode a pour effet d'envoyer la demande au composant Web inclus, d'exécuter le composant Web, puis d'inclure le résultat de l'exécution dans la réponse du servlet contenant.

Un composant Web inclus a accès à l'objet de demande mais est limité dans ce qu'il peut faire avec l'objet de réponse.

  • Il peut écrire dans le corps de la réponse et valider une réponse.
  • Il ne peut pas définir d'en-têtes ni appeler aucune méthode, telle que setCookie, qui affecte les en-têtes de la réponse.

Il est souvent utile d'inclure une autre ressource Web, telle que du contenu de bannière ou des informations de copyright) dans la réponse renvoyée par un composant Web.

transmettre (demande, réponse);

Dans certaines applications, vous souhaiterez peut-être qu'un composant Web effectue le traitement préliminaire d'une demande et qu'un autre composant génère la réponse. Par exemple, vous souhaiterez peut-être traiter partiellement une demande, puis la transférer vers un autre composant, selon la nature de la demande.

Pour transférer le contrôle vers un autre composant Web, vous appelez la méthode directe d'un RequestDispatcher. Lorsqu'une demande est transférée, l'URL de la demande est définie sur le chemin de la page transférée. L'URI d'origine et ses composants sont enregistrés en tant qu'attributs de demande.

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]  

La méthode forward doit être utilisée pour confier à une autre ressource la responsabilité de répondre à l'utilisateur. Si vous avez déjà accédé à un objet ServletOutputStream ou PrintWriter dans le servlet, vous ne pouvez pas utiliser cette méthode; cela génère une IllegalStateException .

Liens connexes

26
Aniket Kulkarni

La principale différence entre les deux est que la méthode forward () FERMERA le flux de sortie après son appel, tandis que la méthode include laisse le flux de sortie OUVERT.

répondre avec un exemple: permet d'avoir une page de servlet nommée xxx.Java et une page jsp nommée yy.jsp

Dans le yy.jsp

WELCOME to yy.jsp

Dans le xxx.Java // en utilisant forward ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

sortie

WELCOME to yy.jsp 

Dans le xxx.Java // en utilisant include ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

sortie

WELCOME to yy.jsp back to servlet

MAIS LE PLUS IMPORTANT, C'EST PAS SUR LE CONTRÔLE, PARCE QUE SI WE PUT a

System.out.println("console output");

après l'une des invocations .forward() ou .include(), la sortie de la console sera générée dans chaque cas .Il s'agit de la réponse au client

Donc, la partie de base est que si nous traitons dans un composant côté serveur et que nous transmettons ensuite à un JSP ou à un servlet afin de générer un balisage pour un client, une fois que ce JSP ou ce servlet a terminé le traitement, nous ne pouvons plus faire appel à d'autres composants pour générer un balisage qui peut être envoyé au client. Une fois que nous avons effectué un transfert, la génération du balisage pour le cycle de demande et de réponse en cours est terminée.

Alternativement, avec une inclusion, le flux de sortie reste ouvert, nous pouvons donc appeler autant de fichiers différents pour générer le balisage côté client dont nous avons besoin. Nous pouvons donc inclure deux ou trois fichiers JSP et même un servlet dans la chaîne de composants qui génèrent un balisage client. Lorsque nous utilisons une inclusion, le flux de sortie n'est pas fermé après l'invocation.

8
uttsav