9

पर 2 पैरामीटर भेजना मेरे पास 2 पैरामीटर के साथ एक स्प्रिंग 3 एमवीसी फॉर्म है जो मैं अपने नियंत्रक विधि को भेजने की कोशिश कर रहा हूं, और मुझे 404 त्रुटि मिल रही है। इस समस्या पर मोड़ यह है कि फ़ॉर्म में 2 सबमिट बटन हैं, और क्लिक बटन सबमिट किया गया है जो पैरामीटर में से किसी एक के मान को निर्देशित करता है। मेरा फॉर्म यहाँ है।स्प्रिंग 3 - 2 बटन के साथ फॉर्म, नियंत्रक विधि

<form:form action="/approve/${bulletin.id}" method="post"> 
     <table> 
      <tr> 
       <td colspan="2"><b>From:</b> <c:out value="${bulletin.name}" /></td> 
      </tr> 
      <tr> 
       <td colspan="2"><b>Subject:</b> <c:out 
         value="${bulletin.subject}" /></td> 
      </tr> 
      <tr> 
       <td colspan="2"><b>Date:</b> <c:out value="${bulletin.date}" /> 
        <br></td> 
      </tr> 
      <tr> 
       <td colspan="2"><t:notePrint note="${bulletin.note}" /> <input 
        type="hidden" name="id" value="${bulletin.id}" /></td> 
      </tr> 
      <tr> 
       <td><input type="submit" name="approve" value="Approve" /></td> 
       <td><input type="submit" name="deny" value="Deny" /></td> 
      </tr> 
     </table> 
     <br /> 
    </form:form> 

यहां मेरा नियंत्रक प्रपत्र है।

@RequestMapping(value = "/approve/{id}", method = RequestMethod.POST) 
public String approveBulletin(@RequestParam int id, 
     @RequestParam(required = false, value = "approve") String approve, 
     @RequestParam(required = false, value = "deny") String deny, Model model) { 
    try { 
     if (approve.equalsIgnoreCase("approve")) { 
      bulletinDAO.approveBulletin(id); 
      model.addAttribute("approval", 
        "Your bulletin has been approved."); 
     } 
     if (deny.equalsIgnoreCase("deny")) { 
      bulletinDAO.denyBulletin(id); 
      model.addAttribute("approval", "Your bulletin has been denied."); 
     } 

     List<Bulletin> bulletins = bulletinDAO.getApprovedBulletins(); 
     model.addAttribute("bulletins", bulletins); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     return "FailurePage"; 
    } 

    return "ApproveBulletin"; 
} 

उत्तर

15

मैंने अपनी समस्या हल कर ली है। मैं किसी अन्य व्यक्ति के लाभ के लिए अपना कोड पोस्ट कर रहा हूं जो इस धागे को एक ही समस्या के साथ हिट करता है। मेरा फॉर्म यहाँ है।

<form:form action="approve" method="post"> 
    <table> 
     <tr> 
      <td colspan="2"><b>From:</b> <c:out value="${bulletin.name}" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"><b>Subject:</b> <c:out 
        value="${bulletin.subject}" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"><b>Date:</b> <c:out value="${bulletin.date}" /> 
       <br></td> 
     </tr> 
     <tr> 
      <td colspan="2"><t:notePrint note="${bulletin.note}" /> <input 
       type="hidden" name="id" value="${bulletin.id}" /></td> 
     </tr> 
     <tr> 
      <td><input type="submit" name="approve" value="Approve" /></td> 
      <td><input type="submit" name="deny" value="Deny" /></td> 
     </tr> 
    </table> 
    <br /> 
</form:form> 

यहां मेरे नियंत्रक विधियां हैं।

@RequestMapping(value = "/approve", method = RequestMethod.POST, params = { "approve" }) 
public String approve(@RequestParam int id, @RequestParam String approve, Model model) { 
    try { 
     bulletinDAO.approveBulletin(id); 
     model.addAttribute("approval", "Your bulletin has been approved."); 

     List<Bulletin> bulletins = bulletinDAO.getApprovedBulletins(); 
     model.addAttribute("bulletins", bulletins); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     return "FailurePage"; 
    } 

    return "ApproveBulletin"; 
} 

@RequestMapping(value = "/approve", method = RequestMethod.POST, params = { "deny" }) 
public String deny(@RequestParam int id, @RequestParam String deny, Model model) { 
    try { 
     bulletinDAO.denyBulletin(id); 
     model.addAttribute("approval", "Your bulletin has been denied."); 

     List<Bulletin> bulletins = bulletinDAO.getApprovedBulletins(); 
     model.addAttribute("bulletins", bulletins); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     return "FailurePage"; 
    } 

    return "ApproveBulletin"; 
} 
+0

और यह MockMVC के साथ परीक्षण करना कैसे संभव है? –

+0

यह MockMVC के साथ परीक्षण नहीं किया गया था। यह टॉमकैट में एप्लिकेशन का उपयोग करके परीक्षण किया गया था क्योंकि उपयोगकर्ता सामान्य रूप से इसका उपयोग करेगा। –

9

आपका प्रपत्र के actionपर सेट है "/ अनुमोदन" अभी तक अपने नियंत्रक मानचित्रण है "/ अनुमोदन/{कार्रवाई}/{आईडी}"; डिस्पैचर सर्वलेट के पास इन दोनों के बीच संबंध बनाने का कोई तरीका नहीं है।

यहां तक ​​कि अगर विधि सही ढंग से आप इसे क्या करने की आशा नहीं करते मैप किया गया था: आप action और input और वे क्या HTTP अनुरोध में के अनुरूप भ्रमित कर रहे हैं।

action फ़ॉर्म अनुरोध का यूआरएल सेट करता है, आपके मामले में यह / स्वीकृत करता है "। प्रत्येक <input> तत्व के name पैरामीटर value के मूल्य के साथ HTTP पैरामीटर जोड़ने के लिए प्रयोग किया जाता है, तो अनुरोध एक का संयोजन होगा: (सभी अनुरोधों)

  • approve=Approve (यदि उपयोगकर्ता क्लिक "को मंजूरी")
    • id=${id}
    • deny=Deny (यदि उपयोगकर्ता क्लिक "इनकार")

    को संभालने के लिए दोनों इन मामलों नियंत्रक के हस्ताक्षर बदला जाना चाहिए कुछ इस तरह हैं:

    @RequestMapping(value = "/approve", method = RequestMethod.POST) 
    public String approveBulletin(@RequestParam int id, 
          @RequestParam(required=false, defaultValue="") String approve, 
          @RequestParam(required=false, defaultValue="") String deny, 
          Model model) { 
        if (approve.equals("Approve")) { 
         // user clicked "approve" 
        } else if (deny.equals("Deny")) { 
         // user clicked "deny"    
        } else { 
         throw new IllegalArgumentException("Need either approve or deny!"); 
        } 
    
        // (...) 
    } 
    

    लेकिन मैं नहीं बल्कि प्रस्तुत बटन के मापदंडों बदलने का सुझाव चाहते हैं:

    <td><input type="submit" name="approveParam" value="approveVal" /></td> 
    <td><input type="submit" name="approveParam" value="denyVal" /></td> 
    

    इस तरह आप हमेशा ठीक दो मापदंडों मिलती है: id और approve, तो आप सिर्फ यह कर सकते हैं approve के मान की जाँच करता है, तो यह था एक "को मंजूरी" या एक "इनकार" को देखने के लिए:

    public String approveBulletin(@RequestParam int id, 
         @RequestParam(value = "approveParam") String approveOrDeny, 
         Model model) { 
        if (approveOrDeny.equalsIgnoreCase("approveVal")) { 
         // user clicked "approve" 
        } else if (approveOrDeny.equalsIgnoreCase("denyVal")) { 
         // user clicked "deny" 
        } else { 
         // wrong parameter sent 
        } 
    

    ऐसी समस्याओं का निदान करने में क्या मदद करता है (यानी। चाहे वह क्लाइंट या सर्वर समस्या हो) ब्राउज़र के वेब टूल्स (फ़ायरफ़ॉक्स में फ़ायरबग, क्रोम में डेवलपर टूल्स इत्यादि) का उपयोग कर आउटगोइंग अनुरोध का निरीक्षण कर रहा है। आप आसानी से अनुरोध को कैप्चर कर सकते हैं और देख सकते हैं कि HTTP पैरामीटर, यूआरएल और विधि क्या थी और उनकी अपेक्षाओं से उनकी तुलना करें।

    +0

    मैंने अपने मूल पोस्ट को अपने कोड के नवीनतम संस्करण के साथ अपडेट किया है, आपके सुझावों के अनुसार। आईडी अब पारित हो रही है, लेकिन मैंने जिस बटन पर क्लिक किया है उसका मूल्य नहीं है। –

    +0

    क्या आप पुष्टि कर सकते हैं कि आप अनुरोध में "स्वीकृति" या "इनकार" पैरामीटर देख सकते हैं या नहीं? (अपने ब्राउज़र टूल्स का उपयोग करके) मैंने अभी एक सरलीकृत रूप पर परीक्षण किया है, यह बटन के मूल्य को सही तरीके से भेजता है। – kryger

    +0

    मुझे अभी फायरबग में पैरामीटर मिला है। नेट/ऑल/पोस्ट के तहत, मैं इसे देख रहा हूं: आईडी =% 25% 7 बोली% 7 डी और स्वीकृति = स्वीकृति दें। मुझे कोड को फिर से लिखना चाहिए? –

    संबंधित मुद्दे