2017-01-03 10 views
0

Я работаю над приложением Spring MVC, и у меня есть следующие сомнения относительно того, что является более умным способом обработки логического параметра в POST-запросах, отправленных по форме.Каков самый умный способ обработать параметр «boolean», переданный приложением формы в метод контроллера Spring MVC?

Поэтому у меня есть следующий простой HTML-страницу, содержащую форму:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Spring MVC - Hibernate File Upload to Database Demo</title> 
</head> 
<body> 
    <div align="center"> 
     <h1>Spring MVC - Hibernate File Upload to Database Demo</h1> 
     <form method="post" action="http://localhost:8080/AccomodationMedia/" enctype="multipart/form-data"> 
      <table border="0"> 
       <tr> 
        <td>Pick file #1:</td> 
        <td><input type="file" name="fileUpload" size="50" /></td> 
       </tr> 
       <tr> 
        <td>Pick file #2:</td> 
        <td><input type="file" name="fileUpload" size="50" /></td> 
       </tr> 
       <tr> 
        <td colspan="2" align="center"><input type="submit" value="Upload" /></td> 
       </tr> 

       <tr> 
        <input type="checkbox" name="isMaster" value="true">Is Master Image<br> 
       </tr> 
      </table> 
     </form> 
    </div> 
</body> 
</html> 

Так что, как юй может себе она содержит поле ввода имени isMaster, что если проверяется отправить значение Строка верно (если это не проверено, это значение параметра будет null).

Тогда у меня есть этот класс контроллера:

@RestController 
@RequestMapping("/AccomodationMedia") 
public class AccomodationMediaController { 

    ..................................................................... 
    ..................................................................... 
    ..................................................................... 

    @RequestMapping(value = "/", method = RequestMethod.POST) 
    public String handleFileUpload(HttpServletRequest request, 
            @RequestParam MultipartFile[] fileUpload) throws Exception { 
            //@RequestParam String isMaster) throws Exception { 

     System.out.println("handleFileUpload() START"); 

     boolean isMaster; 
     String isMasterString = request.getParameter("isMaster"); 

     if(isMasterString == null) { 
      isMaster = false; 
     } 
     else { 
      isMaster = true; 
     } 

     if (fileUpload != null && fileUpload.length > 0) { 
      for (MultipartFile currentFile : fileUpload){ 

       System.out.println("Saving file: " + currentFile.getOriginalFilename()); 

       accomodationMediaService.saveAccomodationMedia(currentFile, isMaster); 

      } 
     } 

     return "Success"; 
    } 

} 

так что есть handleFileUpload() метод, который обрабатывать POST запрос к URI: http://localhost:8080/AccomodationMedia/

Чтобы получить логическое значение относящийся к isMaster параметр Я сделал:

в корпусе метода (поэтому я извлекаю его из HttpServletRequest запрос параметр).

Я также tryied изменить сигнатуру метода таким образом:

public String handleFileUpload(HttpServletRequest request, 
            @RequestParam MultipartFile[] fileUpload, 
            @RequestParam String isMaster) throws Exception { 

Он работает только если HTML форма флажок установлен, в противном случае параметр isMaster является недействительным и идти в исключения.

Поэтому у меня есть следующие сомнения:

1) существует способ указать (в HTML), что если флажок не проверить значение должно быть ложным (избегая использовать JavaScript).

2) Или я могу обработать эту ситуацию в сигнатуре метода контроллера?

3) Могу ли я передать логическое значение вместо строки в HTML-форму?

+0

Возможный дубликат [Значения флажка не привязываются к объекту при false?] (Http://stackoverflow.com/questions/8723765/checkbox-values-do-not-bind-into-object-when-false) – perbellinio

ответ

3

1) существует способ указать (в HTML), что если флажок не проверить значение должно быть ложным (избегая использовать JavaScript).

Добавить скрытый вход с тем же именем и значением, как false:

<form action="/someaction" enctype="multipart/form-data"> 
    <input type="checkbox" name="isMaster"/> 
    <input type="hidden" name="isMaster" value="false"/> 
</form> 

Обратите внимание, что скрытые ввода должны быть указаны после флажка.

2) Или я могу обработать эту ситуацию в методе контроллера подпись?

Да, вы можете. Используйте defaultValue свойство из @RequestParam аннотацию:

@RequestMapping(value = "/", method = RequestMethod.POST) 
public String handleFileUpload(
    @RequestParam(name = "isMaster", defaultValue = "false") Boolean isMaster, 
    @RequestParam MultipartFile[] fileUpload){ 

    ... 
} 

В этом случае, если флажок не будет установлен, значение isMaster будет false. И вам не нужно добавлять лишний скрытый ввод в представление.

3) Могу ли я передать логическое значение вместо строки в HTML-форму?

Конечно, вы можете:

@RequestMapping(value = "/form", method = RequestMethod.GET) 
public String showForm(ModelMap model){ 
    model.addAttribute("isMaster", true); 
    return "someview"; 
} 

Тогда в силу можно использовать переданное значение для визуализации флажком образом:

<form action="/someaction" method="post" enctype="multipart/form-data"> 
    <input type="checkbox" name="isMaster" ${isMaster?'checked':''}/> 
    ... 
</form> 
+1

Отличный человек объяснения :-) – AndreaNobili

0

Как правило, мне нравится иметь дело со строками, когда данные переданный из пользовательского интерфейса.

Проще, чище и удобнее обслуживать, чем использовать скрытые поля или дополнительные аннотации, - это просто обрабатывать null как ложные, используя статические методы класса Boolean Java.

Boolean.getBoolean(null) //Returns false 

"истина" (чувствительно к регистру) возвращает true, в то время как все остальное возвращает false.