9

コントローラーメソッドに送信しようとしている 2 つのパラメーターを持つ Spring 3 MVC フォームがあり、404 エラーが発生しています。この問題のひねりは、フォームに 2 つの送信ボタンがあり、クリックされた送信ボタンがパラメーターの 1 つの値を決定することです。これが私のフォームです。

    <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";
}
4

2 に答える 2

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";
}
于 2013-05-18T04:32:43.250 に答える
10

フォームは「/approve」actionに設定されていますが、コントローラーのマッピングは「/approve/{action}/{id}」です。Dispatcher Servlet には、これら 2 つを接続する方法がありません。

メソッド正しくマッピングされていたとしても、期待どおりに動作しません。混乱actioninputていて、HTTP リクエストでそれらが何に対応しているかがわかりません。

actionフォーム リクエストの URL を設定します。この場合は「/approve」です。各<input>要素のnameパラメータは、値が の HTTP パラメータを追加するために使用されるvalueため、リクエストには次の組み合わせが含まれます。

  • id=${id}(すべてのリクエスト)
  • approve=Approve(ユーザーが「承認」をクリックした場合)
  • 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このようにして、常にとの2 つのパラメーターを取得し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
    }

このような問題 (つまり、クライアントの問題かサーバーの問題か) の診断に役立つのは、ブラウザーの Web ツール (Firefox の Firebugs、Chrome の開発者ツールなど) を使用して発信要求を検査することです。リクエストを簡単にキャプチャして、HTTP パラメーター、URL、およびメソッドが何であったかを確認し、それらを予想と比較することができます。

于 2013-05-13T09:15:21.150 に答える