0
<html>
<script type="text/javascript">
    function logged()
    {
        <% session.setAttribute("logtype", "hire"); %>
        var x=<%=session.getAttribute("loggedin")%>;
        if(x===true)
        {
            window.location="home.jsp";
            return false;
        }
        else if(x===false)
        {
            return true;
        }
    }
</script>
<body>
   <form method="post" action="login.jsp" onsubmit="return logged()">
      <input type="submit" value="HIRE"/>
   </form>
   <form method="post" action="displayTasks.jsp" onsubmit="<% session.setAttribute("logtype", "work"); %>">
      <input type="submit" value="WORK"/>
   </form>   
</body>
</html>

セッション変数「logtype」が問題を引き起こしています。何をクリックしても「WORK」のままです。私は何を間違っていますか?

4

1 に答える 1

0

問題は、ページで session 属性を 2 回設定しているため、JSP がビューを生成すると、すべてのスクリプトレットが実行されることです。基本的に、JSP はこれを行っています。

session.setAttribute("logtype", "hire");
//later...
session.setAttribute("logtype", "work");

すべてのスクリプトレット コードは、ビューをレンダリングするとき (簡単に言えば、JSP を HTML に変換するとき) に実行されることに注意してください。

コメントでデビッド・ニュートンが述べたように、問題は「どこで」、「いつ」ではありません。フォーム POST でセッション属性を変更したいように見えるので、これはアクション POST リクエストで処理する必要があります。繰り返しますが、すべて JSP で行っているため、これはdisplayTasks.jspページにあるはずです。

session.setAttribute("logtype", "work");

そして、現在のページからこの行を削除します (名前が何であれ)。


現在の問題とは直接関係ありませんが、Java Web アプリケーションの開発に深刻な問題を抱えています。最初に知っておくべきことは、Java はサーバーで実行されますが(前述のように、ビューをレンダリングするとき)、JavaScript はクライアント ブラウザーで実行されるため、両方を同じレベルで直接対話させることはお勧めできません。これに気付いた後は、次の場所で詳しく説明されているように、スクリプトレットの使用を避ける必要があります: How to avoid Java code in JSP files? そしてELJSTLに移動します。

ここで、現在の開発アプローチには他にも問題があることに気付くでしょう。JSP を使用して、GET および POST リクエストを直接処理しています。学習段階にある場合は、サーバー側のデータ処理に代わりにサーブレットを使用して、これを行うことを強くお勧めします。これらすべてのツールを使用すると、開発は MVC パターンに従って行われます。基本的なログイン実装を JSP + サーブレットの例で提供します:ログイン パラメーターからユーザー オブジェクトを作成します

その後、Web 開発の経験を積んだら、ajax を試してみたいと思うでしょう。JSP、サーブレット、および Ajax に関する優れたチュートリアル: How to use Servlets and Ajax?

于 2013-07-16T05:07:32.393 に答える