2017-01-03 1 views
0

私はSpring MVCアプリケーションで作業していますが、にブール型パラメータを処理するよりスマートな方法について、次の疑問があります。がフォームの送信によって送信されました。フォームのサブミッションによってSpring MVCコントローラメソッドに渡される "boolean"パラメータを処理する最もスマートな方法は何ですか?

だから私は、フォームが含まれている次のような単純な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> 

、湯はそれ自体、それが確認された場合には、真のString値を送ること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は(ある)URIに向かっPOST要求処理方法:ブール値を得るためにhttp://localhost:8080/AccomodationMedia/

isMasterに関連するパラメータ:

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

(方法はHttpServletRequestリクエストパラメータから取得しています)。

私はまた、このようにメソッドのシグネチャを変更するtryiedています

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

htmlフォームのチェックボックスがチェックされている場合にのみ動作しますが、そうでない場合はisMasterパラメータがnullであり、それは例外に入ります。

は、だから私は、次の疑問があります。

1)はHTMLで指定する方法を(存在し)チェックボックスは値をチェックされていない場合ということが偽()JavaScriptを使用して避けなければなりません。

2)または、この状況をコントローラメソッドのシグネチャに処理できますか?

3)HTMLフォームに文字列1の代わりにブール値を渡すことはできますか?

+0

[チェックボックスの値は、falseのときオブジェクトにバインドされません]の重複している可能性があります(http://stackoverflow.com/questions/8723765/checkbox-values-do-not-bind-into-object-when-false) – perbellinio

答えて

3

1)(HTMLで)チェックボックスが0以外の場合は、値をfalseにする必要があります(JavaScriptを使用しないでください)。

falseと同じ名前と値を持つ隠し入力を追加します:隠し入力はチェックボックスの後を指定する必要があること

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

注意を。

2)または、コントローラの方法 の署名にこの状況を処理できますか?

はい、可能です。この場合、

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

    ... 
} 

チェックボックスがチェックされない場合、isMasterの値はfalse次のようになります。@RequestParam注釈のdefaultValueプロパティを使用します。また、過剰な隠れた入力を表示に追加する必要はありません。

3)HTMLフォームに文字列1の代わりにブール値を渡すことはできますか?あなたができるもちろん

チェックボックスに次の方法でレンダリングのためにあなたが渡された値を使用することができますビューで次に
@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

を、私はデータがあるときに文字列を扱うのが好きUIから渡されます。

隠されたフィールドや余分な注釈を使用するよりも、はるかに簡単で、よりクリーンでメンテナンス性が高いのは、JavaのBooleanクラス静的メソッドを使用することによってnullをfalseとして扱うことです。他のすべてはfalseを返しながら

Boolean.getBoolean(null) //Returns false 

"真"(大文字小文字を区別しない)は、trueを返します。

関連する問題