2013-08-05 57 views
0

我在jsp中有一個web表單,它應該從servlet獲取值,但是它打印出空值。我在下面包含了jsp和servlet的代碼。任何人都可以告訴我如何解決下面的代碼,以便它打印出請求對象的值而不是打印空值?servlet將空值打印到jsp

這裏是my.jsp代碼:

<jsp:useBean id="errors" scope="request" type="java.util.Map" class="java.util.HashMap" /> 
<form method="post"> 
    <table> 
     <tr> 
      <td width=302> 
      </td> 
      <td width=250> 
       <table> 
        <tr> 
         <td width=150 align="right">tha: </td> 
         <td><input type="text" name="tha" value="c3t" size="15" /> 
          <%if (errors.containsKey("tha")) {out.println("<span class=\"error\">" + errors.get("tha") + "</span>");} 
          else{out.println(request.getParameter("tha"));}%> 
         </td> 
        </tr> 
        <tr> 
         <td width=150 align="right">min: </td> 
         <td><input type="text" name="min" value="0" size="15" /> 
          <% if (errors.containsKey("min")) {out.println("<span class=\"error\">" + errors.get("min") + "</span>");} 
          else{out.println(request.getParameter("min"));}%> 
         </td> 
        </tr> 
        <tr> 
         <td width=150 align="right">max: </td> 
         <td><input type="text" name="max" value="2*pi" size="15" /> 
         <% if (errors.containsKey("max")) {out.println("<span class=\"error\">" + errors.get("max") + "</span>");} 
         else{out.println(request.getParameter("max"));}%> 
         </td> 
        </tr> 
        <tr> 
         <td></td> 
         <td align="right"> 
         <input type="submit" name="submit-button" value="Click To Plot" /> 
         </td> 
        </tr> 
       </table> 
      </td> 
     </tr> 
    </table> 
</form> 

這裏是servlet代碼:

public class PlotPolarServlet extends HttpServlet{ 
    private RequestDispatcher jsp; 

    public void init(ServletConfig config) throws ServletException { 
     ServletContext context = config.getServletContext(); 
     jsp = context.getRequestDispatcher("/WEB-INF/jsp/my.jsp"); 
    } 

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
     jsp.forward(req, resp); 
    } 

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException{ 
     Map<String, String> errors = validate(req); 
     if (!errors.isEmpty()){ 
      jsp.forward(req, resp); 
      return; 
     } 
     resp.sendRedirect("my"); 
    } 

    public static Map<String, String> validate(HttpServletRequest req){ 
     HashMap<String, String> errors = new HashMap<String, String>(); 
     req.setAttribute("errors", errors); 
     String tha = req.getParameter("tha"); 
     if (tha == null || tha.trim().length() == 0){ 
      errors.put("tha", "tha required."); 
     } 
     String min = req.getParameter("min"); 
     if (min == null || min.trim().length() == 0){ 
      errors.put("min", "min required."); 
     } 
     String max = req.getParameter("max"); 
     if (max == null || max.trim().length() == 0){ 
      errors.put("max", "max required."); 
     } 
     return errors; 
    } 
} 
+0

旁註:擺脫那個實例變量,並在JSP中使用JSTL/EL! – NINCOMPOOP

+0

@TheNewIdiot你能更具體嗎?建議實際行添加/刪除? – CodeMed

+0

@CodeMed所有這些都不是JSTL/EL。 –

回答

2

我最初誤解你的問題。問題是當參數輸入正確時,而不是出現錯誤時。因爲,在此請求,還有用這些密鑰沒有參數驗證碼

<% if (errors.containsKey("min")) {out.println("<span class=\"error\">" + errors.get("min") + "</span>");} 
else{out.println(request.getParameter("min"));}%> 

else部分不能打印任何東西,但null

A HttpServletResponse#sendRedirect(String)返回一個302 HTTP狀態代碼,這會使瀏覽器向String參數所描述的位置發送一個新的HTTP請求。請求參數不在新請求中(處理請求後請求上下文/作用域被清除)。您需要將它們放入會話屬性中。

這被稱爲閃光範圍和閃光燈的屬性和它可以被實現爲具有一個servlet Filter解釋here。你基本上存儲你想在2個請求之間重用的屬性,然後刪除它們。

至於編輯:

除非你複製粘貼的代碼在你的編輯錯誤

<td><input type="text" name="yX" value="cx" size="15" /> 
    <%if (errors.containsKey("yX")) { // errors doesn't contain yX as a Key, it contains imageParam1 
     out.println("<span class=\"error\">" + errors.get("yX") + "</span>"); 
    }else{out.println(request.getParameter("yX"));}%> // will print the value of the request parameter with key yX 
</td> 

POST荷蘭國際集團名爲yX參數,但尋找imageParam。您的doPost()方法將創建請求屬性errors,然後forward(而不是sendRedirect)。

errors.put("imageParam1", "imageParam1 required."); 
... 
if (!errors.isEmpty()){ 
    jsp.forward(req, resp); 
    return; 
} 

不是yX。因此,else會得到評估並且參數存在,因爲它是相同的請求。

更多的解釋

在你my例如:

  1. 如果沒有輸入要求的領域,doPost()方法被調用時,errors地圖被填充,你的代碼做jsp.forward(req, resp);這使用相同的請求,當jsp呈現時參數可用。
  2. 如果輸入了所有必填字段,則調用doPost(),並執行resp.sendRedirect("my");。這會導致瀏覽器發送一個新的GET HTTP請求,並帶有新的參數/屬性。這會導致調用doGet()來處理新請求,該請求會轉發給您的jsp。原始請求參數不包含在此請求中,因此沒有任何內容可以顯示,因此當else{out.println(request.getParameter("min"));被渲染時,null

在你myother例子,因爲在JSP中<input>參數名稱和你正在尋找在servlet,你要我在前面已經解釋完全不相關的結果參數名之間的差別。不考慮這個servlet。它沒有做你認爲它做得正確的事情。

+0

謝謝你讓我知道我錯了:)。 Upvote的正確答案:) –

+0

@PrasadKharkar我也會發表評論,但你之前我可以刪除。 –

+0

它很好地刪除了一個答案,如果它沒有幫助.. –