调用不同Servlet的同一表单中的多个提交按钮

Eli*_*zav 32 java jsp servlets

首先,这是代码:

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
    <input type="submit"value="SecondServlet">
</form>
Run Code Online (Sandbox Code Playgroud)

我想了解如何在FirstServlet button被按下的情况下发送信息,以防FirstServlet万一SecondServlet button被按下SecondServlet.

重要的是:
我想以相同的形式进行,因此相同的信息将被转换为两个servlet.(当然,在servlet中我将相应地使用信息)

Bal*_*usC 90

有几种方法可以实现这一目标.

可能最简单的方法是使用JavaScript来改变表单的动作.

<input type="submit" value="SecondServlet" onclick="form.action='SecondServlet';">
Run Code Online (Sandbox Code Playgroud)

但是当最终用户禁用JS(移动浏览器,屏幕阅读器等)时,这当然不起作用.


另一种方法是将第二个按钮放在不同的形式,这可能是你需要的,也可能不是你需要的,这取决于具体的功能要求,这一点根本不清楚.

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
</form>
<form action="SecondServlet" method="Post">
    <input type="submit"value="SecondServlet">
</form>
Run Code Online (Sandbox Code Playgroud)

请注意,表单将在提交时仅发送包含在同一表单中的输入数据,而不是以其他形式发送.


另一种方法是创建另一个单一入口点servlet,它根据按下的按钮进一步委托给正确的servlet(或者最好是正确的业务操作)(它本身可以作为请求参数使用name):

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="action" value="FirstServlet">
    <input type="submit" name="action" value="SecondServlet">
</form>
Run Code Online (Sandbox Code Playgroud)

以下是 MainServlet

String action = request.getParameter("action");

if ("FirstServlet".equals(action)) {
    // Invoke FirstServlet's job here.
} else if ("SecondServlet".equals(action)) {
    // Invoke SecondServlet's job here.
}
Run Code Online (Sandbox Code Playgroud)

这只是i18n /维护友好.如果您需要在忘记考虑servlet代码的同时显示不同语言的按钮或更改按钮值,该怎么办?


稍微改变是为按钮提供固定且唯一的名称,以便可以检查其作为请求参数的存在而不是其对i18n/maintenance敏感的值:

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="first" value="FirstServlet">
    <input type="submit" name="second" value="SecondServlet">
</form>
Run Code Online (Sandbox Code Playgroud)

以下是 MainServlet

if (request.getParameter("first") != null) {
    // Invoke FirstServlet's job here.
} else if (request.getParameter("second") != null) {
    // Invoke SecondServlet's job here.
}
Run Code Online (Sandbox Code Playgroud)

最后一种方法是使用像JSF这样的MVC框架,以便可以直接将javabean方法绑定到按钮,但这需要对现有代码进行大幅更改.

<h:form>
    Last Name: <h:inputText value="#{bean.lastName}" size="20" />
    <br/><br/>
    <h:commandButton value="First" action="#{bean.first}" />
    <h:commandButton value="Second" action="#{bean.Second}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

只使用以下javabean而不是servlet

@ManagedBean
@RequestScoped
public class Bean {

    private String lastName; // +getter+setter

    public void first() {
        // Invoke original FirstServlet's job here.
    }

    public void second() {
        // Invoke original SecondServlet's job here.
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 哇,非常全面的答案! (4认同)