1. 程式人生 > 其它 >vue(17)vue-route路由管理的安裝與配置

vue(17)vue-route路由管理的安裝與配置

HttpServletResponse

web伺服器接收到客戶端的http的請求,針對這個請求,分別建立一個代表請求的HttpServletRequest物件,代表響應的一個HttpServletResponse;

  • 如果要獲取客戶端請求過來的引數:找HttpServletRequest
  • 如果要給客戶端響應一些資訊:找HttpServletResponse

1、簡單分類

負責向瀏覽器傳送資料的方法

  • ServletOutputStream getOutputStream() throws IOException;
    PrintWriter getWriter() throws IOException;
    

負責向瀏覽器傳送響應頭的方法

    void setCharacterEncoding(String var1);
    void setContentLength(int var1);
    void setContentLengthLong(long var1);
    void setContentType(String var1);

    void setDateHeader(String var1, long var2);
    void addDateHeader(String var1, long var2);
    void setHeader(String var1, String var2);
    void addHeader(String var1, String var2);
    void setIntHeader(String var1, int var2);
    void addIntHeader(String var1, int var2);

響應的狀態碼

    int SC_CONTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_CONTENT = 204;
    int SC_RESET_CONTENT = 205;
    int SC_PARTIAL_CONTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_CONFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
    int SC_GATEWAY_TIMEOUT = 504;
    int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

200:請求響應成功

3xx:請求重定向

  • 重定向:你重新到我給你的新位置去

4xx:找不到資源 404

  • 資源不存在

5xx:伺服器程式碼錯誤 500 502:閘道器錯誤

2、下載檔案

  1. 向瀏覽器輸出訊息

  2. 下載檔案

    1. 要獲取下載檔案的路徑

    2. 下載的檔名是什麼

    3. 設定想辦法讓瀏覽器能夠支援下載我們需要的東西

    4. 獲取下載檔案的輸入流

    5. 建立緩衝區

    6. 獲取OutputStream物件

    7. 將FileOutputStream流寫入到buffer緩衝區

    8. 使用OutputStream將緩衝區中的資料輸出到客戶端

      @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 1. 要獲取下載檔案的路徑
              String realPath = "E:\\JAVA暑假學習\\JavaWeb\\javaweb-02-servlet\\response\\src\\main\\resources\\電腦.jpg";
              System.out.println("下載檔案的路徑: "+realPath);
              // 2. 下載的檔名是什麼
              String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
              // 3. 設定想辦法讓瀏覽器能夠支援(Content-Disposition)下載我們需要的東西
              resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
              // 4. 獲取下載檔案的輸入流
              FileInputStream in = new FileInputStream(realPath);
              // 5. 建立緩衝區
              int len=0;
              byte[] buffer = new byte[1024];
              // 6. 獲取OutputStream物件
              ServletOutputStream out = resp.getOutputStream();
              // 7. 將FileOutputStream流寫入到buffer緩衝區
              while ((len=in.read(buffer))>0){
                  out.write(buffer,0,len);
              }
              // 8. 使用OutputStream將緩衝區中的資料輸出到客戶端
              in.close();
              out.close();
          }
      

3、驗證碼功能

驗證怎麼來的?

  • 前端實現

  • 後端實現,需要用到java的圖片類,生成一個圖片

    public class ImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //如何讓瀏覽器3秒自動重新整理一次;
            resp.setHeader("refresh","3");
    
            //在記憶體中建立一個圖片
            BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
            //得到圖片
            Graphics2D g = (Graphics2D) image.getGraphics();//筆
            //設定圖片的背景顏色
            g.setColor(Color.white);
            g.fillRect(0,0,80,20);
            //給圖片寫資料
            g.setColor(Color.green);
            g.setFont(new Font(null,Font.BOLD,20));
            g.drawString(makeNum(),0,20);
    
            //告訴瀏覽器,這個請求用圖片的方式開啟
            resp.setContentType("image/jpeg");
            //網站存在快取,不讓瀏覽器快取
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
    
            //把圖片寫給瀏覽器
            ImageIO.write(image,"jpg",resp.getOutputStream());
        }
            //生成隨機數
        private String makeNum(){
            Random random = new Random();
            String num = random.nextInt(999999) + "";
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < num.length() ; i++){
                sb.append("0");
            }
            String s = sb.toString() + num;
            return num;
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

4、實現重定向

B一個web資源收到客戶端A請求後,B他會通知客戶端去訪問另外一個web資源C,這個過程叫重定向

常見場景:

  • 使用者登入

    void sendRedirect(String var1) throws IOException;
    

測試:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        resp.setHeader("Location","/r/img");
        resp.setStatus(302);
        */
        resp.sendRedirect("/r/img");//重定向
    }
public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username+": "+password);
        //重定向的時候一定要注意,路徑問題,否則404;
        resp.sendRedirect("/r/success.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<html>
<body>
<h2>Hello World!</h2>
<%--這裡提交的路徑,需要尋找到專案的路徑--%>
<%--${pageContext.request.contextPath}代表當前的專案--%>
<form action="${pageContext.request.contextPath}/login" method="get">
    使用者名稱:<input type="text" name="username"><br>
    密碼:<input type="text" name="password"><br>
    <input type="submit">
</form>
</body>
</html>

HttpServletRequest

HttpServletRequest代表客戶端的請求,使用者通過Http協議訪問伺服器,HTTP請求中的所有資訊會被封裝到HttpServletRequest,通過這個HttpServletRequest的方法,獲得客戶端的所有資訊

1、獲取前端傳遞的引數

<html>
<head>
    <title>登入</title>
</head>
<body>
<h1 style="text-align: center">登入</h1>
<div style="text-align: center">
    <%--這裡表單表示的意思:以post方式提交表單,提交到我們的login請求--%>
    <form action="${pageContext.request.contextPath}/login" method="post">
        使用者名稱:<input type="text" name="uesrname"><br>
        密碼:<input type="password" name="password"><br>
        愛好:
        <input type="checkbox" name="hobbies" value="籃球">籃球
        <input type="checkbox" name="hobbies" value="足球">足球
        <input type="checkbox" name="hobbies" value="唱歌">唱歌
        <input type="checkbox" name="hobbies" value="電影">電影

        <br>
        <input type="submit">
    </form>
</div>
</body>
</html>

面試題:請你聊聊重定向和轉發的區別?

相同點

  • 頁面都會實現跳轉

不同的

  • 請求轉發的時候,url不會產生變化 307
  • 重定向的時候,url位址列發生變化 302

2、請求轉發

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

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");
        System.out.println("============================");
        //後臺接收中文亂碼問題
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));
        System.out.println("============================");

        System.out.println(req.getContextPath());
        //通過請求轉發

        //這裡的/代表當前的web應用
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }

Cookie、Session

會話

會話:使用者打開了一個瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話

有狀態會話

一個網站怎麼證明你來過?

客戶端 服務端

  1. 服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie
  2. 伺服器登記你來過了,下次你來的時候我來匹配你;session

儲存會話的兩種技術

cookie

  • 客戶端技術(響應,請求)

session

  • 伺服器技術,利用這個技術,可以儲存使用者的會話資訊

常見場景:網站登入之後,你下次不用再登入,第二次可以直接訪問上去

  1. 從請求中拿到cookie資訊

  2. 伺服器響應給客戶端cookie

    Cookie[] cookies = req.getCookies();//這裡返回陣列,說明Cookie可能存在多個  獲得cookie
    cookie.getName();//獲得cookie中的key
    cookie.getValue();//獲得cookie中的vlaue
    new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一個cookie
    cookie.setMaxAge(24*60*60);
    //設定cookie 有效期為一天 時*分*秒
    resp.addCookie(cookie);//響應給客戶端一個cookie
    

cookie:一般會儲存在本地的使用者目錄下appdata;

一個網站cookie是否存在上限!

  • 一個Cookie只能儲存一個資訊;
  • 一個web站點可以給瀏覽器傳送多個Cookie,最多存放20個;
  • Cookie大小有限制4kb;
  • 300個Cookie瀏覽器上限

刪除Cookie

  • 不設定有效期,關閉瀏覽器,自動失效;
  • 設定有效時間為0;

Session(重點)

什麼是Session:

  • 伺服器會給每一個使用者(瀏覽器)建立一個Session物件;
  • 一個Session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個session就存在;
  • 使用者登入之後,整個網站它都可以訪問——>儲存使用者資訊;儲存購物車的資訊......

session和cookie的區別

  • Cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存(可以儲存多個)
  • Session是把使用者的資料寫到使用者獨佔Sessionzhong ,伺服器端儲存(儲存重要的東西,減少伺服器資源的浪費)
  • Session物件由伺服器建立;

使用場景:

  • 儲存一個登陸使用者的資訊;
  • 購物車資訊;
  • 在整個網站中經常會使用的資料,我們將它儲存在Session中;

使用Session

package com.su.servlet;

import com.su.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題
        resp.setCharacterEncoding("GBK");
        req.setCharacterEncoding("GBK");
        resp.setContentType("text/html;charset=GBK");
        //得到Session
        HttpSession session = req.getSession();

        //給Session中存東西
        session.setAttribute("name",new Person("蘇偉良",22));

        //獲取Session的ID
        String sessionId = session.getId();

        //判斷是不是新的Session
        if (session.isNew()){
            resp.getWriter().write("Session建立成功,ID: "+sessionId);
        }else {
            resp.getWriter().write("Session已經在伺服器中存在了,ID: "+sessionId);
        }
//        Cookie cookie = new Cookie("JESSIONID",sessionId);
//        resp.addCookie(cookie);
    }

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

        //得到Session
        HttpSession session = req.getSession();

        Person person = (Person) session.getAttribute("name");

        System.out.println(person.toString());
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();
        //手動登出Session
    }

會話自動過期:web.xml配置

    <!--設定Session預設的失效時間-->
    <session-config>
        <!--15分鐘後Session自動失效,以分鐘為單位-->
        <session-timeout>15</session-timeout>
    </session-config>