2017-10-19 69 views
1

我有一個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

回答

1

當有人打開您的網頁並點擊按鈕時,網頁中的事件(例如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',則可以使用<%String delete = request.getParameter(「delete」); %>並相應地執行邏輯。但它會是一樣的 - 每個按鈕將重新加載頁面,並用不同的參數重新編譯java代碼 –

1

TL; DR:不能

你的Java代碼加載頁面時執行一次。該頁面不再位於服務器上,因此您無法使用其後端功能。否則,這意味着有人重寫你的HTML可能會讓你的頁面在你的後端執行任何代碼。

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

相關問題