2012-01-21 35 views
35

フォームに2つのサブミットボタンを投稿しようとしていますが、それぞれのボタンアクションは異なるコントローラにマッピングされています。あなたは、私がクリックされたものをボタン区別するためのparamsの使用に頼っています、私のマッピングから見ることができるようにSpring MVC - フォームへの複数のサブミットボタン

<input type="submit" name="save" class="button" value="Save" /> 
<input type="submit" name="renew" class="button" value="Renew" /> 

- ここに私のマッピング

@RequestMapping(value="/save", method=RequestMethod.POST, params="save") 
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew") 

そして、私のボタンを提出するには、これらのようになります。この問題が発生したとき、不思議

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8090/myapp/save': {public java.lang.String com.myapp.SaveController.save(MyEntity,javax.servlet.http.HttpSession), public java.lang.String com.myapp.SaveController.saveAndRenew(MyEntity,javax.servlet.http.HttpSession)} 
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:248) 
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:194) 

と私はページを再提出するすべてが正常に動作し、その後、 - それは時間の90%に動作しますが、時々、私は以下の例外を取得するという問題があります。私がしようとしていることを達成するためのよりよい方法はありますか?

ありがとうございます!フォームがこれらのボタンは、指定された場合

@RequestMapping(value="/save", method=RequestMethod.POST) 
public String handlePost(@RequestParam String action){ 

    if(action.equals("save")){ 
     //handle save 
    } 
    else if(action.equals("renew")){ 
     //handle renew 
    } 

} 
+1

わからないが、一部のブラウザでは、ユーザーがフォームを送信する場合の任意のボタンのキー/値ペアを送る習慣に注意してくださいEnterキーまたはボタンをクリックする以外の特定の方法を介して。したがって、デフォルトのアクションを想定してください。ブラウザの互換性は、そのフォームのhtmlソースの*最初のボタン*のアクションである必要があります。 – goat

答えて

6

ちょうどこの

@RequestMapping(value="/save", method=RequestMethod.POST) 
public String handlePost(@RequestParam(required=false , value = "save") String saveFlag , @RequestParam(required=false , value = "renew") String renewFlag){ 

if(saveFlag != null{ 
    //handle save 
} 
else if(renewFlag !=null{ 
    //handle renew 
} 

} 
32

なぜないのと同様の方法で、一方のコントローラを作成

input type="submit" class="button" name="save" value="Save" 
input type="submit" class="button" name="delete" value="Delete" 
input type="submit" class="button" name="cancel" value="Cancel" 

あなたは、1つのコントローラで押されたボタンに応じて、異なるURL要求に誘導することができます。

ためのキャンセルボタンを、要求のマッピングが何

@RequestMapping(params = "cancel", method = RequestMethod.POST) 
public String cancelUpdateUser(HttpServletRequest request) { 
    return "redirect:/users.html"; 
} 

は、それが名前のparams含まれている=キャンセルした場合、POSTリクエストをスキャンすることです。あなたが唯一のparams属性が異なる同じ@RequestMappingでより多くのコントローラメソッドを持っている場合は、あなたが明示的に記述する必要が

@RequestMapping(params = "save", method = RequestMethod.POST) 
public String saveUser(HttpServletRequest request, @ModelAttribute User user, BindingResult result, SessionStatus status) { 
    // validate your result 
    // if no errors, save it and redirect to successView. 
} 
+7

'input'タグの' value'属性にボタンのテキストが含まれているので、少し危険です。私はこの方法であなたの友人になることはないと思う。 –

+0

私はIE(10)に一貫して値を掲示しないという問題を抱え、あなたのアプローチを採用しました。超清潔ではないが、それは私のために働いた。乾杯。 –

34

:その後、

<input type="submit" name="action" value="save" /> 

と:

9

、ボタンを救うため

ことになっているパラメータ
  • 要求に存在する、例えばparams="save"
  • このパラメータは要求には存在しないと想定されます。あなたのケースではparams="!save"

@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"}) 
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"}) 

これはエラーにHTTPパスにマッピングされたあいまいなハンドラメソッドを修正する必要があります...

はもう一解決策Spring Web API 4.0.x - RequestMapping#params

1

を参照してください:そのあなたの問題であれば

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) 
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"}) 
関連する問題