Différence entre le mécanisme include et forward pour le concept de répartition des demandes?
Forward (): cela peut être fait de deux façons par requête & ServeletContext. Transfert d'une requête d'un servlet vers une autre ressource (servlet, JSP fichier, ou fichier HTML) sur le serveur. Forward se fait à côté serveur, à l'insu du client.
Lorsque vous appelez une demande de transfert, la demande est envoyée à un autre ressource sur le serveur, sans que le client soit informé qu'un une ressource différente va traiter la demande. Ce le processus se produit complètement dans le web conteneur.
Simplement
Include: inclura un autre fichier dans notre fichier actuel
Forward: redirige la requête en cours vers la page de redirection
4 réponses
La principale différence est que lorsque vous utilisez forward le contrôle est transféré au servlet/jsp suivant 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 faire tout out.println ou autre traitement).
La différence entre les deux balises est que la façon dont ils fonctionnent. Eh bien, je vais dites un exemple pour que vous puissiez l'imaginer mieux.
Supposons que vous avez deux pages, pageA et pageB. Dans pageA vous avez écrit la balise include. Dans ce cas, le contrôle était dans pageA jusqu'à ce que vous appeliez la balise include. À ce pointez le contrôle total va à pageB. Quand C'est fait, le contrôle est retourné à pageA à partir du point de codage suivant après la balise include et continue pour le reste de pageA.
Eh bien, pour que les choses soient beaucoup plus claires, disons que nous avons les mêmes pages, pageA et pageB, mais cette fois, nous allons utiliser la balise forward dans pageA, pas le inclure balise. Encore une fois, le contrôle commencera dans pageA jusqu'à ce que nous appelions la balise avant pageA, à ce stade, le contrôle est transféré à pageB, tout comme la balise include. Mais la différence est ce qui se passe lorsque pageB se termine. Dans le cas de l'attaquant tag, le contrôle ne retourne plus à pageA.
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, l'effet de la méthode est d'envoyer la demande au composant web, exécuter le composant web, et puis d'inclure le résultat de l'exécution dans la réponse de l'contenant de la servlet.
Un composant Web inclus a accès à l'objet request mais est limité dans ce qu'il peut faire avec la réponse de l'objet.
- Il peut écrire dans le corps de la réponse et valider une réponse.
- Il ne peut pas définir les en-têtes ou appeler une 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 le contenu d'une bannière ou des informations sur les droits d'auteur) dans la réponse renvoyée par un composant web.
Transmettre(demande, réponse);
, Dans certaines applications, vous pouvez demandez à un composant web de faire le traitement préliminaire d'une demande et demandez à un autre composant de générer la réponse. Par exemple, vous pouvez traiter partiellement une requête, puis la transférer vers un autre composant, selon la nature de la requête.
Pour transférer le contrôle vers un autre composant web, vous appelez la méthode forward D'un RequestDispatcher. Lorsqu'une demande est transmise, L'URL de la demande est définie sur le chemin de la page transmise. L'URI d'origine et ses parties constitutives sont enregistrés en tant qu'attributs de requête.
javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]
La méthode forward doit être utilisée pour donner à 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 déclenche uneIllegalStateException .
Liens Connexes
La principale différence entre les deux est que la méthode forward() fermera le flux de sortie après son appel, alors 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 l'aa.jsp
WELCOME to yy.jsp
Dans le xxx.java //utilisation d'avancer()
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 //utilisation de la 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 surtout ce N'est pas sur le contrôle, parce que si nous mettons un
System.out.println("console output");
Après l'appel .forward()
ou .include()
, la sortie de la console sera générée sur chaque cas. C'est à propos de la réponse au client
Donc, la partie de base est si nous traitons dans un composant côté serveur, puis vers un JSP ou un Servlet afin de générer un balisage pour un client, une fois que JSP ou 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 de balisage pour le cycle de demande et de réponse en cours est terminée.
Alternativement, avec un include, le flux de sortie reste ouvert, de sorte que nous pouvons 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 cela génère un balisage basé sur le client. Lorsque nous utilisons un include, le flux de sortie n'est pas fermé après l'invocation.