IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

Méthode unspecified toujours appelée aprés la méthode définie dans parameter


Sujet :

Struts 1 Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Méthode unspecified toujours appelée aprés la méthode définie dans parameter
    bonjour,
    J'ai une application qui utilise struts et particulièrement les DispatchAction
    Dans une de mes classes action, j'implémente la méthode unspecified :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    protected ActionForward unspecified(final ActionMapping mapping, final ActionForm form,final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponseresponse)
    Dans ma jsp, j'ai un lien qui appelle une fonction javascript dans laquelle je soumet le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="javascript:loadImage(link);">Charger</a>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function loadImage(link) {
    	document.forms[0].method.value = "loadImage";
    	document.forms[0].imageLink.value = link;
    	document.forms[0].submit();
    }
    Lorsque je clique sur le lien, je vais bien dans la méthode loadImage de mon action et le résultat s'affiche correctement dans ma jsp.

    Par contre, la méthode unspecified est ensuite appelée immédiatement aprés la méthode loadImage de mon action.
    Je ne comprend pas d'où peut venir ce problème.
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Peux-tu montrer le code de la classe DispatchAction et le paramétrage struts-config.xml ?

    Il y a un truc que je ne comprends pas, ta méthode s'appelle unspecified et tu mets "loadImage" dans "method" (je suppose que c'est le nom associé à l'attribut "parameter")

    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Oui, "method" est le nom associé à l'attribut "parameter"

    StrutsConfig :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <action path="/secure/ChannelDetail" name="ChannelDetailForm" parameter="method"
                type="org.springframework.web.struts.DelegatingActionProxy" scope="request" validate="false"
                input="page.channels.details">
                <forward name="detail" path="/secure/Channel.do?method=detail" />
                <forward name="success" path="page.channels.details" />
                <forward name="error" path="page.channels.details" />
            </action>
     
    <action path="/secure/Channel" type="org.springframework.web.struts.DelegatingActionProxy"
                scope="request" validate="false" parameter="method">
                <forward name="list" path="/secure/ChannelsList.do" />
                <forward name="find" path="/secure/ChannelsList.do?method=find" />
                <forward name="detail" path="/secure/ChannelDetail.do?method=detail" />
                <forward name="delete" path="/secure/ChannelsList.do?method=delete" />
                <forward name="profilesList" path="/secure/ChannelsList.do?method=profilesList" />
                <forward name="profileDetail" path="/secure/ProfileRightsDetail.do?method=detail" />
                <forward name="deleteProfile" path="/secure/ChannelsList.do?method=deleteProfile" />
            </action>

    Mon action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
    /**
         * {@inheritDoc}
         * 
         * @see org.apache.struts.actions.DispatchAction#unspecified(org.apache.struts.action.ActionMapping,
         *      org.apache.struts.action.ActionForm,
         *      javax.servlet.http.HttpServletRequest,
         *      javax.servlet.http.HttpServletResponse)
         */
        @Override
        protected ActionForward unspecified(final ActionMapping mapping,
                                            final ActionForm form,
                                            final javax.servlet.http.HttpServletRequest request,
                                            final javax.servlet.http.HttpServletResponse response)
            throws java.lang.Exception {
            SufficientProfileRights.isAccessAllowed(request,
                                                    SufficientProfileRights.FCTN_SETTINGS_CHANNEL);
            return mapping.findForward("detail");
        }
     
    /**
         * Load the image file selected
         * 
         * @param mapping
         * @param form
         * @param request
         * @param response
         * @return
         */
        public ActionForward loadImage(final ActionMapping mapping,
                                       final ActionForm form,
                                       final HttpServletRequest request,
                                       final HttpServletResponse response) throws Exception {
     
            SufficientProfileRights.isAccessAllowed(request,
                                                    SufficientProfileRights.FCTN_SETTINGS_CHANNEL);
     
            Set<Contact> contacts = null;
     
            // Get the information in form
            // ============================
            ChannelDetailForm channelDetailForm = (ChannelDetailForm) form;
            FormFile[] mediaLogoFiles = channelDetailForm.getMediaLogoFile();
            FormFile channelLogoFile = channelDetailForm.getChannelLogoFile();
            String channelId = channelDetailForm.getChannelId();
            String imageLink = channelDetailForm.getImageLink();
     
            BufferedImage imageBuffer = null;
            ActionErrors errors;
            try {
     
                // Get the content of the file
                byte[] fileData = channelLogoFile.getFileData();
                imageBuffer = ImageIO.read(channelLogoFile.getInputStream());
     
                if (imageBuffer == null) {
     
                    errors = removeErrors(ChannelDetailForm.FIELD_CHANNEL_LOGO_URL, errors);
                    errors.add(ChannelDetailForm.FIELD_CHANNEL_LOGO_URL,
                               new ActionMessage("error.field.file.image.invalid"));
     
                } else {
     
                    // Instanciate a new ImageDto
                    ImageDto imageDto = new ImageDto();
                    imageDto.addAttribute(ImageDto.STR_ORIGIN_KEY, ImageDto.ORIGIN_VALUE_MEMORY);
                    if ((channelId == null) || (channelId.length() <= 0)) {
                        imageDto.addAttribute(ImageDto.INT_CHANNEL_ID_KEY,
                                              ChannelDetailAction.CHANNEL_ID_NEW);
                    } else {
                        imageDto.addAttribute(ImageDto.INT_CHANNEL_ID_KEY, channelId);
                    }
     
                    // Store the content of the image file
                    final SessionContextData sessionContextData = getSessionContextData(request);
                    sessionContextData.putImage(imageDto, fileData);
     
                    // Get the url of the image file stored
                    String imageFileUrl = helperTool.getImageUrlForImageDto(imageDto);
     
                    // Update the channel logo url
                    channelDetailForm.setChannelLogoUrl(imageFileUrl);
                }
     
            } catch (IOException e) {
                errors = removeErrors(ChannelDetailForm.FIELD_CHANNEL_LOGO_URL, errors);
                errors.add(ChannelDetailForm.FIELD_CHANNEL_LOGO_URL,
                           new ActionMessage("error.file.read"));
                LOGGER.error("Cannot read the channel logo for channel " + channelId);
            }
     
            if (errors != null && !errors.isEmpty()) {
                saveErrors(request, errors);
            }
     
            // save information in request
            request.setAttribute("ChannelDetailForm", channelDetailForm);
     
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("ChannelDetailAction.loadImage : END");
            }
            return mapping.findForward("success");
        }
    @+

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas pourquoi tu passes dans unspecified à ce stade, peut-être une action citée dans struts-tiles.xml (peux-tu le montrer également ?)

    Dans tous les cas, tu devrais retirer "final" devant tes paramètres, au moins, tu passeras dans cette implémentation et pas dans celle par défaut...

    a+

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    fichier applicationContext-actionServlet.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <bean name="/secure/Channel"
    	class="com.francetelecom.rd.tvod.servicemanager.web.gui.action.ActionDispatcher" />
     
    <bean name="/secure/ChannelsList"
    	class="com.francetelecom.rd.tvod.servicemanager.web.gui.action.ChannelsListAction"
    	parent="abstractAction" />
     
    <bean name="/secure/ChannelDetail"
    	class="com.francetelecom.rd.tvod.servicemanager.web.gui.action.ChannelDetailAction"
    	parent="abstractAction">
    </bean>

    Fichier tiles-defs.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <definition name="page.channels.list" extends="base.definition.style2">
    	<put name="body" value="/jsp/channels/channelsList.jsp" />
    </definition>
     
    <definition name="page.channels.details" extends="base.definition.style2">
    	<put name="body" value="/jsp/channels/channelDetails.jsp" />
    </definition>
     
    <definition name="page.profilesRights.list" extends="base.definition.style2">
    	<put name="body" value="/jsp/profilesRights/profilesRightsList.jsp" />
    </definition>
     
    <definition name="page.profilesRights.details" extends="base.definition.style2">
    	<put name="body" value="/jsp/profilesRights/profileRightsDetails.jsp" />
    </definition>
     
    <definition name="page.contacts.list" extends="base.definition.style2">
    	<put name="body" value="/jsp/contacts/contactsList.jsp" />
    </definition>
     
    <definition name="page.contacts.listOfChannel" extends="base.definition.style2">
    	<put name="body" value="/jsp/contacts/contactsListOfChannel.jsp" />
    </definition>
     
    <definition name="page.contacts.details" extends="base.definition.style2">
    	<put name="body" value="/jsp/contacts/contactDetails.jsp" />
    </definition>
    Pour tout dire, le code que je t'ai montré fonctionnait très bien et je n'avais pas ce souci du unspecified appelé systématiquement avant.
    Je m'en suis rendue comte en faisant des tests de non régression qui ont montré des effets de bords.
    Je ne suis pas seule sur le projet car il y a d'autres personnes. il se peut qu'une modif de ma part ou de la leur soit la cause du souci.
    J'ai longtemps cherché mais je ne vois pas quoi.
    A ton avis, qu'est ce qui pourrait (en général), faire que la méthode unspecified soit déclenchée???
    Merci.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Typiquement, une soumission du formulaire sans initialisation du champ "method" (ou mauvaise initialisation).
    Ca peut arriver avec un F5 sur la page...
    Tu mets toujours une valeur par défaut dedant ?

    Autre chose (déjà dite), je pense que les "final" peuvent poser problème, je ne suis pas certain que la signature de la méthode soit la même (à vérivier)

    A+

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Ce n'est pas un problème d'initialisation du champ "method" ni de F5.
    J'ai aussi testé en enlevant le final et en utilisant la signature initiale mais ça ne change rien.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tes Actions étendent une classe (autre que DispatchAction) ?
    Si oui, peux-tu montrer le code ?

    A+

  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Mon problème est enfin résolu
    J'ai comparé le comportement de ma page sous Firefox et sous IE :
    Bilan : Pas de problème sous IE mais ce dernier persiste sous Firefox (passage dans le unspecified via une requête en GET systématiquement).
    Le souci venait d'une image cachée qui était dans ma page et dont le src était rempli plus tard par un code javascript déclenché par une action utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div style="display:none">
    	<img src="">
    </div>
    Sous IE, comme src est vide, le navigateur ne fait rien.
    Par contre, sous Firefox, comme src est vide, il est interprété comme étant l'URL de la page courante dans le navigateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost:8080/channelViewer/channelDetail.do
    Et comme dans l'Url on a pas la valeur du parameter (method=xxxx) eh ben on passe dans le unspecified!!!!

    voili voilou.
    Il m'a fallu 2 jours pour en venir à bout grâce à l'aide Edouard
    Merci bcp pour votre disponibilité à vous aussi.
    @+.

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ce que tu peux faire pour règler le problème sous Firefox, c'est de référencer une image représentant 1 pixel transparent (1p.gif).
    Comme ça, plutôt que d'avoir
    tu auras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <img src="<%=request.getContextPath()%>/images/1p.gif"/>
    et ce sera ok pour tous les navigateurs...

    Je te joins l'image

    A+

    PS: ça va être difficile de récupérer l'image sous Firefox sans un outil, parce que c'est une image de 1px x 1px, transparente qui plus est... Utilise IE, c'est mieux pour ce cas...

Discussions similaires

  1. [WD16] Destructeur de classe appelé après arrêt thread contenu dans méthode
    Par jurassic pork dans le forum WinDev
    Réponses: 9
    Dernier message: 27/07/2012, 03h21
  2. Appel d'une méthode de l'appelant
    Par Isher dans le forum Silverlight
    Réponses: 2
    Dernier message: 25/03/2010, 18h04
  3. Réponses: 1
    Dernier message: 27/05/2009, 09h19
  4. Appel d'une fonction défini dans un autre fichier javascript
    Par jep33 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/02/2009, 08h43
  5. Appel d'une méthode à partir d'un nom de méthode
    Par tnarol dans le forum Langage
    Réponses: 20
    Dernier message: 07/03/2007, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo