筆記-JavaWeb學習之旅11

請求轉發:一種在服務器內部的資源跳轉方式

使用步驟html

1.經過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)參數是轉發資源的路徑java

2.使用Requestispatcher對象進行轉發web

特色:瀏覽器地址欄路徑不會發生變化,只能轉發當前服務器內部資源,轉發是一次請求瀏覽器

共享數據

域對象:一個有做用範圍的對象,能夠在範圍內共享數據緩存

request域:表明一次請求的範圍,通常用於請求轉發的多個資源中共享數據服務器

方法:dom

  1. void setAttribute(String name,Object obj):存儲數據
  2. Object getAttiude(Stirng name):經過鍵獲取值
  3. void removeAttribute(String name):經過鍵移除鍵值對
package com.Data.HttpServlet;

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


@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request對象的方法setAttribute將數據存儲到request域中
        request.setAttribute("msg","Hello");
        System.out.println("RequestDemo1被訪問了。。。。");
        //轉發到requestDemo2
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo2");
        requestDispatcher.forward(request,response);
    }
}
package com.Data.HttpServlet;

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


@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //訪問共享數據,經過鍵獲取值
        System.out.println(request.getAttribute("msg"));
        System.out.println("RequestDemo2被訪問了。。。");
    }
}
RequestDemo1被訪問了。。。。
Hello
RequestDemo2被訪問了。。。

獲取ServletContext:ide

ServletContext getServletContext()post

HTTP響應消息

服務器端發送給客戶端的數據this

五種數據格式

1.響應行

1:組成:協議/版本 響應狀態嗎 狀態碼描述

2.響應狀態碼:服務器告訴客戶端瀏覽器本次請求和響應的一個狀態,狀態碼都是3位數字有5種狀態碼

  1. 1xx :服務器接收客戶端消息,但沒有接收完成,等待一段時間後,發送1xx多狀態碼
  2. 2xx :成功 。表明數字:200
  3. 3xx :重定向。表明:302(重定向),304(訪問緩存)
  4. 4xx :客戶端錯誤。表明(404)請求路徑沒有對應的資源,405(請求方式沒有對應的doxxx方法)
  5. 5xx : 服務端錯誤。表明:500(服務器內部出現異常,好比代碼有錯)

2.響應頭

格式:頭名稱 :值

常見的響應頭

Content-Type:服務器告訴客戶端本次響應體數據格式以繼編碼格式

Content-dispostition:服務器告訴客戶端以什麼格式打開響應體數據

3.響應空行

4響應體:傳輸的數據

重定向:資源跳轉方式

package com.data;

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

@WebServlet("/Demo1")
public class ResponseServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1....");
        //完成重定向
        //設置狀態碼爲302
        //response.setStatus(302);
        //設置響應頭,頭的名稱,頭的值
        //response.setHeader("location","/Demo2");
        //重定向能夠訪問其餘站點資源
        //response.sendRedirect("https://www.baidu.com");//訪問了百度
        //重定向
        response.sendRedirect("/Demo2");
        //設置共享數據
        request.setAttribute("msg","hello");

    }
}
package com.data;

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

@WebServlet("/Demo2")
public class ResponseServlet2 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向能夠訪問其餘站點的資源
        System.out.println("demo2.....");
        //重定向不能訪問共享數據
        Object o1 = request.getAttribute("msg");
        System.out.println(o1);
    }
}
輸出結果

demo1....
demo2.....
null

重定向的特色:redirect

  1. 地址欄發生變化
  2. 重定向能夠訪問其它站點服務器的資源
  3. 重定向是兩次請求,,不拿使用request對象來共享數據
路徑寫法

相對路徑:經過相對路徑不能夠肯定惟一資源

絕對路徑: 經過絕對路徑能夠肯定惟一資源,給客戶端瀏覽器使用須要加虛擬目錄,給服務器使用,不須要加虛擬目錄

服務器輸出字符數據到瀏覽器

package com.data;

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

@WebServlet("/Demo3")
public class ResponseServlet3 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用響應頭,告訴瀏覽器我使用的編碼
        //瀏覽器收到響應,就會按照指定字符集解碼
        response.setContentType("text/html;charset=utf-8");
        //response.setHeader("content-type","text/html;charset=utf-8");
        //向客戶端輸出數據,先要獲取字符輸出流
        PrintWriter writer = response.getWriter();
        writer.write("<h1>你好,world</h1>");
    }
}
服務器輸出字節數據到瀏覽器
package com.data;

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

@WebServlet("/Demo3")
public class ResponseServlet3 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=utf-8");
       ServletOutputStream outputStream = response.getOutputStream();
       outputStream.write("你好,客戶端".getBytes("utf-8"));
    }
}
驗證碼
package com.data;


import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/Demo4")
public class CheckCodeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int width = 100;
        int height = 50;
        //建立對象,該對象能夠在內存中生成圖片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //美化圖片
        //填充背景色
        Graphics g = image.getGraphics();
        g.setColor(Color.PINK);
        g.fillRect(0,0,width,height);
        //畫邊框
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,height-1);
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

            //  寫驗證碼
        Random ran = new Random();
        for(int i = 1;i<=4;i++){
            int index = ran.nextInt(str.length());
            char ch = str.charAt(index);
            g.drawString(ch+"",width/5*i,height/2);
        }
        g.setColor(Color.GREEN);
        for (int i = 0 ; i< 10 ;i++){
            int x1 = ran.nextInt(width);
            int x2 = ran.nextInt(width);

            int y1 = ran.nextInt(height);
            int y2 = ran.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }


        //將圖片輸出到頁面上
        ImageIO.write(image,"jpg",resp.getOutputStream());

    }

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

    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        // 分析:
        //     點擊超連接或者圖片,須要換一張,
        //     給圖片和超連接綁定單擊事件
        window.onload=function () {
            //獲取圖片對象
            var img=document.getElementById("change");
            //綁定單擊事件
            img.onclick=function () {
               var date =new Date().getTime();
                img.src="/day14/Demo4"+date;
            }
        }
    </script>
</head>
<body>
    <img id="checkCode" src="/day14/Demo4" />
    <a id="change" href="">看不清?換一張</a>
</body>
</html>
ServletContext對象:

1.概念:表明整個web應用,能夠和程序的容器來通訊

獲取方式:

1.request.getServletContext();

2.this.getServletContext();

功能:獲取MIME類型(在互聯網通訊過程種定義的一種文件數據類型,不如text/html,image/jpeg)

package com.data;

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


@WebServlet("/Demo5")
public class ServletDemo5 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取MIME類型
        ServletContext context=this.getServletContext();
        //定義文件名稱
        String filename = "a.jpg";
        //獲取MIME類型
        String mimeType = context.getMimeType(filename);
        System.out.println(mimeType);
    }
}

//image/jpeg

功能:域對象,共享數據

域對象的方法

setArrtibute(String name,Object value)

getAttribute(String name)

removeAttribute(String name)

功能:獲取文件服務器路徑

文件在項目目錄下,能夠直接文件名獲取路徑
在WEB-INF目錄下,須要加上WEB-INF才能夠獲取
src目錄下的全部文件未來都存放在/WEB-INF/classes目錄下
package com.data;

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


@WebServlet("/Demo5")
public class ServletDemo5 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取web目錄下的資源訪問
        ServletContext context = this.getServletContext();
        String realPath = context.getRealPath("/b.txt");//b.txt在項目目錄下,能夠直接文件名獲取路徑
        System.out.println(realPath);
        //獲取WEB-INF目錄下的資源訪問
        String realPath1 = context.getRealPath("/WEB-INF/c.txt");//c.txt在WEB-INF目錄下,須要加上WEB-INF才能夠獲取到路徑
        System.out.println(realPath1);
        //獲取src目錄下的資源能路徑
        String realPath2 = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的全部文件未來都存放在/WEB-INF/classes目錄下
        System.out.println(realPath2);
    }
}
相關文章
相關標籤/搜索