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

时间:2012-08-06 14:32:05

标签: 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 buttonFirstServlet按下SecondServlet button以及SecondServlet被{{1}}按下的情况下如何发送信息。

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

5 个答案:

答案 0 :(得分:88)

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

最简单的方法是使用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(或者最好是正确的业务操作)(它本身可以作为请求参数{{{ 1}}):

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

这只是i18n /维护友好。如果您需要以其他语言显示按钮或更改按钮值而忘记考虑servlet代码,该怎么办?


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

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

if ("FirstServlet".equals(action)) {
    // Invoke FirstServlet's job here.
} else if ("SecondServlet".equals(action)) {
    // Invoke SecondServlet's job here.
}

<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

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

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

只使用以下javabean而不是servlet

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

答案 1 :(得分: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>

答案 2 :(得分:3)

如果你使用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();
}

答案 3 :(得分:0)

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

function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});

答案 4 :(得分:0)