2

ボタンをクリックしたときに JSP からメソッドを呼び出すにはどうすればよいですか?

私はこのコードを書きましたが、動作しません..

<%@page import="my.package.class.MyClass" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>
<body>
<input type="submit" name="myButton" value="button" onclick="callMethod()"/>
</body>
</html>

<%! 
void callMethod(){ 
new MyClass().print();} %>

もっと簡単な方法はありますか?それともこれが正しい方法ですか?

ps: JavaScript は使いたくない

編集:私のクラスには、system.out.printlnに「test」のようなものを出力する「print」メソッドがあります

4

3 に答える 3

5

サーブレットが必要です(<-- リンクをクリックしてください。装飾用に含まれているわけではありません)。

要するに、Servlet 3.0 コンテナー (Tomcat 7、Glassfish 3 など) をターゲットにしている場合は、次のクラスを作成するだけです。

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        new MyClass().print();
    }

}

そして、JSP を次のように修正<body>します (JSP ファイルがサブフォルダーではなく Web コンテンツのルートに配置されている場合)。

<form action="hello" method="post">
    <input type="submit" name="myButton" value="button" />
</form>

それでおしまい。

サーブレットは、コンテキスト ルートに関連@WebServletする の URL をリッスンするように登録されています。/helloHTML フォームは、JSP ページ自体の URL に対して、正確にその URL に送信するように指示されます。method="post"はサーブレットのメソッドを呼び出しますdoPost()。そこでは、必要な Java コードを自由に書き留めることができます。

押されたボタンに応じてより細かい制御が必要な場合は、ボタンに一意の名前を付けます。

<form action="hello" method="post">
    <input type="submit" name="myButton1" value="button1" />
    <input type="submit" name="myButton2" value="button2" />
    <input type="submit" name="myButton3" value="button3" />
</form>

doPost()次に、サーブレットのメソッドで次のように押されたボタンを確認できます。

if (request.getParameter("myButton1") != null) {
    // button1 is pressed.
}
else if (request.getParameter("myButton2") != null) {
    // button2 is pressed.
}
else if (request.getParameter("myButton3") != null) {
    // button3 is pressed.
}

まったく別の代替案は、 JSFSpring MVCStruts2など、このボイラープレートをすべて高度に抽象化する既存の MVC フレームワークを使用することです。

JSF を使用すると、次のようになります (従来の JSP をその後継の Facelets に置き換えるだけで済みます。Facelets の外観については、少しまともな JSF チュートリアルで説明されています。詳細については、前の段落の「JSF」リンクをクリックしてください)。

<h:form>
    <h:commandButton value="button1" action="#{bean.button1}" />
    <h:commandButton value="button2" action="#{bean.button2}" />
    <h:commandButton value="button3" action="#{bean.button3}" />
</h:form>

醜いif/elseなしのこのクラスだけで:

@ManagedBean
@RequestScoped
public class Bean {

    public void button1() {
        System.out.println("button1 invoked");
    }

    public void button2() {
        System.out.println("button2 invoked");
    }

    public void button3() {
        System.out.println("button3 invoked");
    }

}
于 2013-01-18T16:21:48.600 に答える
0

サーブレットと MVC パターンを使用しないのはなぜですか。JSP 内に Java メソッドを記述する必要はありません。

于 2013-01-18T15:18:55.940 に答える
0

JSP に含まれるコードの一部と、結果としてブラウザに表示される HTML がどこで実行されているのか混乱しています。

JSP 内でアクセス可能な Bean は、HTTP 要求が処理されている時点で (サーバー上の) サーブレット コンテナー内にあり、HTML は JSP から生成されますが、onclick イベントを発生させるボタンはクライアント ブラウザー内にあります。したがって、ボタンは Bean を直接呼び出すことはできません。

ボタンがクリックされたときにサーバー側のロジックを呼び出すには、サーバーに AJAX コールバックを行う必要があります (ページ全体を更新する場合を除きますが、これは少々くだらないことです)。

于 2013-01-18T16:03:29.457 に答える