32

首先,这里是代码:

<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 button被按下FirstServletSecondServlet button被按下SecondServlet

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

4

6 回答 6

92

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

可能最简单的方法是使用 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 进一步委托给正确的 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>

与以下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 方法绑定到按钮,但这需要对现有代码进行重大更改。

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

}
于 2012-08-06T14:39:30.390 回答
4

除了前面的响应之外,提交具有不同按钮的表单而不会出现语言问题的最佳选择实际上是使用按钮标签。

<form>
    ...
    <button type="submit" name="submit" value="servlet1">Go to 1st Servlet</button>
    <button type="submit" name="submit" value="servlet2">Go to 2nd Servlet</button>
</form>
于 2014-02-14T01:17:51.677 回答
4

如果你使用 jQuery,你可以这样做:

<form action="example" method="post" id="loginform">
  ...
  <input id="btnin" type="button" value="login"/>
  <input id="btnreg" type="button" value="regist"/>
</form>

js 将是:

$("#btnin").click(function(){
   $("#loginform").attr("action", "user_login");
   $("#loginform").submit();
}
$("#btnreg").click(function(){
   $("#loginform").attr("action", "user_regist");
   $("#loginform").submit();
}
于 2014-03-28T08:23:37.657 回答
0

您可能需要为每个按钮提交编写一个 javascript。不要在表单定义中定义动作,而是在 javascript 中设置这些值。像下面的东西。

function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});
于 2012-08-06T14:38:14.963 回答
0

如果您使用弹簧,这是一种更好的方法

有没有办法使用注释在 Spring MVC 上创建具有多个提交按钮的表单?

于 2015-03-23T13:11:35.127 回答
0
    function gotofirst(){
        window.location = "firstServelet.java";
}
    function gotosecond(){
        window.location = "secondServelet.java";
}
<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" onclick="gotofirst()" value="FirstServlet">
    <input type="submit" onclick="gotosecond()" value="SecondServlet">
</form>
于 2020-05-08T10:32:04.833 回答