1. 程式人生 > >Java之Request域物件及cookie詳解

Java之Request域物件及cookie詳解

獲取表單中提交的資料

使用getParameter()獲取打印表單資料

    private void fun1(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String sex = request.getParameter("sex");
        // 獲得複選框的傳遞的值
        String[] hobby = request.getParameterValues("hobby"
); if (hobby!= null) { for (String h : hobby) { System.out.println(h); } } String city = request.getParameter("city"); System.out.println(username + " " + password + " " + sex + " " + city); }

使用getParameterNames()獲取打印表單資料

    private
void fun2(HttpServletRequest request) { // 利用getParameterNames()打印表單資料 Enumeration<String> enumeration = request.getParameterNames(); while (enumeration.hasMoreElements()) { String nextElement = enumeration.nextElement(); // 根據nextElement取出對應的值 String[] strings = request.getParameterValues(nextElement); for
(String string : strings) { System.out.println(string); } } }

把表單資料封裝到物件中(getParameterMap())

把表單資料封裝到物件中(使用BeanUtils工具類)
jar包:commons-beanutils-1.9.3.jar
      commons-logging-1.2.jar
注意:該物件要符合JavaBean規範

    private void fun3(HttpServletRequest request) {
        User user = new User();
        Map<String, String[]> map = request.getParameterMap();
        try {
            // 引數1 要封裝的物件 引數2 map集合
            BeanUtils.populate(user, map);
            System.out.println(user);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

請求轉發、請求重定向、請求包含(Request)

Request也是一個域物件
域物件的內部就是維護一個map集合(新增/刪除/獲取的方法)

request域的作用範圍:一次請求當中可以獲取到域中儲存的資料

請求轉發

請求轉發只是伺服器內部的訪問,不管你怎麼寫路徑始終都在專案路徑下

    private void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 請求轉發 獲取轉發器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/demo03");
        dispatcher.forward(request, response);
    }

請求重定向

1.重定向是兩次請求,不能獲取到request域中的值
2.重定向既可以訪問本地伺服器也可以訪問非本地伺服器

    private void fun2(HttpServletResponse response) throws IOException {
        // 寫法1
        // response.setHeader("location", "/sh-web-servlet03/demo03");
        // response.setStatus(302);
        // 寫法2
        response.sendRedirect("/sh-web-servlet03/demo03");
    }

請求包含

    public class Demo02 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            // 獲取字元流
            PrintWriter out = response.getWriter();

            // 給request域中新增值
            request.setAttribute("name", "wl");
            // 請求包含
            request.getRequestDispatcher("/demo03").include(request, response);;

            // 請求轉發 瀏覽器只能響應一次資料
            // request.getRequestDispatcher("/demo03").forward(request, response);;

            // 響應
            out.write("123");

            System.out.println("我是demo02的結尾");
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    public class Demo03 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.getWriter().write("456");

            // 獲取request域中儲存的值
            Object name = (String)request.getAttribute("name");
            System.out.println("我是demo03" + name);
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

輸出:我是demo03wl
     我是demo02的結尾
響應回網頁:456123
請求包含相當於把兩個頁面的響應合成一個響應 返回給瀏覽器

會話技術

客戶端(瀏覽器)和服務端進行互動(會話)
當瀏覽器關閉的時候這次互動結束 例如:打電話

會話中的兩個技術:
    1.cookie(客戶端技術) cookie是儲存在瀏覽器的快取資料
    2.HttpSession(服務端技術) HttpSession儲存在服務端

什麼是cookie?
當瀏覽器發起一個請求,請求一個servlet進行邏輯處理(例如新增一個商品進購物車)
處理完成後,給客戶端(瀏覽器)一個響應
響應攜帶著記錄了購買了什麼商品的cookie
讓瀏覽器儲存起來
    1.可以儲存在記憶體當中(結束會話 cookie被清除)
    2.也可以儲存在硬碟中(結束會話 依然存在 就是個檔案)
當用瀏覽器再一次請求購物車的時候會攜帶著之前儲存的cookie去訪問

第一次訪問伺服器時,由於cookie還沒有產生,是不會攜帶cookie去訪問的
只有當第一次請求後的響應中可以把cookie寫回到瀏覽器中

顯示上次登入的時間

思路:第一次訪問的時候利用cookie響應到瀏覽器中,下次在訪問的時候從cookie中把時間取出來

    public class Demo04 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            // 讀取cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                // 遍歷陣列
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals("lastTime")) {
                        // 取出cookie的值
                        String value = cookie.getValue();
                        // 字串轉long
                        long time = Long.parseLong(value);
                        // 轉成日期
                        Date date = new Date(time);
                        // 建立一個顯示的日期格式
                        // 引數就是你想要顯示的日期格式
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        // 格式化時間
                        String lastTime = sdf.format(date);
                        // 響應回瀏覽器
                        response.getWriter().write("上次的訪問時間:" + lastTime);
                    }
                }
            }

            // 建立cookie 記錄當前的時間
            Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
            /*
             * 設定一下cookie的儲存路徑 工程名+配置網址路徑
             * 讀取cookie是按 請求的地址尋找cookie
             * 如果配置請求路徑沒有一級目錄 這樣全網站所有的網址請求都能找到這個cookie
             * cookie.setPath("/");
             */
            cookie.setPath("/sh-web-servlet03/servlet");
            /*
             * 設定cookie存活時間 
             * 負值表示瀏覽器關閉cookie消失
             * 正值表示存活時間
             * 0表示刪除cookie
             */
            cookie.setMaxAge(60 * 5);
            // 把cookie新增進響應當中
            response.addCookie(cookie);
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

web.xml配置

  <servlet>
    <servlet-name>demo04</servlet-name>
    <servlet-class>com.lanou3g.Demo04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo04</servlet-name>
    <url-pattern>/servlet/demo04</url-pattern>
  </servlet-mapping>

記錄使用者名稱

    public class Demo06 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            String username = "";
            String check = "";
            // 讀取cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals("username")) {
                        username = cookie.getValue();
                        check = "checked";
                    }
                }
            }
            System.out.println(username);

            response.getWriter().write("<form action='/sh-web-servlet03/servlet/demo07' method='post'>");
            response.getWriter().write("使用者名稱:<input type='text' name='username' value="+username+"><br>");
            response.getWriter().write("密&nbsp&nbsp&nbsp碼:<input type='password' name='password'><br>");
            response.getWriter().write("記住:<input type='checkbox' name='remember' checked="+check+"><br>");
            response.getWriter().write("<input type='submit' value='登入'>");     
            response.getWriter().write("</form>");  
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

    public class Demo07 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");
            // 獲取請求的引數
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String remember = request.getParameter("remember");

            // 建立cookie
            Cookie cookie = new Cookie("username", username);
            //設定cookie路徑
            cookie.setPath("/sh-web-servlet03/servlet");

            // 處理業務邏輯
            if (username.equals("sc") && password.equals("123")) {
                // 判斷一下是否 記住
                if (remember != null) {
                    // 需要記住(設定存活時間)
                    cookie.setMaxAge(Integer.MAX_VALUE);
                } else {
                    // 刪除原來的cookie
                    cookie.setMaxAge(0);
                }
                // 新增到響應中
                response.addCookie(cookie);
                response.getWriter().write("登入成功");
            } else {
                response.getWriter().write("登入失敗");
                // 3秒後 回登入頁面
                response.setHeader("refresh", "3;url=/sh-web-servlet03/servlet/demo06");
            }
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }