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

标签 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>

我想了解在 FirstServlet 按钮 被按下到 FirstServlet 以及 SecondServlet 按钮 被按下时如何发送信息按下 SecondServlet

重要:
我想以相同的形式执行此操作,以便将相同的信息传输到两个 servlet。 (当然,在 servlet 中我会相应地使用这些信息)

最佳答案

有几种方法可以实现这一点。

可能最简单的方法是使用 JavaScript 来更改表单的操作。

<input type="submit" value="SecondServlet" onclick="form.action='SecondServlet';">

但是当最终用户禁用 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>

请注意,表单在提交时只会发送包含在同一个表单中的输入数据,而不是在另一个表单中。


另一种方法是创建另一个单一入口点 servlet,该入口点 servlet 进一步委托(delegate)给正确的 servlet(或者最好是正确的业务操作),具体取决于按下的按钮(它本身可作为请求参数由其 名称):

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

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

这只是对 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>

MainServlet

中有以下内容
if (request.getParameter("first") != null) {
    // Invoke FirstServlet's job here.
} else if (request.getParameter("second") != null) {
    // Invoke SecondServlet's job here.
}

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

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

仅使用以下 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.
    }

}

关于java - 同一表单中的多个提交按钮调用不同的 Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11830351/

相关文章:

javascript - 如何在 JSP 中访问 &lt;script&gt; 中的用户定义对象数组?

使用 HTML5 文档类型时忽略 CSS 文件

java - 如何在 Java 中使用 CacheBuilder 构建和使用缓存

Java : Function local variable initialization

java - 线程中的异常 "main"java.lang.IllegalArgumentException : PWC6309: Illegal compilerSourceVM: 12

java - JAVA 如何知道我的 CSV 文件列的数据类型

javascript - 使用 AJAX 响应在 JSP 中填充下拉列表

java - 获取自定义 Spring 作用域中的当前请求

java - Servlet 上下文 URL

java - SpringMVC、null spring beans、servlet 和 Apache Thrift