2012-09-10 59 views
4

我是jsp和servlet的新手。我的情況如下從servlet使用sendRedirect時請求屬性在jsp頁面中不可用

我有一個jsp頁面,它有一個窗體。有兩個領域。 jsp頁面的代碼snipet如下。

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」,那麼servlet將該屬性設置爲請求對象並將其重定向到調用jsp頁面即上面的頁面。它將從請求對象中獲取值並將其填充到相應的表單字段中。 我也有相同的效果的Java表達式語言。

這裏是MyFirstServlet.java servlet的文件

/** 
* 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); 
} 
} 

我的一小段代碼片段但是,當我執行代碼的servlet重定向到JSP頁面,但不填充與相應值的表單字段。 至於找到原因,我添加了if-else-block來知道原因,並且我知道請求對象屬性在此處不可用。

如果我在這種情況下使用請求調度程序,那麼這些值將變得可用,表單將被填充值,但地址欄中的url不會變化,並始終向servlet顯示url。

所以我的查詢是

** 1)爲什麼請求對象不可用的sendRedirect jsp頁面。

2)是THRE任何其他的方式來顯示我在與用戶輸入的值預填充jsp頁面表單如果servlet sendredirects到調用JSP,使用戶不必重新輸入到表單中的數據。**

請指導我這個問題的朋友 謝謝!

+0

閱讀BalusC的答案:http://stackoverflow.com/questions/2047122/requestdispatcher-interface-vs-sendredirect –

回答

16

您需要到服務器端的jsp頁面,爲重定向是客戶端操作(踩點頭1)請求屬性迷路。

更換

response.sendRedirect("MyFirstJSP.jsp"); 

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

編輯:對不起,我跳過這部分

如果我使用請求調度器在這種情況下,則值變得可用,表單將被填充值,但地址欄中的url不會變化,並始終向servlet顯示url。

不過,你無法通過重定向時(正如我已經在它上面提到的是一個客戶方的行動)

我建議做以下請求屬性你的jsp:

  • 實施doGet僅用於渲染包含表格的頁面
  • 實現用於處理提交的表單數據的doPost
  • 在HTML表單中使用POST代替GET來提交形式

在兩者的doGet和doPost,使用渲染*的.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/SimpleFormServlet
  2. 的doGet( )準備表單模型(SimpleForm)並將其添加爲請求屬性na MED '形成'
  3. 期待的simpleForm.jsp
  4. 訪問的模型值和預填表格:$ {form.fName}和$ {} form.lName
  5. 瀏覽器仍顯示/ SimpleFormServlet(和我們喜歡它;-))
  6. POST形式相對到/ SimpleFormSerlvet(你沒有設置表單元素的action屬性明確)
  7. 的doPost()請求參數到SimpleForm映射。
  8. 處理請求和(例如/ SuccessServlet)做任何你想做的事情(驗證)
  9. ,那麼你可以期待的simpleForm.jsp(在驗證失敗等)或重定向到另一個servlet
+0

謝謝!朋友的回覆,但我關心的一個問題是瀏覽器的地址欄中的URL,如果我使用請求調度程序,它不會發生變化。我的要求是,該值應該可用於jsp頁面來填寫表單以及瀏覽器的地址欄中的url應該更改爲jsp頁面url。 –

+0

@ Param-Ganak:然後使用Session範圍 –

+1

@ Param-Ganak:對不起,我剛剛編輯了我的文章(並且請不要使用Session範圍表示屬性和參數等形式) –

4

我知道現在回答已經太遲了,但這對某人會有幫助。 重定向是客戶端操作,所以我們不能getAttribute值,但我們可以通過使用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字符串。

相關問題