私は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ページ(つまり、上記のページ)にリダイレクトします。リクエストオブジェクトから値を取得し、フォームのそれぞれのフィールドに入力します。私は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ページにフォームを表示する他の方法はありますか?**
この問題で友達を案内してくださいありがとうございます!
リダイレクトとして、サーバー側のjspページに転送する必要があります)はクライアント側のアクションです(ロケーションヘッダーを確認してください 1 )リクエスト属性は失われます。
交換
response.sendRedirect("MyFirstJSP.jsp");
と
request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response);
編集:申し訳ありませんが、私はこの部分をスキップしました
この場合、リクエストディスパッチャーを使用すると、値が使用可能になり、フォームに値が入力されますが、アドレスバーのURLは変更されず、常にサーブレットへのURLが表示されます。
それでも、リダイレクト時にリクエスト属性をjspに渡すことはできません(すでに前述したように、これはクライアント側のアクションです)
次のことをお勧めします。
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>
答えるには遅すぎることは知っていますが、これは誰かに役立つでしょう。 redirectはクライアント側のアクションであるため、getAttribute値は取得できませんが、RL Rewritingの概念を使用して解決できます。
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の文字列として値を抽出します。