如何在不使用表单的情况下从 jsp 调用 servlet

Posted

技术标签:

【中文标题】如何在不使用表单的情况下从 jsp 调用 servlet【英文标题】:How can I call servlet from jsp without using form 【发布时间】:2012-03-04 14:55:05 【问题描述】:

这可能是一个重复的问题,我很抱歉。我有一个 jsp 页面,其中有一些按钮。每个按钮都有自己的 servlet 可以调用。我想知道是否有任何方法可以在不使用表单的情况下调用这些 servlet,因为用户可以选择给定的 3 个功能中的任何一个。我还需要将 jsp 页面中的值传递给我调用的 servlet。

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Configurations</title>  
<script type="text/javascript">  
    function runConfiguration()  
        var config=$dataValues.get(0);  
        //call servlet  
      
    function editConfiguration()  
        var config=$dataValues.get(0);  
        //call servlet  
      
    function deleteConfiguration()  
        var config=$dataValues.get(0);  
        //call servlet  
      
</script>  
</head>  
<body>  
<%  
String[] label="Master Port","Baud Rate","Char Size","Stop Bits","Parity","RTU Port","Baud Rate","Char Size","Stop Bits", "Parity";  
int i=0;  
%>  
<br>  
<br>  
<br>  
<table align="center" border="1">  
   <td><div align="center" style="background-color: goldenrod;"><b> $dataValues.get(0)</b></div>   
        <table  align="left" border="1">  
            <td bgcolor="goldenrod"><b> Header1 </b></td>  
            <c:forEach var="data" begin="1" end="5" items="$dataValues" varStatus="status">  
            <tr>  
                <td><%=label[i++]%>: $data</td>  
            </tr>  
            </c:forEach>  
        </table>      
        <table  align="left" border="1">  
            <td bgcolor="goldenrod"><b> Header2 </b></td>  
            <c:forEach var="data" begin="6" end="10" items="$dataValues" varStatus="status">  
            <tr>  
                <td><%=label[i++]%>: $data</td>  
            </tr>  
        </c:forEach>  
        </table>  
   </td>  
</table>  
        <c:choose>  
        <c:when test="$dataValues.get(11)==1">  
                <p align="center"><b><i>This configuration is already running</i></b></p>  
                <p align="center">  
            <input type="button" value="stop" onclick="StopConfiguration"/>  
                </p>  
        </c:when>  
        <c:otherwise>  
                <p align="center"><b><i>This configuration is currently NOT running</i></b></p>  
                <p align="center">                     
                    <button type="button" onclick="runConfiguration()">Run</button>  
                    <button type="button" onclick="editConfiguration()">Edit</button>  
                    <button type="button" onclick="deleteConfiguration()">Delete</button>  
                </p>  
        </c:otherwise>  
    </c:choose>  
</body>  
</html>  

【问题讨论】:

+1 有用且内容丰富 【参考方案1】:

我在这里看到 2 个选项:

    在发送 POST 请求之前,使用 JavaScript 根据每个按钮相应地更改表单的 URL;

    对所有 3 种情况使用一个表单和相同的 servlet。在 servlet 中,您应该确定按下了哪个按钮(它们的值作为请求参数传递),然后相应地前进。

【讨论】:

查看更多信息:hiteshagrawal.com/ajax/…【参考方案2】:

您可以使用 Ajax 来执行此操作,或者使用更糟糕但可运行的方式,您可以更改当前窗口 url 并重新加载页面。

对于 Ajax 调用,我建议您使用 ExtJS。见Ext.Ajax Usage

其他方式:change the href、reload the window

【讨论】:

【参考方案3】:

您也可以使用 Javascript,并在用户点击按钮时调用脚本并动态更改 URL 并提交该表单。 这是一个例子.....

    <form action = "something".....>
    your stuff here....
    <button type="button" onclick="runConfiguration(actionName)">Run</button>  
    <button type="button" onclick="editConfiguration(actionName)">Edit</button>
    <button type = "button" onclick = "deleteConfiguration(actionName)">Delete</button> 

在你的脚本中

    <script type="text/javascript">  
        function runConfiguration(actionName)  
            var config=$dataValues.get(0);
            goToPage(actionName);
            //call servlet  
          
        function editConfiguration(actionName)  
            var config=$dataValues.get(0);
             goToPage(actionName)  
            //call servlet  
          
        function deleteConfiguration(actionName)  
            var config=$dataValues.get(0);
             goToPage(actionName)  
            //call servlet  
         

function gotopage(actionname)
   
        document.formName=actionname;
        document.formName.submit();
 
    </script>  

【讨论】:

【参考方案4】:

请在您的 JSP 中指定操作字符串并在您的 servlet 中检查它。

根据该字符串操作,您可以在 servlet 代码中设置条件,即您希望该特定操作执行什么操作。 请看下面这是我在我的代码中所做的。

举例

<A href="<%=request.getContextPath()%>/JobAction?action=runConfig">RUN</a>

<a href="<%=request.getContextPath()%>/JobAction?action=editConfig">EDIT</a>

您可以只调用一个 servlet,而不是调用许多 servlet。 在你的 servlet 中使用这样的代码。

String action = request.getParameter("action");
if (action.equalsIgnoreCase("runConfig")) 
    // Specify what you want to do
 else if (action.equalsIgnoreCase("editConfig")) 
    // Specify what you want to do
 else if (action.equalsIgnoreCase("deleteConfig")) 
    // Specify what you want to do

【讨论】:

【参考方案5】:

你可以用这个:

<a href="<%=request.getContextPath()%>/logout"> Logout </a>

如果你想给它添加一些引导程序,你所要做的就是

<a href="<%=request.getContextPath()%>/logOut"> 
    <button class="btn btn-outline-secondary" type="button">log out </button>
</a>

【讨论】:

以上是关于如何在不使用表单的情况下从 jsp 调用 servlet的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用表单的情况下从 Rails 应用程序发布到外部 url

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?

如何在不使用 curl 和 guzzle 的情况下从控制器 Laravel 调用 API,因为它不起作用 [关闭]

如何在不通过 COM 的情况下从 VB6 调用 C++ DLL?