2017-10-19 18 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ファイルがロードされると、関数が自動的に実行され、INSERT MYSQLクエリが実行され、クエリに指定された値が自動的に挿入されます。

add_admin()delete_admin()は、読み込み時に自動的に実行されたくありません。助言がありますか?

+3

RequestDispatcherを使ってJSPを提示する前にコードを実行する適切なサーブレットを書いてください。 – BigMike

+0

@BigMikeここでの質問は「jspでサーブレットを使うべきか」とは思わない。 JSPでこれを行う方法がないと言っているのでない限り、私は誤解しています。 – Nathan

+0

あなたはちょっとうまく表現できました。ここでの主な問題は、サーバー側とクライアント側のコード実行の混乱です。 – BigMike

答えて

1

ウェブページ(例:onclickイベント)のイベントは、誰かがあなたのウェブページを開いてボタンをクリックするとクライアント側で実行されます。 JSPスクリプレットは、Webページが開かれ、その結果がクライアントが受け取る実際のページであるときに実行されます。そのため、メソッドはページがロードされたとき(JSPがコンパイルされたとき)にのみ実行されます。 Javaコードは、生成するWebページにも表示されません。ブラウザで開いてソースを確認すると、私の言いたいことが分かります。

+0

だから、私はサーブレット/ javaファイルに入れることしかできないと思う。コードでわかるように、私はちょうどスクリプトがJSPの真ん中にあるようにしていました。それが私がJSPに入れる理由です。 – yashas123

+0

とにかく、JSPで不可能であることを知ったので、私自身の解決策を見つけることができます:) – yashas123

+1

バックエンド(JSP /サーブレットなど)で何かを実行するにははい、Webページからリクエストを行う必要があります。サーブレットではなくJSPを使用できます。 JSPは基本的にはサーブレットです。ちょうどかなり書かれています。たとえば、削除ボタンを押してonClick = window.location.search + = '&delete = true'にすると、<%String delete = request.getParameter( "delete"); %>とそれに応じてロジックを実行します。しかし、それは同じになります - 各ボタンはページをリロードし、異なるパラメータでJavaコードを再コンパイルします –

1

TL; DR:ページがロードされたときにあなたがすることができません

あなたのJavaコードは、一度実行されます。ページはもはやサーバー上にないため、バックエンド機能を使用することはできません。そうしないと、HTMLを書き換えている人がバックエンドでコードを実行する可能性があります。

ページが読み込まれると、HTMLとJavascript(ビッカーしたい場合はCSS)がすべて表示されます。

関連する問題