天天看點

JavaWeb學習記錄 Day3(Servlet進階)

文章目錄

  • ​​Day 3​​
  • ​​解決亂碼問題​​
  • ​​Request​​
  • ​​會話​​
  • ​​Cookie​​
  • ​​Session​​

Day 3

2019年7月15日。

這是我學習JavaWeb的第三天。

這一天,我學到了以下的知識。

解決亂碼問題

所有能設定編碼的地方都統一設定 : 資料庫,資料庫字段,Servlet程式,請求,響應 , 前端,浏覽器。

Request

擷取屬性:使用Request對象,可以擷取到web項目的相關屬性,代碼如下:

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


public class RequestDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //檢視request對象的方式
        System.out.println(request.getContextPath()); //獲得web項目路徑
        System.out.println(request.getRequestURI()); //請求的URL路徑
        //Remote 遠端
        System.out.println(request.getRemoteUser()); //獲得遠端的使用者名
        System.out.println(request.getRequestedSessionId()); //獲得SessionId;
        System.out.println(request.getServletPath()); //請求servlet的url
        System.out.println(request.getLocalAddr()); //獲得本地位址  防火牆
        System.out.println(request.getLocalName()); //獲得本地名字
        System.out.println(request.getLocalPort()); //獲得通路的端口号

    }

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

接收前端使用者送出的參數:通過Request對象,可以擷取到使用者從前端送出的資料,步驟如下:

  1. 編寫前端注冊jsp頁面
  • 表單送出的方式:get/post(推薦)
  • 表單送出的位置action:服務項目的路徑/servlet對應的請求url
  • JSP中,擷取項目路徑的文法為:​

    ​${pageContext.request.contextPath}​

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注冊</title>
</head>
<body>


<%--
JSP的注釋
--%>


<%--
Form表單
    action:代表要送出的路徑,表單要送出到哪裡 ,可以送出到一個Servlet
        //送出到Servlet需要,擷取到Web項目的路徑下的Servlet
    method: 送出表單的方式
--%>
<h1>注冊</h1>

<form action="${pageContext.request.contextPath}/r2" method="post">

    <p>使用者名:<input type="text" name="username"></p>
    <p>密碼:<input type="password" name="password"></p>

    <p>
        <input type="submit">
        <input type="reset">
    </p>

</form>



</body>
</html>      
  1. 寫處理前端送出資訊的Servlet

    接收前端傳遞的控件資訊,利用​​

    ​request.getParameter("控件的name")​

    ​來實作
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//處理前端送出過來的資料
public class RequestDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //通過HttpServletRequest擷取前端使用者送出的資訊
        //req.getParameterValues(); 獲得前端傳遞的控件資訊,通過控件的name;但是可以接受多個參數的控件,比如(多選框....)
        //req.getParameter(); 獲得前端傳遞的控件資訊,通過控件的name;

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //連接配接資料庫,比較資料庫中的資訊是否比對

        if (username.equals("admin")&&password.equals("1234567")){
            System.out.println("登入成功!"); //跳轉到成功頁面
        }else {
            System.out.println("登入失敗!"); //提示重新注冊
        }

        System.out.println(username);
        System.out.println(password);


    }
}      
  1. 配置web.xml
<servlet>
        <servlet-name>RequsetDemo02</servlet-name>
        <servlet-class>servlet.RequestDemo02</servlet-class>
    </servlet>

    <!--=====================================================-->


    <servlet-mapping>
        <servlet-name>RequsetDemo02</servlet-name>
        <url-pattern>/r2</url-pattern>
    </servlet-mapping>      
  1. 送出測試
  1. 檢查英文送出情況,伺服器是否能接受成功
  2. 送出中文,檢視亂碼情況
  3. 設定編碼統一,解決亂碼問題

Request實作請求轉發:通過Request對象,可以實作請求轉發,代碼如下:

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FormServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //處理亂碼
        req.setCharacterEncoding("UTF-8");
        //處理前端的請求
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("接收到的使用者名:"+username+"\n密碼:"+password+"\n愛好:");

        String[] hobbies = req.getParameterValues("hobby");

        for (String hobby : hobbies) {
            System.out.println(hobby);
        }


        //重定向:伺服器告訴用戶端你應該請求另外一個位址;  (位址欄會變)
        //resp.sendRedirect("url");

        //轉發:伺服器把這個請求轉向另外一個Servlet去處理; (位址欄不會變)
        //RequestDispatcher ,需要使用RequestDispatcher來進行處理,我們需要獲得這個類
        //參數就是他要轉發到的頁面

        /*
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
        requestDispatcher.forward(req,resp);
        */

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        req.getRequestDispatcher("/success.jsp").forward(req,resp);


    }
}      

既然提到了轉發,就不得不提到轉發和重定向的差別,它們的差別如下:

  • 重定向:伺服器告訴用戶端,去請求另外一個位址(用戶端行為)
  • 位址欄會變
  • 不能攜帶參數
  • 轉發:伺服器自己轉發到伺服器上的另一個請求(伺服器行為)
  • 位址欄不會變
  • 可以攜帶參數

會話

會話字面意思:一次交流或交談

在Web中,會話表示從浏覽器打開某個網站,在這個網站中無論操作了什麼,知道關閉浏覽器,這一個過程,稱之為一個會話。

怎麼樣算會話結束:

  • 用戶端關閉了
  • 服務端銷毀了

為什麼要處理會話:

長期保持會話,無論使用者關閉少次浏覽器,這個會話都會存在。

比喻:

你昨天來了教室,我今天需要知道你昨天來了教室;

  1. 你留下一個标記,讓我知道你來過
  2. 你告訴我你來這邊,我需要記錄你來了;

你:用戶端

我 :伺服器

Javaweb中針對這兩個不同的端,誕生了兩個小機制

  • cookie :在用戶端留下一點東西,用戶端下次帶過來,我就知道你來過了。
  • 問:我的店鋪非常大,怎麼證明你來過?
  • 答:你開一個會員吧 , 我給你一張V國際電話預付卡,你下次帶卡來,我就知道你來過了
  • Session:在伺服器端登記你來過。
  • 問:你去理發店。怎麼證明你來過?
  • 答:理發店收會員,在他的筆記本上記錄了你的消息,下次你來直接報上大名就可以了。

Cookie

構造器:

Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(String name,String value);      

伺服器響應cookie給用戶端:

Response.addCookie(Cookie);
Response.addCookie(Cookie);
Response.addCookie(Cookie);      

服務檢視使用者帶來的請求是否有cookie:

Cookie[] cookies = Request.getCookie();
//可以使用cookie來驗證使用者是否來過
//判斷cookies是否為空,然後周遊即可
Cookie.getName();
Cookie.getValue();      

cookie測試使用者是否來過

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieTest extends HttpServlet {

    boolean flag = false;

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解決亂碼問題:
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //檢查請求的人是否帶了Cookie
        //通過使用者的請求,檢查它是否有cookie
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie:"+cookies);


        if (flag){//如果flag是真,來過
            if (cookies!=null){//你有cookie
                for (int i = 0; i < cookies.length ; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
                        response.getWriter().println("你上一次來的時間為:"+cookie.getValue());
                        System.out.println("重新整理了cookie");
                    }
                }
            }
        }else { //如果flag是真,沒來過
            response.getWriter().println("你是第一次來,還想要會員套餐");
            System.out.println("給該使用者一個cookie");
        }

        //建立一個cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

        //設定cookie儲存的時間 //cookie.setMaxAge();
        //把這個cookie發給用戶端
        response.addCookie(cookie);

        //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
        flag = true;


    }
}      

Session

隻要用戶端一旦連接配接上伺服器,伺服器就會自動産生Session;

一個連接配接對應一個session,session可以在一個會話中傳遞資訊;

通過​​

​setAttribute​

​​設定值。

通過​​

​getAttribute​

​​獲得值。

由伺服器端控制,伺服器如果重新開機了,資訊就會丢失!

  1. 第一個Servlet(将值存入session)
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        //Session由伺服器自動建立,如何獲得session

        //HttpSession 得到的sessioin對象
        HttpSession session = req.getSession();

        //得到sessionID,一次會話,一個seesionID;
        String id = session.getId();
        resp.getWriter().println("獲得的sessionId:\n"+id);


        String name = "qinjiang";
        //向session中存入一個值;
        session.setAttribute("name",name);
        resp.getWriter().println("存入資訊成功:"+name);

    }
}      
  1. 第二個Servlet(從session取出值)
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//獲得session存入的值
public class SessionTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //獲得
        HttpSession session = req.getSession();
        System.out.println("得到的SessionID:"+session.getId());


        String name = (String) session.getAttribute("name");
        resp.getWriter().println("得到的session存入的資訊"+name);

        //Servlet  <  Seesion  <  WebContext

    }
}      
  • 會話登出方法一
session.invalidate();//通過代碼登出會話      
  • 會話登出方法二
<!--session-config可以設定會話自動過期,時間分鐘為機關-->
<session-config>
    <session-timeout>1</session-timeout>
</session-config>