7

私はjspとサーブレットが初めてです。私のシナリオは次のとおりです

フォームを含むjspページがあります。2 つのフィールドを持つ。jsp ページのコード スニペットは次のとおりです。

MyFirstJSP.jsp ファイル

<body>
<h1> This is my first jsp and servlet project</h1>
<%
//System.out.println(request.getAttribute("fname"));

if(request.getAttribute("fname")!=null){
    System.out.println(request.getAttribute("fname"));
}else{
    System.out.println("No request ");
}
%>
<form action="MyFirstServlet" method="get">
First Name<input type="text" name="fname" value= ${fname}><br>
Last Name<input type="text" name="lname" value= ${lname}>
<input type="submit" value="Send">
</form>
</body>

このフォームを送信すると、ユーザーが入力した名をチェックする MyFirstServlet が呼び出されます。最初の名前が「abc」と等しい場合、サーブレットは属性を要求オブジェクトに設定し、それを呼び出し元の jsp ページ、つまり上記のページにリダイレクトします。request オブジェクトから値を取得し、フォームのそれぞれのフィールドに入力します。私も同じ効果のために Java 式言語を持っています。

MyFirstServlet.java サーブレット ファイルのコード スニペットを次に示します。

/**
 * Servlet implementation class MyFirstServlet
 */
public class MyFirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public MyFirstServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       // TODO Auto-generated method stub
    String firstname=request.getParameter("fname");
    if(firstname.equalsIgnoreCase("abc")){
        System.out.println("Setting attributes");
        request.setAttribute("fname",firstname);
        request.setAttribute("lname",request.getParameter("lname"));
        response.sendRedirect("MyFirstJSP.jsp");
    }else{
        System.out.Println("No problem");
    }
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter p=response.getWriter();
    p.println("Success!");
    doGet(request,response);
}
}

しかし、コードを実行すると、サーブレットは jsp ページにリダイレクトされますが、フォーム フィールドにそれぞれの値が入力されません。原因を見つけるために、if-else-block を追加して原因を調べましたが、ここではリクエスト オブジェクト属性が利用できないことがわかりました。

この場合にリクエストディスパッチャーを使用すると、値が利用可能になり、フォームに値が入力されますが、アドレスバーの URL は変更されず、常にサーブレットに URL が表示されます。

だから私のクエリは

**1) sendRedirect を使用してリクエスト オブジェクトを jsp ページで使用できないのはなぜですか。

2)ユーザーがフォームにデータを再入力する必要がないように、サーブレットが呼び出し元のjspにリダイレクトする場合、ユーザーが入力した値が事前に入力されたフォームをjspページに表示する他の方法はありますか.**

この問題で友達を案内してください ありがとう!

4

2 に答える 2

19

リダイレクトはクライアント側のアクションであるため、サーバー側の jsp ページに転送する必要があります (ロケーション ヘッダー1を確認してください)。リクエスト属性は失われます。

交換

response.sendRedirect("MyFirstJSP.jsp");

request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response);

編集:申し訳ありませんが、私はこの部分をスキップしました

この場合にリクエストディスパッチャーを使用すると、値が利用可能になり、フォームに値が入力されますが、アドレスバーの URL は変更されず、常にサーブレットに URL が表示されます。

それにもかかわらず、リダイレクト時に要求属性を jsp に渡すことはできません (前述のとおり、これはクライアント側のアクションです)。

次のことをお勧めします。

  • フォームを含むページのみをレンダリングするために doGet を実装する
  • 送信されたフォーム データを処理する doPost を実装する
  • HTML フォームで GET の代わりに POST を使用してフォームを送信する

doGet と doPost の両方で、forwardを使用して *.jsp ページをレンダリングします。

GET /MyFirstServlet -> MyFirstJSP.jsp に転送

POST /MyFirstServlet -> MyFirstJSP.jsp に転送

これは、最も一般的に使用されるクリーンなアプローチです。

編集 2: 簡単な例

SimpleFormServlet.java

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

private static final String VIEW_NAME = "/WEB-INF/jsp/simpleForm.jsp";
private static final String MODEL_NAME = "form";

public SimpleFormServlet() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setAttribute(MODEL_NAME, new SimpleForm());
    request.getRequestDispatcher(VIEW_NAME).forward(request, response);
}

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

    final SimpleForm form = map(request);

    if(form.getfName().equalsIgnoreCase("abc")){
        request.setAttribute(MODEL_NAME, form);
        // put additional attributes on the request
        // e.g. validation errors,...
        request.getRequestDispatcher(VIEW_NAME).forward(request, response);
    }else{
        System.out.println("No problem");
        response.sendRedirect("/SuccessServlet");
    }
}

private SimpleForm map(final HttpServletRequest request) {
    SimpleForm form = new SimpleForm();
    form.setfName(request.getParameter("fName"));
    form.setlName(request.getParameter("lName"));
    return form;
}

public static class SimpleForm implements Serializable {
    private static final long serialVersionUID = -2756917543012439177L;

    private String fName;
    private String lName;

    public String getfName() {
        return fName;
    }
    public void setfName(String fName) {
        this.fName = fName;
    }
    public String getlName() {
        return lName;
    }
    public void setlName(String lName) {
        this.lName = lName;
    }

}

}

/WEB-INF/jsp/simpleForm.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>

<form method="POST">
    First Name<input type="text" name="fName" value="${form.fName}"><br>
    Last Name<input type="text" name="lName" value="${form.lName}">
    <input type="submit" value="Send">
</form>

</body>
</html> 
  1. GET /シンプルフォームサーブレット
  2. doGet() は、フォーム モデル (SimpleForm) を準備し、「フォーム」という名前のリクエスト属性として追加します
  3. simpleForm.jsp に転送します
  4. モデル値にアクセスし、フォームに事前入力: ${form.fName} および ${form.lName}
  5. ブラウザーにはまだ /SimpleFormServlet が表示されます (そして、私たちはそれが気に入っています ;-))
  6. /SimpleFormServet に対して相対的にフォームをPOSTします (フォーム要素の action 属性を明示的に設定する必要はありません)。
  7. doPost() は、リクエスト パラメータを SimpleForm にマップします。
  8. リクエストを処理し、やりたいことを何でもする (検証)
  9. その後、simpleForm.jsp に転送する (検証が失敗した場合など) か、別のサーブレット (/SuccessServlet など) にリダイレクトできます。
于 2012-09-10T12:23:02.500 に答える
6

答えるには遅すぎることはわかっていますが、これは誰かの役に立ちます。リダイレクトはクライアント側のアクションであるため、属性値を取得することはできませんが、URL 書き換えの概念を使用して解決 できます

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       // TODO Auto-generated method stub
String firstname=request.getParameter("fname");
if(firstname.equalsIgnoreCase("abc")){
    //System.out.println("Setting attributes");

    response.sendRedirect("MyFirstJSP.jsp?fname="+firstname+"&lname="+request.getParameter("lname")+"");
}
else{
    System.out.Println("No problem");
  }
}

次に、request.getParameter()を使用して、値を MyFirstJSP.jsp の文字列として抽出します。

于 2015-04-27T08:45:13.993 に答える