2 votes

Formulaire dynamique, avec ou sans multipart/form-data

Je suis en train de concevoir un framework CRUD simple en Java, où dans ma page HTML j'ai un formulaire dynamique (2 avec multipart pour create et update avec file upload et 1 sans fileupload et multipart pour delete). Côté serveur, un modulateur de requête vérifie tous les paramètres à l'aide de request.getParameterMap(); et les contrôles de cette entrée de type caché <input type="hidden" name="returntype" value="Create"> qu'il s'agisse d'une opération de création, de mise à jour ou de suppression. En fonction de cela, il appellera les gestionnaires nécessaires.

Note : L'enctype et l'encodage de mon formulaire sont réglés sur multipart/form-data Note : Mon paramMap.size() renvoie 0 ici et returnType obtient null et donc je reçois une exception de pointeur nul.

Si je n'utilise pas du tout l'enctype et l'encodage, tout se passe bien, mais une fois de plus, mon téléchargement de fichier me donne une exception indiquant que le type d'encodage devrait être multipart/form-data . Est-ce que quelqu'un peut m'aider à avoir un formulaire dynamique avec lequel je peux créer un CRUD ? ou pourquoi ne puis-je pas utiliser le formulaire dynamique ? request.getParameterMap(); avec multipart/form-data Merci :)

Voici le code du modulateur de demande

public String identifyNow()throws ServletException, java.io.IOException
{
    UploadXmlAgent uploadAgent;
    paramMap=request.getParameterMap();
    if (paramMap == null)
        throw new ServletException(
          "getParameterMap returned null in: " + getClass().getName());

    iterator=paramMap.entrySet().iterator();
    System.out.println(paramMap.size());
    while(iterator.hasNext())
    {
        Map.Entry me=(Map.Entry)iterator.next();
        if(me.getKey().equals("returntype"))
        {
            String[] arr=(String[])me.getValue();
            returnType=arr[0];
        }
    }

    //Identified based on returnType, instantiate appropriate Handler

    if(returnType.equals("Create"))
    {
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS  
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Update"))
    {
        System.out.println("Update");
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Delete"))
    {
        //SOME OPERATIONS
    }
    return returnType;
}

2voto

Achim Points 1521

Peut-être devriez-vous jeter un coup d'œil à Commons IO FileUpload .

Pour différencier le type de formulaire soumis, vous pouvez utiliser un champ de saisie caché.

 <input type="hidden" name="formAction" value="uploadSomething">

Vous pouvez ensuite l'utiliser dans votre servlet pour effectuer l'action en fonction de votre formulaire.

String act = request.getParameter("formAction");
if(act.equals("uploadSomething")
{ 
// EDIT
if(ServletFileUpload.isMultipartContent(request))
{

// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
}
}

C'est tout. J'espère que cela vous aidera.

2voto

BalusC Points 498232

Comme dans le commentaire de l'autre réponse :

puis-je utiliser request.getParameterMap(); d'une manière ou d'une autre avec multipart ?

Si c'est votre seule exigence, il vous suffit de créer un fichier Filter qui effectue le travail d'analyse et prépare la carte des paramètres de la requête avec tous les éléments multipartites analysés afin que vous puissiez continuer à utiliser getParameter() , getParameterMap() et les consorts de la manière habituelle en JSP/Servlet. Vous pouvez trouver un exemple complet d'un tel filtre aquí .

-1voto

Abhishek Simon Points 2607

Bonjour, j'ai réussi à trouver une solution. J'utilise 2 requêtes et une variable de session.

1ère demande pour soumettre le formulaire sans multipart et stocker le type de demande dans la variable de session.

une fois la première demande envoyée, procéder à la deuxième demande du même formulaire, mais cette fois en utilisant le multipart et en vérifiant la valeur de la variable de session et en exécutant le gestionnaire approprié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X