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教學手冊 第二版」
文章標籤
全站熱搜
留言列表