2012-08-06 26 views
25

一按钮,这里是代码:多提交相同的形式调用不同的Servlet

<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被压到FirstServlet和情况SecondServlet button被按到SecondServlet

重要:
我想这样做,以相同的形式,因此相同的信息将被transered到双方的servlet。 (当然,在servlet中我会相应地使用这些信息)

回答

79

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

可能最简单的方法就是使用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(或优选地,合适的商业操作),这取决于按钮按压(其是由本身可作为一个请求参数其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. 
} 

下面这仅仅是不是版本y国际/维护友好。如果您需要以不同语言显示按钮或者在忘记考虑servlet代码的同时更改按钮值?


略有变化是给按钮自己固定和唯一的名称,以使得它作为请求参数存在可以进行检查,而不是它的值,该值将是I18N /维护敏感:

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

末方式下面将到j最好使用一个像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. 
    } 

} 
+4

哇,很全面的回答! – 2012-08-06 15:43:42

+0

+ 1为回答越界:) – srk 2014-01-06 18:13:15

+0

@BalusC你能解释如何调用servlet我试过像这样'RequestDispatcher rd = request.getRequestDispatcher(“/ servletName”); \t \t \t rd.forward(request,response);'。但它不工作 – spt 2015-07-01 09:13:29

0

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

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

除了先前响应,最好选择与不同的按钮提交表单没有语言问题,实际上是使用按钮标签。

<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

如果你使用jQuery,U可以做到这一点是这样的:

<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(); 
}