Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de navigation dans une application web...

8 réponses
Avatar
Patrick Gelin
Bonjour,

Je fait une application WEB avec TOMCAT celon une architecture MVC. Je
rencontre un problème dans le système de navigation...

Ma page d'accueil est un formulaire à l'url:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsFormView

Dons cette page JSP le code du formulaire commence par:

<form name = "formulaire" method = "post" action = "ElmtCtrl/NewsPreview"
onSubmit = "return verifierFormulaire();">

Le submit envoie le contenu à la servlet ElmtCtrl, dans laquelle l'appel à
l'API getPathInfo retourne /NewsFormView, et c'est correct. Après ce
traitement l'utilisateur accède à une JSP de prévisualisation à l`adresse:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsPreview

Dans cette prévisualisation l'utilisateur peut revenir au formulaire initial
en appuyant sur un bouton "Précédant". Le code JSP permettant cela est
ci-dessous:

<form name="formulaire" method="post" action="ElmtCtrl/NewsFormView">
        <input type="submit" name="Submit" value="Précédent..."/>
</form>

Mais là il y a un problème car la servlet ElmtCtrl voit l'url suivante pour
la requête:

http://localhost:8080/webapp_newsevent/ElmtCtrl/ElmtCtrl/NewsFormView

Le problème est qu'il y a deux fois ElmtCtrl dans ce second cas et pas dans
le premier...

Quelqu'un peut il m'expliquer pourquoi?

Merci pour votre aide.
--

8 réponses

Avatar
damien guerin
Dans le code pour le bouton précédent tu peut mettre :

action="../ElmtCtrl/NewsFormView"­

Sinon non, je sais pas ! ;)
Avatar
JScoobyCed
Patrick Gelin wrote:
Bonjour,

Je fait une application WEB avec TOMCAT celon une architecture MVC. Je
rencontre un problème dans le système de navigation...

Ma page d'accueil est un formulaire à l'url:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsFormView

Dons cette page JSP le code du formulaire commence par:

<form name = "formulaire" method = "post" action = "ElmtCtrl/NewsPreview"
onSubmit = "return verifierFormulaire();">

Le submit envoie le contenu à la servlet ElmtCtrl, dans laquelle l'appel à
l'API getPathInfo retourne /NewsFormView, et c'est correct. Après ce
traitement l'utilisateur accède à une JSP de prévisualisation à l`adresse:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsPreview

Dans cette prévisualisation l'utilisateur peut revenir au formulaire initial
en appuyant sur un bouton "Précédant". Le code JSP permettant cela est
ci-dessous:

<form name="formulaire" method="post" action="ElmtCtrl/NewsFormView">
<input type="submit" name="Submit" value="Précédent..."/>
</form>

Mais là il y a un problème car la servlet ElmtCtrl voit l'url suivante pour
la requête:

http://localhost:8080/webapp_newsevent/ElmtCtrl/ElmtCtrl/NewsFormView

Le problème est qu'il y a deux fois ElmtCtrl dans ce second cas et pas dans
le premier...

Quelqu'un peut il m'expliquer pourquoi?

Merci pour votre aide.


Cela depend du code qui est dans votre servlet. Un bout de code pourrait
reveler quelque chose.
J'utilise toujours le chemin complet dans mes
"action='http://server:port/foo/bar'", ce qui fait que le parsing est
toujours le meme.

--
JSC

Avatar
Patrick Gelin
JScoobyCed wrote:

Patrick Gelin wrote:
Bonjour,

Je fait une application WEB avec TOMCAT celon une architecture MVC. Je
rencontre un problème dans le système de navigation...

Ma page d'accueil est un formulaire à l'url:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsFormView

Dons cette page JSP le code du formulaire commence par:

<form name = "formulaire" method = "post" action = "ElmtCtrl/NewsPreview"
onSubmit = "return verifierFormulaire();">

Le submit envoie le contenu à la servlet ElmtCtrl, dans laquelle l'appel
à l'API getPathInfo retourne /NewsFormView, et c'est correct. Après ce
traitement l'utilisateur accède à une JSP de prévisualisation à
l`adresse:

http://localhost:8080/webapp_newsevent/ElmtCtrl/NewsPreview

Dans cette prévisualisation l'utilisateur peut revenir au formulaire
initial en appuyant sur un bouton "Précédant". Le code JSP permettant
cela est ci-dessous:

<form name="formulaire" method="post" action="ElmtCtrl/NewsFormView">
<input type="submit" name="Submit" value="Précédent..."/>
</form>

Mais là il y a un problème car la servlet ElmtCtrl voit l'url suivante
pour la requête:

http://localhost:8080/webapp_newsevent/ElmtCtrl/ElmtCtrl/NewsFormView

Le problème est qu'il y a deux fois ElmtCtrl dans ce second cas et pas
dans le premier...

Quelqu'un peut il m'expliquer pourquoi?

Merci pour votre aide.


Cela depend du code qui est dans votre servlet. Un bout de code pourrait
reveler quelque chose.
J'utilise toujours le chemin complet dans mes
"action='http://server:port/foo/bar'", ce qui fait que le parsing est
toujours le meme.

--
JSC


Le code qui est dans ma servlet ElmtCtrl est:

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {

RequestDispatcher dispatcher = null;
ServletContext context = getServletContext();

try{
String name = arg0.getPathInfo();
name = name.substring(1);

if ("NewsFormView".equals(name)) {
...

dispatcher = context.getNamedDispatcher(name);
if (dispatcher == null){
throw (new Exception());
}
} catch(Exception e){
log("Exception in ElmtCtrl.doGet()");
dispatcher = context.getNamedDispatcher("ErrorView");
} finally {
dispatcher.forward(arg0, arg1);
}

et cela est la même chose pour doPost qui commence de la même manière...

Ce qu'il me faudrait comprendre c'est quel est la racine du chemin relatif.
Il semble qu'apres un accès dans une servlet ce soit la servlette elle
même... Mais alors comment traiter le cas de la page d'accueil qui peut
être accédée itnitiallement directement depuis l'extérieur, donc avec une
racine qui est le répertoire racine de l'application mais aussi depuis
d'autres servlettes, et dans ce cas la racine est la servlette source?

A+
--


Avatar
JScoobyCed
Patrick Gelin wrote:
dispatcher = context.getNamedDispatcher(name);
if (dispatcher == null){
throw (new Exception());
}


Dans le ServletContext.getNamedDispatcher(String), cela return le
dispatcher qui correspond a ce qui est configure (par la console
d'administration si elle existe dans le serveur d'application, ou dans
le descripteur de deploiement).
Si vous utilisez le web.xml pour declarer vos JSPs et Servlets, peut
etre que la solution est la.
C'est tout ce que je vois pour le moment.

--
JSC

Avatar
Patrick Gelin
JScoobyCed wrote:

Patrick Gelin wrote:
dispatcher = context.getNamedDispatcher(name);
if (dispatcher == null){
throw (new Exception());
}


Dans le ServletContext.getNamedDispatcher(String), cela return le
dispatcher qui correspond a ce qui est configure (par la console
d'administration si elle existe dans le serveur d'application, ou dans
le descripteur de deploiement).
Si vous utilisez le web.xml pour declarer vos JSPs et Servlets, peut
etre que la solution est la.
C'est tout ce que je vois pour le moment.

--
JSC
C'est ce que je pense aussi mais je ne vois pas le problème. Mon descripteur

web.xml est le suivant:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>j2EE news and events for RPN</display-name>

<servlet>
<servlet-name>ActionCtrl</servlet-name>
<servlet-class>osis.jahia1.ActionCtrl</servlet-class>
</servlet>

<servlet>
<servlet-name>CollectionCtrl</servlet-name>
<servlet-class>osis.jahia1.CollectionCtrl</servlet-class>
</servlet>

<servlet>
<servlet-name>ElmtCtrl</servlet-name>
<servlet-class>osis.jahia1.ElmtCtrl</servlet-class>
</servlet>

<servlet>
<servlet-name>CollectionView</servlet-name>
<jsp-file>/CollectionView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>EventEditView</servlet-name>
<jsp-file>/EventEditView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>EventFormView</servlet-name>
<jsp-file>/EventFormView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>EventPreview</servlet-name>
<jsp-file>/EventPreview.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>LockedObjectView</servlet-name>
<jsp-file>/LockedObjectView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>NewsEditView</servlet-name>
<jsp-file>/NewsEditView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>NewsFormView</servlet-name>
<jsp-file>/NewsFormView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>NewsPreview</servlet-name>
<jsp-file>/NewsPreview.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>ThanksView</servlet-name>
<jsp-file>/ThanksView.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>ErrorView</servlet-name>
<jsp-file>/ErrorView.jsp</jsp-file>
</servlet>

<servlet-mapping>
<servlet-name>ActionCtrl</servlet-name>
<url-pattern>/ActionCtrl/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>CollectionCtrl</servlet-name>
<url-pattern>/CollectionCtrl/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>ElmtCtrl</servlet-name>
<url-pattern>/ElmtCtrl/*</url-pattern>
</servlet-mapping>

<resource-ref>
<res-ref-name>jdbc/rpn_database</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

<welcome-file-list>
<welcome-file>ElmtCtrl/NewsFormView</welcome-file>
</welcome-file-list>

</web-app>

Lorsque je demande NewsFormView j'obtiens url_base/NewsFermView.jsp. Le
problème c'est que la base change celon l'origine de la requête... parfois
c'est:

http://localhost:8080/webapp_newsevent

et d'autres fois c'est:

http://localhost:8080/webapp_newsevent/ElmtCtrl

Alors que faut il modifier pour que cela ne pose plus de problème?
--


Avatar
JScoobyCed
Patrick Gelin wrote:
<welcome-file-list>
<welcome-file>ElmtCtrl/NewsFormView</welcome-file>
</welcome-file-list>

</web-app>



Quand vous demandez:
http://localhost:8080/webapp_newsevent


Le <welcome-file> repond ElmtCtrl/NewsFormView, qui est ajoute a l'URL
de base: http://localhost:8080/webapp_newsevent

Du coup, comme vous le precisez, l'URL de base devient (pour le browser,
car il ne peut faire la distinction entre servlet et repertoire pour
"ElmtCtrl") :

http://localhost:8080/webapp_newsevent/ElmtCtrl


Donc je pense qu'il suffit de retirer "ElmtCtrl" du cahmp 'action':

<form name="formulaire"
method="post"
action="NewsPreview"
onSubmit="return verifierFormulaire();">

Cela fonctionne tant que vous utilisez le meme servlet. Sinon il faut
utiliser l'URL absolue au lieu de l'URL relative.

--
JSC

Avatar
Lionel
Patrick Gelin wrote:

<form name = "formulaire" method = "post" action > "ElmtCtrl/NewsPreview" onSubmit = "return verifierFormulaire();">


Il suffit de tjs utiliser un chemin relatif à la racine, cela résoudra tous
tes problèmes:
action="<%=request.getContextPath()%>/ElmtCtrl/NewsPreview"

Sauf erreur, request.getContextPath() devrait renvoyer "/webapp_newsevent"

Quelqu'un peut il m'expliquer pourquoi?


Parce que le répertoire courant a changé....

Avatar
Patrick Gelin
JScoobyCed wrote

Patrick Gelin wrote:
<welcome-file-list>
<welcome-file>ElmtCtrl/NewsFormView</welcome-file>
</welcome-file-list>

</web-app>



Quand vous demandez:
http://localhost:8080/webapp_newsevent


Le <welcome-file> repond ElmtCtrl/NewsFormView, qui est ajoute a l'URL
de base: http://localhost:8080/webapp_newsevent

Du coup, comme vous le precisez, l'URL de base devient (pour le browser,
car il ne peut faire la distinction entre servlet et repertoire pour
"ElmtCtrl") :

http://localhost:8080/webapp_newsevent/ElmtCtrl


Donc je pense qu'il suffit de retirer "ElmtCtrl" du cahmp 'action':

<form name="formulaire"
method="post"
action="NewsPreview"
onSubmit="return verifierFormulaire();">

Cela fonctionne tant que vous utilisez le meme servlet. Sinon il faut
utiliser l'URL absolue au lieu de l'URL relative.

--
JSC


J'ai déjà fait cet essai et cela ne fonctionne pas...

1) Quand je demande pour la première fois avec une requête GET:

http://localhost:8080/webapp_newsevent

Le paramètre welcome-file dans web.xml:

<welcome-file-list>
<welcome-file>ElmtCtrl/NewsFormView</welcome-file>
</welcome-file-list>

me redirige sur la page d'acceuil mais l'url de base est encore
http://localhost:8080/webapp_newsevent, et mon formulaire doit avoir le
code suivant:

<form name="formulaire"
method="post"
action="ElmtCtrl/NewsPreview"
onSubmit="return verifierFormulaire();">

2) Mais lorsque j'appuie sur le bouton submit de ce formulaire, je fait une
requête POST qui est redirigée par le servlet-mapping:

<servlet-mapping>
<servlet-name>ElmtCtrl</servlet-name>
<url-pattern>/ElmtCtrl/*</url-pattern>
</servlet-mapping>

sur ma page d'acceuil, mais cette fois l'url de base change sa valeur pour:

http://localhost:8080/webapp_newsevent/ElmtCtrl

Il semble donc que l'url de base n'est pas été affectée par le GET sinon le
<welcome-file>, mais par le POST sinon le <servlet-mapping> ...

il faut absolument que je trouve comment accéder à la page d'acceuil avec
toujours le même chemin de base, sinon mon action de formulaire ne
fonctionnera qu'une fois sur deux...

Merci encore pour votre aide!
--
PGE
--