2

簡単なログインページを作成しました。ユーザーが正しいユーザー名とパスワードを入力した場合、ページは成功ページにリダイレクトされます。それ以外の場合は、インデックス ページにリダイレクトされます。ログインページで、サーブレットにフォーム送信アクションを指定しました。サーブレットが入力を検証すると、それぞれの jsp ページにディスパッチされます。私の問題は、ディスパッチ後もアクション名がURLに残っていることでした。そうですか?

package com.123.www;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Login() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {

        response.setContentType("text/html");

        //PrintWriter out = response.getWriter();

        String userName = request.getParameter("username");

        String passWord = request.getParameter("password");

        RequestDispatcher view = null ;

        if((userName=="")&&(passWord==""))
        {
            view = request.getRequestDispatcher("index.jsp");
        }
        else
        {   
            HttpSession session = request.getSession(true);
            session.setAttribute("name",userName);
            view = request.getRequestDispatcher("success.jsp");
        }

        view.forward(request, response);

    }

}
4

2 に答える 2

2

ディスパッチは、クライアント側ではなくサーバー側で行われます。forward は基本的に、結果を表示するために使用するビューを servletcontainer に伝えます。その場所は、実際にはクライアントのブラウザーのアドレス バーには表示されません。これは、 の代わりにリダイレクトを使用した場合にのみ発生しますresponse.sendRedirect()。リダイレクトは基本的に、指定された場所で新しい GET リクエストを発行するよう Web ブラウザに指示します。これにより、ブラウザのアドレス バーが新しい URL に変更されます。

フォルダ内のビュー (JSP ファイル) を非表示にして/WEB-INF、エンドユーザーが直接アクセスできないようにし、まったく同じサーブレットを再利用して 経由でログイン フォームを表示し、経由doGet()でログイン フォーム送信の処理を続行しますdoPost()。実装しない場合、HTTP Status 405 - HTTP method GET is not supported by this URL が表示されdoGet()ます。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Just show form.
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Process form submit.
        // ...

        if (success) {
            response.sendRedirect("home");
        } else {
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
        }
    }

}

このようにして、 http://example.com/context/loginでログイン ページを取得し、同じ URL に送信できます。

フロント コントローラー パターンを使用して、単一のサーブレットで他のすべての URL に対して同じことを行うことができます。それはほんの少しの作業であり、それが MVC フレームワークが存在する理由でもあります :)

以下も参照してください。

于 2011-05-06T20:22:51.327 に答える
1

サーブレットには、転送と呼ばれる魔法があります。むしろ HTTP リダイレクトを使用する必要があります。このメソッドは、フォームを POST メソッドで送信する場合に非常に便利です。次に、HTTPリダイレクトページアドレスを送信した後、ユーザーはページを更新しようとしたときにフォームを2回送信しません。

Spring Framework について聞いたことがありますか? Web アプリケーションを構築するための優れたスケルトンを提供します。

于 2011-05-06T20:15:45.783 に答える