lines-of-code.jpg

HTTP是State-less的協定,也就是說,每當接收一次新的請求時  他不會記得上一次的請求跟回應是什麼內容
但有時候我們是需要取得前一次或前幾次的請求內容的,EX: 購物車或是問卷系統
為了達成這樣的需求,我們必須做好會話管理(Session-Maangement)


在書上提到,我們可以藉由隱藏欄位(Hidden Field)來達到此需求 我們可以看看這個例子:

QuestionnaireServlet.java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author allen0818
 */
@WebServlet(name = "QuestionnaireServlet", urlPatterns = {"/questionnaire"})
public class QuestionnaireServlet extends HttpServlet {

  /**
   * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
   * methods.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    
    try (PrintWriter out = response.getWriter()) {
      out.println("<!DOCTYPE html>");
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Questionnaire</title>");      
      out.println("</head>");
      out.println("<body>");
      
      String page = request.getParameter("page");
      out.println("<form action='questionnaire' method='post'>");
      
      if(page == null) {
        out.println("問題一: <input type='text' name='p1q1'><br>");
        out.println("問題二: <input type='text' name='p1q2'><br>");
        out.println("<input type='submit' name='page' value='page2'>");
      } else if("page2".equals(page)) {
        String p1q1 = request.getParameter("p1q1");
        String p1q2 = request.getParameter("p1q2");
        out.println("問題三:<input type='text' name='p2q1'><br>");
        out.println("<input type='hidden' name='p1q1' value='" + p1q1 + "'>");
        out.println("<input type='hidden' name='p1q2' value='" + p1q2 + "'>");
        out.println("<input type='submit' name='page' value='finish'>");
      } else if("finish".equals(page)) {
        out.println(request.getParameter("p1q1") + "<br>");
        out.println(request.getParameter("p1q2") + "<br>");
        out.println(request.getParameter("p2q1") + "<br>");
      }
      
      out.println("</form>");
      out.println("</body>");
      out.println("</html>");
    }
  }
}

從這個例子中我們可以看到,在page2時程式將page1傳來的兩個參數存起來
接著放進表格中的隱藏欄位中,最後在將隱藏欄位內容及page2中的內容一起傳給
finish頁面來做呈現,達到我們想要的要求。

out.println("<input type='hidden' name='p1q1' value='" + p1q1 + "'>");
out.println("<input type='hidden' name='p1q2' value='" + p1q2 + "'>");

 

這樣的做法雖然從表面上我們不會在page2頁面中看到隱藏欄位的內容
但從原始碼是可以將隱藏欄位內容一覽無遺的,因此不會是JSP/Servlet實作會話管理的背後機制
但卻是相當重要的一個概念!

參考資料:
1. 「Servlet&JSP教學手冊 第二版」

arrow
arrow
    文章標籤
    JSP Servlet Hidden Field
    全站熱搜

    allen0818 發表在 痞客邦 留言(0) 人氣()