如何使JSP函数仅在被调用时才运行?

问题描述:

我有一个JSP页面如下:如何使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文件时,函数会自动运行,插入MYSQL查询会自动插入查询中给出的值。

我不希望它的功能add_admin()delete_admin()在加载时自动运行。有什么建议么?

+3

不要在jsp中编写代码,编写一个合适的servlet,在通过RequestDispatcher呈现JSP之前执行代码 – BigMike

+0

@BigMike我不认为这里的问题是“我应该使用servlets over jsp”。除非你说jsp中没有办法做到这一点,在这种情况下,我误解了。 – Nathan

+0

你说得对,我可以更好地表达它,这里的主要问题是服务器和客户端代码执行之间的混淆。 – BigMike

当有人打开您的网页并点击按钮时,网页中的事件(例如onclick事件)就会在客户端执行。 JSP网页脚本在网页打开时执行,其结果是客户端接收的实际页面。所以你的方法只在页面加载时执行(并且JSP被编译)。 Java代码在您生成的网页中甚至不可见。如果你在浏览器中打开它并检查源代码,你会明白我的意思。

+0

所以我想我别无选择,只能把它放在一个servlet/java文件中。正如你在代码中看到的那样,我只是希望脚本处于JSP的中间,这就是我决定将它放入JSP中的原因。 – yashas123

+0

无论如何,现在我知道它不可能在JSP上,我可以找到我自己的解决方案:) – yashas123

+1

是的,为了在后端执行某些操作(JSP/servlet或其他)。您需要从网页执行请求。你可以使用JSP而不是一个servlet。 JSP基本上是一个servlet,只是写得很漂亮。例如,如果我们使用删除按钮并使其onClick = window.location.search + ='&delete = true',则可以使用并相应地执行逻辑。但它会是一样的 - 每个按钮将重新加载页面,并用不同的参数重新编译java代码 –

TL; DR:不能

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

一旦你的页面被加载,所有它是HTML和Javascript(CSS如果你想吵嘴)。