【问题标题】:How to make a JSP function to run only when called?如何使 JSP 函数仅在调用时运行?
【发布时间】:2018-03-31 11:10:54
【问题描述】:

我的 JSP 页面如下:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Admin Tools</title>
        <jsp:include page="/basic/nav.jsp"/>
        <link rel="stylesheet" type="text/css" href="tools.css"/>
    </head>
    <body>
        <div class="container">
            <h2>Admin Tools</h2>
            <br/><br/><br/><br/>
            <%@page import="java.sql.ResultSet"%>
            <%
                boolean def_admin = false, def_admin_changed = false;
                conn.connect.main(null);
                conn.dbc.main(null);
                ResultSet rstools = conn.connect.st.executeQuery("select * from admins where uname='admin'");
                if (rstools.next()) {
                    if (rstools.getString("uname").equals("admin") && rstools.getString("password").equals("123")) {
                        def_admin = true;
                    }
                    if (rstools.getString("uname").equals("admin") && !rstools.getString("password").equals("123")) {
                        def_admin_changed = true;
                    }
               }
            %>
            <%if (def_admin == false) {%>
            Add Default Admin Account :<br/>
            <input type="button" value="Add" onclick="<% add_admin(); %>"/>
            <% } else if (def_admin == true && def_admin_changed == false) { %>
            Delete Default Admin Account :<br/>
            <input type="button" value="Delete" onclick="<% delete_admin(); %>"/>
            <% } else if (def_admin == true && def_admin_changed == false) { %>
            The Default Admin Password Exists but the password has been changed<br/>
        Do you still want to delete the Default Admin Account?<br/>
            <input type="button" value="Even so, Delete it" onclick="<% delete_admin(); %>"/>
        <% }%>

        <div id="tools_error"></div>

        <%!
            boolean insert_success = false;

            void add_admin() {
                try {
                    int Urows;
                    Urows = conn.connect.st.executeUpdate("insert into admins(uname,password) values('admin','123');");
                    if (Urows == 1) {
                        insert_success = true;
                    } else {
                        insert_success = false;
                    }
        %>
            <script>
            (function () {
                boolean i_s = "<%=insert_success%>";
                if (i_s == false) {
                    document.getElementById("tools_error").value = "There has been an error in Adding Default Admin";
                }
            });
            </script>
            <%!
                } catch (Exception e) {
                    }
                }

                void delete_admin() {

                }
            %>
        </div>
    </body>
    <jsp:include page="/basic/footer.jsp"/>
</html>

正如您在单击按钮时看到的那样,我已经让它运行声明的 JSP 函数。但是当加载 JSP 文件时,函数会自动运行,insert MYSQL 查询会运行,它会自动插入查询中给定的值。

我不希望函数 add_admin()delete_admin() 在加载时自动运行。有什么建议吗?

【问题讨论】:

  • 不要在你的jsp中编写代码,编写一个适当的servlet,在通过RequestDispatcher呈现JSP之前执行代码
  • @BigMike 我不认为这里的问题是“我应该在 jsp 上使用 servlet”。除非你说在 jsp 中没有办法做到这一点,在这种情况下我误解了。
  • 你说得对,我可以更好地表达它,这里的主要问题是服务器端和客户端代码执行之间的混淆。

标签: java mysql jsp


【解决方案1】:

TL;DR:你不能

您的 Java 代码在页面加载时执行一次。该页面不再在服务器上,因此您无法使用其后端功能。否则,这意味着有人重写您的 HTML 可能会使您的页面在您的后端执行任何代码。

一旦你的页面被加载,上面就只有 HTML 和 Javascript(如果你想争吵,CSS)。

【讨论】:

    【解决方案2】:

    当有人打开您的网页并单击按钮时,网页中的事件(例如 onclick 事件)在客户端执行。 JSP 脚本在网页打开时执行,其结果是客户端收到的实际页面。因此,您的方法仅在页面加载(并且 JSP 已编译)时执行。在您生成的网页中甚至看不到 java 代码。如果您在浏览器中打开它并检查源代码,您就会明白我的意思。

    【讨论】:

    • 所以我想我别无选择,只能把它放在一个 servlet/java 文件中。正如您在代码中看到的那样,我只是希望脚本位于 JSP 的中间,这就是我决定将它放在 JSP 中的原因。
    • 谢谢,现在我知道在 JSP 上不可能,我可以找到自己的解决方案 :)
    • 是的,为了在后端执行某些东西(JSP/servlet 或其他),您需要从网页发出请求。您可以使用 JSP 而不是 servlet。 JSP 基本上是一个 servlet——只是以一种漂亮的方式编写的。例如,如果我们选择删除按钮并将其设置为 onClick=window.location.search += '&delete=true' 你可以使用 并相应地执行逻辑。但这将是相同的 - 每个按钮都会重新加载页面并使用不同的参数重新编译 java 代码
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2012-08-10
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多