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

编辑:我的班级只有一个方法“print”,在 system.out.println 中打印类似“test”的东西

4

3 回答 3

5

您需要一个servlet(<--单击链接,它不包括仅用于装饰)。

至此,假设您的目标是 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();
    }

}

<body>并按如下方式修复您的 JSP (前提是 JSP 文件放置在 Web 内容的根目录中,而不是放在子文件夹中):

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

就是这样。

servlet 通过@WebServlet注册以侦听/hello相对于上下文根的 URL。指示 HTML 表单准确地提交到相对于 JSP 页面本身的 URL 的那个 URL。这method="post"将调用 servlet 的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()那么您可以在 servlet 的方法中检查按下的按钮,如下所示:

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.
}

一个完全不同的选择是使用现有的 MVC 框架,该框架高度抽象所有这些样板,例如JSFSpring MVCStruts2等。

使用 JSF,它看起来像这样(您只需用其后续的 Facelets 替换旧版 JSP;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

为什么不使用 servlet 和 MVC 模式,您无需在 JSP 中编写 java 方法。

于 2013-01-18T15:18:55.940 回答
0

您会混淆 JSP 中涉及的代码位和浏览器显示的结果 HTML 是在哪里运行的。

在处理 HTTP 请求并从 JSP 生成 HTML 时,JSP 内部可访问的 bean 位于 servlet 容器中(在服务器上),而触发 onclick 事件的按钮位于客户端浏览器内部 -因此按钮不能直接调用 bean。

为了在单击按钮时调用服务器端逻辑,您需要对服务器进行 AJAX 回调(除非您要刷新整个页面,这有点废话)。

于 2013-01-18T16:03:29.457 回答