web-dev-qa-db-fra.com

comment obtenir param en méthode post-printemps mvc?

J'utilise printemps MVC. Et je ne peux pas obtenir param de url quand method = post. Mais lorsque je change de méthode pour GET, je peux donc obtenir tous les paramètres.

Ceci est ma forme:

<form method="POST" action="http://localhost:8080/cms/customer/create_customer" id="frmRegister" name ="frmRegister" enctype="multipart/form-data">
    <input class ="iptRegister" type="text" id="txtEmail" name="txtEmail" value="" />
    <input class ="iptRegister" type="password" id="txtPassword" name="txtPassword" value="" />
    <input class ="iptRegister" type="text" id="txtPhone" name="txtPhone" value="" />

    <input type="button" id="btnRegister" name="btnRegister" value="Register" onclick="" style="cursor:pointer"/>
</form>

Ceci est mon contrôleur:

@RequestMapping(value= "/create_customer", method = RequestMethod.POST)
@ResponseBody
public String createCustomer(HttpServletRequest request, 
        @RequestParam(value="txtEmail", required=false) String email, 
        @RequestParam(value="txtPassword", required=false) String password, 
        @RequestParam(value="txtPhone", required=false) String phone){

    ResultDTO<String> rs = new ResultDTO<String>();
    rs.setStatus(IConfig.SHOW_RESULT_SUCCESS_ON_MAIN_SCREEN);
    try{
        Customer c = new Customer();
        c.setEmail(email);
        c.setPassword(password);
        c.setPhone(phone);
        customerService.insert(c);
        rs.setData("Insert success");
    }catch(Exception ex){
        log.error(ex);
        rs.setStatus(IConfig.SHOW_RESULT_ERROR_ON_MAIN_SCREEN);
        rs.setData("Insert failure");
    }
    return rs.toString();
}

Comment puis-je résoudre ce problème?

38
furyfish
  1. Les annotations de printemps fonctionneront bien si vous supprimez enctype="multipart/form-data".

    @RequestParam(value="txtEmail", required=false)
    
  2. Vous pouvez même obtenir les paramètres de l'objet request.

    request.getParameter(paramName);
    
  3. Utilisez un formulaire dans le cas où le nombre d'attributs est grand. Ce sera pratique. Tutoriel pour vous aider à démarrer.

  4. Configurez le résolveur en plusieurs parties si vous souhaitez recevoir enctype="multipart/form-data".

    <bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="250000"/>
    </bean>
    

Reportez-vous à la documentation Spring .

51
NINCOMPOOP

Quand je veux avoir tous les POST j'utilise le code ci-dessous,

@RequestMapping(value = "/", method = RequestMethod.POST)
public ViewForResponseClass update(@RequestBody AClass anObject) {
    // Source..
}

J'utilise le @RequestBody annotation pour les requêtes http post/put/delete au lieu du @RequestParam qui lit les paramètres GET.

8

Cela fonctionne aussi si vous changez le type de contenu

    <form method="POST"
    action="http://localhost:8080/cms/customer/create_customer"
    id="frmRegister" name="frmRegister"
    enctype="application/x-www-form-urlencoded">

Dans le contrôleur, ajoutez également la valeur d'en-tête comme suit:

    @RequestMapping(value = "/create_customer", method = RequestMethod.POST, headers = "Content-Type=application/x-www-form-urlencoded")
8
Shamim Ahmmed

Tu devrais utiliser @RequestParam sur ces ressources avec la méthode = RequestMethod.GET

Pour pouvoir publier des paramètres, vous devez les envoyer en tant que corps de la demande. Un corps comme JSON ou une autre représentation de données dépendrait de votre implémentation (je veux dire, consommer et produire MediaType).

Typiquement, multipart/form-data est utilisé pour télécharger des fichiers.

7
Wilder Valera