溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

web復(fù)習(xí)day04:response

發(fā)布時(shí)間:2020-03-25 10:36:01 來源:網(wǎng)絡(luò) 閱讀:378 作者:dylan的賬號(hào) 欄目:開發(fā)技術(shù)

回顧:

request: 請(qǐng)求信息對(duì)象

Http協(xié)議: 瀏覽器和服務(wù)器進(jìn)行數(shù)據(jù)交互時(shí),數(shù)據(jù)的一種規(guī)范

請(qǐng)求行: 請(qǐng)求方式 請(qǐng)求路徑?get請(qǐng)求參數(shù) 協(xié)議/版本(http/1.1)

    getMethod()

    getContextPath()

    getRemoteAddr()

    getLocalPort()

請(qǐng)求頭: key/values

    getHeader("頭名稱");

        重要頭:

            referer: 防盜鏈

            user-agent: 用戶代理

            cookie:

請(qǐng)求體: post請(qǐng)求時(shí)攜帶的參數(shù)(get請(qǐng)求沒有請(qǐng)求體)

    獲取請(qǐng)求參數(shù): ★★★ 瀏覽器攜帶的參數(shù),我們所獲取的都是字符串

        String getParameter("名稱");

        String[] getParameterValues("名稱");

        Map<String,String[]> getParameterMap("名稱");

    BeanUtils:

        populate(實(shí)體對(duì)象,map集合);

Request作用域和請(qǐng)求轉(zhuǎn)發(fā):

請(qǐng)求轉(zhuǎn)發(fā): 一次請(qǐng)求的延續(xù)(可以經(jīng)過多個(gè)servlet)

    request.getRequestDispatcher("/請(qǐng)求轉(zhuǎn)發(fā)的地址").forWard(req,resp);

作用域:

    request.setAttribute(String,Object);

        // 設(shè)置相同名稱的屬性就是 修改

    request.getAttribute(String);

    request.removeAttribute(String);

http協(xié)議-響應(yīng)

響應(yīng): 服務(wù)器給瀏覽器的內(nèi)容

組成:

響應(yīng)行 響應(yīng)頭 響應(yīng)體

響應(yīng)行

格式:

    協(xié)議/版本 響應(yīng)的狀態(tài)碼 (狀態(tài)碼說明)

        tomcat8.5中沒有響應(yīng)狀態(tài)碼說明了

    eg: HTTP/1.1 200 OK    tomcat7

狀態(tài)碼:

    1xx :請(qǐng)求已發(fā)送

    2xx :響應(yīng)已完成

        200:響應(yīng)成功(請(qǐng)求成功)

    3xx :需要瀏覽器進(jìn)一步操作才可以完成

        302:重定向(配合location頭使用)

        304:讀緩存

    4xx :用戶訪問錯(cuò)誤

        404:用戶訪問的資源不存在

    5xx :服務(wù)器內(nèi)部錯(cuò)誤

        500:服務(wù)器內(nèi)部異常

響應(yīng)頭

格式:

     key/values的格式 (values可以為多個(gè)值的)

常見的響應(yīng)頭

    Location: http://www.it315.org/index.jsp        --跳轉(zhuǎn)方向

    Server:apache tomcat                            --服務(wù)器型號(hào)

    Content-Encoding: gzip                      --數(shù)據(jù)壓縮

    Content-Length: 80                          --數(shù)據(jù)長(zhǎng)度

    Content-Language: zh-cn                         --語言環(huán)境

    Content-Type: text/html; charset=utf-8      --數(shù)據(jù)類型(MIME類型)  大類型/小類型 text/javascript 

        index.html   text/html

        設(shè)置響應(yīng)文件的mime類型

        設(shè)置響應(yīng)流的編碼方式

        通知瀏覽器使用指定的編碼解析

    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT    --最后修改時(shí)間

    Refresh: 1(秒);url=http://www.it315.org          --定時(shí)刷新

    Content-Disposition: attachment; filename=aaa.zip   --下載 用于文件下載  附件

    Set-Cookie:SS=Q0=5Lb_nQ; path=/search

重點(diǎn)的頭:

    Content-Type  Refresh  Content-Disposition  Location   Set-Cookie 

響應(yīng)體

瀏覽器解析的內(nèi)容
response★

設(shè)置服務(wù)器發(fā)送給瀏覽器的內(nèi)容

HttpServletResponse

操作響應(yīng)行:

協(xié)議/版本 狀態(tài)碼(說明)

常用方法

    (理解)setStatus(int code):針對(duì)1   2   3 開頭的

    (了解)sendError(int code):針對(duì) 4   5 開頭的

操作響應(yīng)頭:

格式: key/values

常用方法

    (重點(diǎn))setHeader(String name,String value);  // 設(shè)置一個(gè)字符串形式的響應(yīng)頭

    sendRedirect("路徑");  // 重定向

常見的響應(yīng)頭

location:重定向

        方式1: 需要配合302狀態(tài)碼一起使用 (了解)

            response.setStatus(302);

            response.setHeader("location","絕對(duì)路徑");

            路徑:絕對(duì)路徑

        方式2: (掌握)

            response.sendRedirect("路徑");

        重定向發(fā)送的是多次請(qǐng)求

        重定向不可以共享request對(duì)象(因?yàn)榘l(fā)送的是多次請(qǐng)求)

        重定向時(shí)瀏覽器地址欄顯示的是最后一次的地址

        重定向可以跳轉(zhuǎn)到任何路徑

refresh:定時(shí)刷新

        response.setHeader("refresh","秒數(shù);url=跳轉(zhuǎn)的路徑"); 幾秒之后跳轉(zhuǎn)到指定的路徑上

content-type:設(shè)置文件的mime類型

        設(shè)置響應(yīng)文件的mime類型 

        設(shè)置響應(yīng)流的編碼方式

        通知瀏覽器使用指定的編碼解析

        方式1: 了解

            response.setHeader("content-type","mime類型;charset=編碼");

            response.setHeader("content-type","text/html;charset=utf-8");

        方式2: 掌握

            response.setContentType("文件的mime類型;charset=utf-8");

content-disposition:文件下載專用頭

        response.setHeader("content-disposition","attachment;filename="+文件名稱);

操作響應(yīng)體:

常用方法:

    PrintWriter getWriter():字符流

    ServletOutputStream getOutputStream():字節(jié)流

    注意事項(xiàng):

        自己編寫的文件   一般都使用字符流輸出 如:txt  html等

        音頻,視頻等文件使用字節(jié)流輸出

        ==字節(jié)流和字符流互斥,不能同時(shí)使用==    

        服務(wù)器會(huì)幫我們釋放資源,建議自己關(guān)閉;底層使用的緩存流

ServletContext:

上下文對(duì)象,全局管理者,知曉一個(gè)項(xiàng)目中所有Servlet的一切信息

作用:

獲取文件的mime類型    *.html     text/html     

資源共享

獲取資源的完整路徑

生命周期:

創(chuàng)建:

當(dāng)服務(wù)器啟動(dòng)的時(shí)候,服務(wù)器會(huì)為每一個(gè)項(xiàng)目創(chuàng)建servletcontext對(duì)象,一個(gè)項(xiàng)目只有一個(gè)servletcontext對(duì)象

銷毀:

項(xiàng)目從服務(wù)器上移除或者服務(wù)器關(guān)閉的時(shí)候

servletContext對(duì)象與項(xiàng)目共存亡

獲取方式:

方式1:通過ServletConfig對(duì)象獲取

    ServletConfig().getServletContext();

方式2:通過getServletContext方法獲取 ★★★

    getServletContext();

常用方法(API):

(掌握)獲取一個(gè)文件的mime類型

    String getMimeType(String 文件名)  

(掌握)資源共享: 相當(dāng)于一個(gè)map集合

    setAttribute(String name,Object value): 設(shè)置

        設(shè)置相同名稱的屬性就是修改

    getAttribute(String name):獲取指定的屬性值

    removeAttribute(String name):移除指定的屬性

(掌握)獲取資源在服務(wù)器上的路徑

    String getRealPath(String filepath)

    注意:

        filepath:直接從項(xiàng)目的根目錄開始寫

        getRealPath("/")  ---> d:/tomcat/webapps/day14

案例

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function isIE(){ // 判斷用戶使用的瀏覽器是否為IE瀏覽器
            //獲取當(dāng)前瀏覽器相關(guān)信息
            var explorer = window.navigator.userAgent.toLowerCase() ;
            //判斷是否是ie瀏覽器
            if (explorer.indexOf("msie") >= 0 || explorer.indexOf("rv:11.0) like gecko") >=
                0)     {
                return true;
            }else {
                return false;
            }
        }
        window.onload = function () { // 頁面加載成功事件
            if(isIE()){
                //在是IE瀏覽器的情況下,對(duì)中文請(qǐng)求參數(shù)編碼
                var str = document.getElementById("ww").href;
                str = encodeURI(str);
                document.getElementById("ww").href = str;
            }
        };

        function changeImg(obj) {
            //alert(1);
            obj.src = "anli5?aa="+new Date().getTime();
        }
    </script>
</head>
<body>
    <h4>response對(duì)象的相關(guān)操作</h4>
    <a href="refresh">3秒鐘之后跳轉(zhuǎn)到黑馬官網(wǎng)(定時(shí)刷新)</a> <br>
    <a href="my?money=40">案例2-班長(zhǎng)借錢(重定向)</a> <br>
    <a href="anli3">案例3-返回中文無亂碼</a> <br>
    <a href="body">操作響應(yīng)體</a> <br>
    <hr>
    <h4>上下文對(duì)象</h4>
    <a href="getMime?filename=aa.js">通過上下文對(duì)象獲取文件的mime類型</a> <br>
    <a href="setAttr">向上下文對(duì)象中設(shè)置屬性</a> <br>
    <a href="getAttr">從上下文對(duì)象中獲取屬性</a> <br>
    <a href="updateAttr">修改上下文對(duì)象中的屬性</a> <br>
    <a href="removeAttr">刪除上下文對(duì)象中的屬性</a> <br>
    <a href="getRealPath">獲取資源在服務(wù)器上的完整路徑</a> <br>
    <h4>文件下載</h4>
    <a href="download?filename=meinv.png">美女的誘惑(下載)</a> <br>
    <a href="download?filename=aa.txt">大數(shù)據(jù)簡(jiǎn)單理解(下載)</a> <br>
    <a id="ww" href="download?filename=大數(shù)據(jù)簡(jiǎn)單理解.txt">大數(shù)據(jù)簡(jiǎn)單理解1(下載)</a> <br>
    <h4>驗(yàn)證碼</h4>
    <img src="anli5"  alt="" onclick="changeImg(this)"> <br>
</body>
</html>

案例1 : 3秒鐘之后跳轉(zhuǎn)到黑馬官網(wǎng)(定時(shí)刷新)

需求分析:
訪問一個(gè)servlet,3秒鐘之后跳轉(zhuǎn)到黑馬官網(wǎng)(定時(shí)刷新)
技術(shù)分析:
響應(yīng)頭: refresh="3;url=http://www.itheima.com"
設(shè)置響應(yīng)頭:
response.setHeader("refresh","3;url=http://www.itheima.com");
package com.itheima.a_anli1;

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(name = "RefreshServlet", urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 實(shí)現(xiàn)定時(shí)刷新
        // 設(shè)置響應(yīng)頭信息 refresh
        response.setHeader("refresh","3;url=http://www.itheima.com");
    }

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

案例2:使用location響應(yīng)頭實(shí)現(xiàn)跳轉(zhuǎn)(重定向)

MyServlert

package com.itheima.b_location;

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(name = "MyServlet", urlPatterns = "/my")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("班長(zhǎng)曰: 借我錢!");
        System.out.println("我曰: 借多少啊?");
        System.out.println("班長(zhǎng)曰: 自己獲取....");
        System.out.println(request.getParameter("money"));
        System.out.println("我曰: 不好意思,沒有零錢,你去找花花借吧...");
        System.out.println("班長(zhǎng)曰: 花花在哪? ");
        //------------------- 重定向
        // 方式1: 了解
        //a.設(shè)置響應(yīng)狀態(tài)碼
        //response.setStatus(302);
        //b.設(shè)置重定向的路徑      /day04/hua
        //response.setHeader("location",request.getContextPath()+"/hua?money=400");
        //b.方式2:
        response.sendRedirect(request.getContextPath()+"/hua?money=400");
        //response.sendRedirect("http://www.itheima.com/");

    }

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

HuaServler

package com.itheima.b_location;

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(name = "HuaServlet", urlPatterns = "/hua")
public class HuaServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("班長(zhǎng)曰: 花花,借我錢!");
        System.out.println("花花曰: 借多少呀?");
        System.out.println("班長(zhǎng)曰: 自己獲取?");
        System.out.println(request.getParameter("money"));
        response.getWriter().print("success....");
    }

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

案例3:向?yàn)g覽器輸出中文數(shù)據(jù)(無亂碼)

package com.itheima.c_anli3;

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(name = "Anli3Servlet", urlPatterns = "/anli3")
public class Anli3Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 返回一段中文信息
       // response.setHeader("content-type","text/html;charset=utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("你好美女....success");
    }

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

案例4:文件下載

    需求分析:
當(dāng)用戶在瀏覽器上點(diǎn)擊"下載"超鏈接時(shí),向服務(wù)器發(fā)送一個(gè)文件下載的請(qǐng)求
將服務(wù)器上的文件保存到本地

技術(shù)分析:
瀏覽器: 提供文件下載的超鏈接
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
<a href="download?filename=aa.txt">java資料(下載)</a>
服務(wù)器:
設(shè)置兩個(gè)頭,一個(gè)流
設(shè)置 文件的mime類型
response.setContentType(文件的mime類型);
設(shè)置 文件下載專用頭 attachment(附件) filename: 文件下載時(shí),保存文件的默認(rèn)名稱
response.setHeader("content-disposition","attachment;filename="+文件名稱);
獲取文件輸出流
response.getOutputStream();
步驟分析:
前端:
<a href="download?filename=meinv.png">美女的誘惑(下載)</a>
后臺(tái):
//1.獲取被下載的文件的名稱
String filename = request.getParameter("filename");
//2.設(shè)置兩個(gè)頭
//a.設(shè)置 文件的mime類型
// 獲取上下文對(duì)象
context = getServletContext();
// 獲取被下載文件的mime類型
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//b.設(shè)置 文件下載專用頭 attachment(附件) filename: 文件下載時(shí),保存文件的默認(rèn)名稱
response.setHeader("content-disposition","attachment;filename="+filename);
//3.獲取文件輸出流
// 讀取文件
// 找到文件在服務(wù)器上的完整路徑
String realPath = context.getRealPath("/download/"+filename);
// 獲取文件的輸入流
InputStream is = new FileInputStream(realPath);
// 輸出流
os = response.getOutputStream();
// 流的對(duì)拷
package com.itheima.f_download;

import javax.servlet.ServletContext;
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.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet(name = "DownloadServlet", urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 設(shè)置request對(duì)象的編解碼方式
        request.setCharacterEncoding("utf-8");
        //1.獲取被下載的文件的名稱
        String filename = request.getParameter("filename");

        //2.設(shè)置兩個(gè)頭
        //a.設(shè)置 文件的mime類型
        // 獲取上下文對(duì)象
        ServletContext context = getServletContext();
        // 獲取被下載文件的mime類型
        String mimeType = context.getMimeType(filename);
        response.setContentType(mimeType);
        //b.設(shè)置 文件下載專用頭  attachment(附件)  filename: 文件下載時(shí),保存文件的默認(rèn)名稱
        //response.setHeader("content-disposition","attachment;filename="+filename);
        //-------------------- 處理文件下載時(shí),默認(rèn)名稱(中文亂碼)
        // 文件下載注意事項(xiàng): 文件下載的默認(rèn)名稱永遠(yuǎn)使用瀏覽器自己的編解碼方式進(jìn)行解碼
        //String name = "美女.png";
        //name = URLEncoder.encode(name,"utf-8");
        // 使用工具類實(shí)現(xiàn)
        String agent = request.getHeader("user-agent");
        String name = DownLoadUtils.getName(agent,filename);

        //---------------------
        response.setHeader("content-disposition","attachment;filename="+name);
        //3.獲取文件輸出流
        // 讀取文件
        // 找到文件在服務(wù)器上的完整路徑
        String realPath = context.getRealPath("/download/"+filename);
        // 獲取文件的輸入流
        FileInputStream is = new FileInputStream(realPath);
        // 輸出流
        ServletOutputStream os = response.getOutputStream();
        // 流的對(duì)拷
        int len = 0;
        byte b[] = new byte[1024];
        while((len=is.read(b))!=-1){
            os.write(b,0,len);
        }
        // 關(guān)流
        os.close();
        is.close();
    }

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

工具類


import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

public class DownLoadUtils {
/**

@param agent : 用戶代理
@param filename : 文件名稱
@return
@throws UnsupportedEncodingException
/
    public static String getName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("Firefox")) {
            // 火狐瀏覽器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}

###         案例5:點(diǎn)擊切換驗(yàn)證碼

package com.itheima.g_anli5;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

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;
@WebServlet(name = "CodeServlet",urlPatterns = "/anli5")
public class CodeServlet extends HttpServlet {

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

    // 使用java圖形界面技術(shù)繪制一張圖片

    int charNum = 4; // 生成4位的驗(yàn)證碼
    int width = 20 * 4; // 圖片寬
    int height = 28; // 圖片高

    // 1. 創(chuàng)建一張內(nèi)存圖片
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // 2.獲得繪圖對(duì)象
    Graphics graphics = bufferedImage.getGraphics();

    // 3、繪制背景顏色
    graphics.setColor(Color.YELLOW);
    graphics.fillRect(0, 0, width, height);

    // 4、繪制圖片邊框
    graphics.setColor(Color.GRAY);
    graphics.drawRect(0, 0, width - 1, height - 1);

    // 5、輸出驗(yàn)證碼內(nèi)容
    graphics.setColor(Color.RED);
    graphics.setFont(new Font("宋體", Font.BOLD, 22));

    // 隨機(jī)輸出4個(gè)字符
    String s = "ABCDEFGHGKLMNPQRSTUVWXYZ23456789";
    Random random = new Random();

    // session中要用到
    String msg = "";

    int x = 5;
    for (int i = 0; i < charNum; i++) {
        int index = random.nextInt(32);
        String content = String.valueOf(s.charAt(index));

        msg += content;
        graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
        graphics.drawString(content, x, 22);
        x += 20;
    }

    // 6、繪制干擾線
    graphics.setColor(Color.GRAY);
    for (int i = 0; i < 5; i++) {
        int x1 = random.nextInt(width);
        int x2 = random.nextInt(width);

        int y1 = random.nextInt(height);
        int y2 = random.nextInt(height);
        graphics.drawLine(x1, y1, x2, y2);
    }

    // 釋放資源
    graphics.dispose();

    // 圖片輸出 ImageIO
    ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

}

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

}

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI