web入门【Response & ServletContext】

Response & ServletContext

案例目标

  • 制作图片下载Servlet
  • 统计某Servlet的访问次数

第一部分 HTTP 响应

在这里插入图片描述

1 组成

在这里插入图片描述

  • 响应行

    HTTP/1.1 200 OK
    
  • 响应头

    Server: Apache/2.4.18(Ubuntu)
    Content-Encoding: gzip
    Content-Length: 4028
    Connection: Keep-Alive
    Content-Type: text/html
    
  • 响应体

    <!DOCTYPE html SYSTEM "about:legacy-compat">
    <html lang="en">
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="res/css/tomcat.css" rel="stylesheet" type="text/css">
    <link href="res/css/fonts/fonts.css" rel="stylesheet" type="text/css">
    <title>Apache Tomcat&reg; - Welcome!</title>
    <meta name="author" content="Apache Tomcat Project">
    <meta name="google-site-verification" content="nA9F0GvGNjVCU9W7HBziONQVx6FehvgQglI1X7WPfRw">
    </head>
    ...
    

2 响应行

HTTP/1.1 200 OK
  • 协议/版本
  • 状态码及状态信息
常见的状态码
状态码状态信息说明
200OK请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态
302Move temporarily重定向,请求的资源临时从不同的 URI 响应请求
403Forbidden服务器已经理解请求,但是拒绝执行它
404Not Found请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除
405Method Not Allowed请求行中指定的请求方法不能被用于请求相应的资源
500Internal Server Error服务器内部错误,通常程序抛异常

3 响应头

Server: Apache/2.4.18(Ubuntu)
Content-Encoding: gzip
Content-Length: 4028
Connection: Keep-Alive
Content-Type: text/html
常见的响应头
状态头说明
Server描述服务器信息,包含Web容器信息、服务器系统信息
Content-Length描述响应体的长度(字符数)
Content-Type请求体的编码格式,以及超文本类型。常见的有text/html, application/xml,application/json
Location指定响应的路径,需要与状态码302配合使用,完成跳转
Refresh3;url=www.itcast.cn 。
Content-Dispositionattachment; filename=1.gif 常用于文件下载,attachment指定,被访问的资源是一个下载(attachment)的资源,下载所使用的文件名为(1.gif)

4 响应体

<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="res/css/tomcat.css" rel="stylesheet" type="text/css">
<link href="res/css/fonts/fonts.css" rel="stylesheet" type="text/css">
<title>Apache Tomcat&reg; - Welcome!</title>
<meta name="author" content="Apache Tomcat Project">
<meta name="google-site-verification" content="nA9F0GvGNjVCU9W7HBziONQVx6FehvgQglI1X7WPfRw">
</head>
...
服务器发送给浏览器的内容。可以是字符流,也可以是字节流。

5 Chrome查看响应信息

在这里插入图片描述

6 小结

  • HTTP由哪两部分组成:

    请求request:浏览器发送给服务器

    响应response:服务器发送给浏览器

  • 响应由哪三部分组成

  • HTTP/1.1 码 信息

    200 OK

    404 Not Found

    500 Internal Server Error

  • Refresh:时间;跳转的地址

  • 服务器发送给浏览器的内容

    字符流/字节流

    HTML

第二部分 Response对象

HTTP响应:包括行头体,服务端发给浏览器。请求内容放在request对象。服务器发给浏览器的信息放在response对象。

1 响应行相关API

  • void setStatus(int statusCode)

    设置响应行-状态码,Tomcat不会协助添加错误信息
    
  • void sendError(int errorCode, String msg)

    设置状态码(errorCode),并且Tomcat会协助添加错误信息(msg)
    
案例
  • 通过设置状态码,观察浏览器信息
package com.itheima.day09;

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("/response_line")
public class ResponseLineServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置状态码(没有信息)
        response.setStatus(500);
      
        // 设置状态码(有信息,并且多一个"messgae")
        response.sendError(500, "你吃了吗");
    }

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

2 响应头相关API

  • void setHeader(String name, String value)

    在响应头中,设置一个Header。Header所对应的名字(name),以及Header所对应的值(value)  
    
  • void setContentType(String type)[重点]

    在响应头中,设置一个Header。Header所对应的名字为Content-Type,Header所对应的值为(value)  
    
案例
  • 过3秒跳转到另一个网站
package com.itheima.day09;

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;

// 过3秒跳到百度
@WebServlet("/refresh_sample")
public class RefreshSampleServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 过3秒跳到百度
        response.setHeader("Refresh", "3;url=https://www.baidu.com");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
案例
  • 利用302状态码,以及Location响应头,完成浏览器端页面跳转
    • 浏览器两次请求
    • 在浏览器完成的跳转
    • 浏览器地址会变
package com.itheima.day09;

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("/redirect_sample")
public class RedirectSampleServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
        // 手动重定向
        // 设置状态码为302,Location为跳转的地址
        response.setStatus(302);
        response.setHeader("Location", request.getContextPath() + "/hello");
    }

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

在这里插入图片描述

浏览器跳转技术 - 重定向
  • void sendRedirect(String location)
案例
  • 利用sendRedirect,完成浏览器端页面跳转
package com.itheima.day09;

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("/redirect_sample")
public class RedirectSampleServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        response.setStatus(302);
//        response.setHeader("Location", request.getContextPath() + "/hello");
      
        // 不需要手动设置302以及Location了
        response.sendRedirect(request.getContextPath() + "/hello");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
重定向与转发的区别【重点】

request.getRequestDispatcher("/资源路径").forward(request, response)

response.sendRedirect("/资源路径/地址")

  • 请求次数

    • 转发: 1次
    • 重定向: 2次
  • 浏览器地址

    • 转发: 不变
    • 重定向: 变
  • 跳转的位置

    • 转发: 服务器
    • 重定向: 浏览器
  • 转发

    request.getRequestDispatcher("/bservlet").forward(request, response);
    

在这里插入图片描述

  • 重定向

    response.sendRedirect(request.getContextPath() + "/bservlet");
    

在这里插入图片描述

转发重定向
地址不变地址改变
服务器内部跳转浏览器完成跳转
一次请求二次请求

3 响应体相关API【重点】

  • PrintWriter getWriter()

    获取字符输出流(输出到浏览器)

  • OutputStream getOutputStream()

    获取字节输出流(输出到浏览器,一般下载时或展示的是一个纯图片时使用)

案例
  • 利用getWriter,编写动态资源
package com.itheima.day09;

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("/hello")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取字符输出流
        PrintWriter writer = response.getWriter();
      
        // 向字符输出流中,输出HTML内容
        writer.println("<HTML>");
        writer.println("<HEAD>");
        writer.println("</HEAD>");
        writer.println("<BODY>");
        writer.println("<H1>Hello Servlet!</H1>");
        writer.println("</BODY>");
        writer.println("</HTML>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
案例
  • 利用getWriter,编写中文动态资源
package com.itheima.day09;

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("/hello")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取字符输出流
        PrintWriter writer = response.getWriter();

        // 可以选择write/print/println
        // 向字符输出流中,输出HTML内容
        writer.println("<HTML>");
        writer.println("<HEAD>");
        writer.println("</HEAD>");
        writer.println("<BODY>");
        writer.println("<H1>你好,Servlet!</H1>");
        writer.println("</BODY>");
        writer.println("</HTML>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
响应体乱码解决
  • response.setCharacterEncoding(“字符集”)

    响应体使用指定的字符集传输  
    
  • response.setContentType(“text/html; charset=utf-8”)

    setCharacterEncoding用于设置传输字符集,但是浏览器仍然不清楚页面所采用的字符编码。可以在Content-Type头给出。
    
    如果在Content-Type头部指定了字符编码,则setCharacterEncoding可以省略。
    
    
package com.itheima.day09;

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("/hello")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 在未设置字符编码之前,打印默认的字符编码
        System.out.println(response.getCharacterEncoding());

        // 服务器需要告诉浏览器我发送的响应体是什么字符编码
        // 如果同时设置了Content-Type的编码,和response的characterENcoding的话,只需要写一个Content-Type即可
//        response.setCharacterEncoding("utf-8");
//        response.setHeader("Content-Type", "text/html; charset=utf-8");
        response.setContentType("text/html; charset=utf-8");

        PrintWriter writer = response.getWriter();
        // 可以选择write/print/println
        writer.println("<HTML>");
        writer.println("<HEAD>");
        writer.println("</HEAD>");
        writer.println("<BODY>");
      
        // 输出中文
        writer.println("<H1>你好, Servlet!</H1>");
        writer.println("</BODY>");
        writer.println("</HTML>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
案例
  • 利用getOutputStream,制作图片下载Servlet
package com.itheima.day09;

import org.apache.commons.io.IOUtils;

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.*;

@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 告诉浏览器,这是一个附件,要下载,下载的文件名是download.gif
        response.setHeader("Content-Disposition", "attachment; filename=download.gif");

        // 获取浏览器字节输出流以及文件输入流
        OutputStream out = response.getOutputStream();
        InputStream in = new FileInputStream("/Users/LEAF/download.gif");

        // 从输出流读取,写入到输出流
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
        }

        // 关闭流对象
        in.close();
        out.close();
    }

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

4 IOUtils 工具包

  • commons-io-2.1.jar
相关API
  • static int copy(InputStream input, OutputStream output)

    从输入流当中,读取数据,输出到输出流当中
    
    返回值:
    the number of bytes copied, or -1 if > Integer.MAX_VALUE
    被拷贝了多少个字节,如果发生错误的是,返回是-1
    如果超过了2GB的话,返回值是Inter.MAX_VALUE
    
案例
  • 利用IOUtils,改进图片下载Servlet
实现
package com.itheima.day09;

import org.apache.commons.io.IOUtils;

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.*;

@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 告诉浏览器,这是一个附件,要下载,下载的文件名是download.gif
        response.setHeader("Content-Disposition", "attachment; filename=download.gif");

        // 获取浏览器字节输出流以及文件输入流
        OutputStream out = response.getOutputStream();
        InputStream in = new FileInputStream("/Users/LEAF/download.gif");

        // IOUtils读取、写入
        IOUtils.copy(in, out);

        // 关闭流对象
        in.close();
        out.close();
    }

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

5 小结

  • 响应行

    setStatus(int status)

    sendError(500):会有错误信息

  • 响应头

    response.setHeader(String key, String value)

    response.setContentType(String value)

    sendRedirect(“url地址”)

    转发:

    1次请求

    地址不变

    服务器内部进行跳转

    重定向:

    2次请求

    地址改变变

    浏览器内部跳转

  • 响应体

    字节输出流

    OutputStream getOutputStream()

    字符输出流

    PrintWriter getWriter()

  • 乱码

    请求

    request.setCharacterEncoding(“utf-8”)

    响应

    setContentType(“text/html; charset=utf-8”)

  • IOUtils

    IOUtils.copy()

第三部分 ServletContext

1 ServletContext是什么

Servlet用于与Web容器(Tomcat)通信的一组方法,对于每个Java虚拟机、每个Web应用都有一个上下文

2 ServletContext的获取方式

  • Servlet.getServletContext()

    this为GenericServlet的派生类
    
  • request.getServletContext()

3 ServletContext的作用

获得Web应用资源下的文件路径【重点】
相关API
  • String getRealPath(String path)

    获取真实路径

    如果path当中的文件,不存在的话,还是会返回

  • InputStream getResourceAsStream(String path)

    从资源当中获取一个输入流

    如果path当中的文件,不存在的话,返回值是null

案例
  • 利用getRealPath及getResourceAsStream,改进文件下载Servlet
实现
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>Servlet Download</h2>
<a href="download_sample?filename=file.txt">file.txt</a><br>
<a href="download_sample?filename=file.zip">file.zip</a><br>
<a href="download_sample?filename=搞笑.gif">搞笑.gif</a><br>
</body>
</html>

  • DownloadServlet.java
package com.itheima.day09;

import org.apache.commons.io.IOUtils;

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.*;

@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取前端发过来的文件名参数
        String filename = request.getParameter("filename");
      
        // 告诉浏览器下载文件的文件名
        response.setHeader("Content-Disposition", "attachment; filename=" + filename);

        // 获取字节输出流
        OutputStream out = response.getOutputStream();
      
        // 获取文件的输入流对象
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/" + filename);
        System.out.println("Download:");
        System.out.println(this.getServletContext().getRealPath("/WEB-INF/" + filename));
        System.out.println();

        // 利用IOUtils进行读取、写入
        IOUtils.copy(in, out);

        // 关闭流对象
        in.close();
        out.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
下载中文文件错误解决
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("中文", "utf-8") + ".gif");
小结
  • String getRealPath(String path)

    获取文件的绝对路径

    获取真实路径

    坑:只是单纯的字符串拼接,不做"文件是否存在"的检查

  • InputStream getResourceAsStream(String path)

    获取资源作为流(输入流)

获得Web应用的全局初始化参数【了解】
参数设置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 设置参数 -->
    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>pwd</param-value>
    </context-param>
</web-app>
相关API
  • String getInitParameter(String name)
  • Enumeration getInitParameterNames()
实现
package com.itheima.day09;

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(name = "InitParamServlet")
public class InitParamServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 读取参数
        ServletContext servletContext = this.getServletContext();
        System.out.println("username: " + servletContext.getInitParameter("username"));
        System.out.println("password: " + servletContext.getInitParameter("password"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
小结
  • 设置全局初始化参数

    在web.xml,

  • 获取全局初始化参数

    String(value) getInitParameter(String name)

【扩展】Servlet获取初始化参数
参数设置
  • web.xml
    <servlet>
        <servlet-name>InitParamServlet</servlet-name>
        <servlet-class>com.itheima.web.InitParamServlet</servlet-class>

        <!-- Servlet初始化参数配置 -->
        <init-param>
            <param-name>name</param-name>
            <param-value>zhangsan</param-value>
        </init-param>

        <init-param>
            <param-name>age</param-name>
            <param-value>13</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>InitParamServlet</servlet-name>
        <url-pattern>/init_param</url-pattern>
    </servlet-mapping>
相关API
  • String getInitParameter(String name)
  • Enumeration getInitParameterNames()
实现
  • InitParamServlet
package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

// 初始化参数相关的Servlet
public class InitParamServlet implements Servlet {
    private ServletConfig config = null;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        config = servletConfig;
        String name = servletConfig.getInitParameter("name");
        String age = servletConfig.getInitParameter("age");

        System.out.println(name);
        System.out.println(age);
    }

    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("InitParamServlet被调用了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
  • InitParamServlet
// 初始化参数相关的Servlet
public class InitParamServlet implements HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = getInitParameter("name");
        String age = getInitParameter("age");

        System.out.println(name);
        System.out.println(age);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
【重点】ServletContext是一个域对象
相关API
  • setAttribute(String key, Object obj)
  • Object getAttribute(String key)
  • removeAttribute(String key)
案例
  • 统计某Servlet的访问次数
实现
package com.itheima.day09;

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("/count_sample")
public class CountServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 统计这个Servlet的访问次数
        // 把"访问次数"输出到浏览器
        // 字符输出流当中有中文,设置编码
        response.setContentType("text/html; charset=utf-8");

        PrintWriter out = response.getWriter();


        // 先获取上下文域对象
        ServletContext context = getServletContext();

        // 规定:"访问次数"的域 对象的名字:accessCount
        // 规定:"accessCount"是整型
        // 1. 如果第1次访问的,根本就没存,所以需要做判断
        Integer accessCount = (Integer) context.getAttribute("accessCount");
        if (accessCount == null) {
            // 因为一次还要再加1,所以先给一个0
            // 因为一会再加1之后,还需要设置回去,也就是调用setAttribute,所以,一起设置
            accessCount = 0;
        }
        // 2. 每一次访问,"访问次数"取出来,加1,再存回去
        accessCount ++;

        // 3. 要统计的,把"访问次数"找个地方存
        // 把这个数据存放的地方,定为服务器内部
        // 选择域对象进行存储
        // 在请求域和上下文域当中,做出选择
        // 请求域:因为请求域使用的是request对象,request对象在每一次受浏览器访问时,都会创建一份新的
        //         所以放到请求域当中,永远都是1
        // 上下文域:在项目启动时创建,在项目卸载时销毁,有且只有1个
        //           既然有且只有1个的话,那么这个数据,就可以放到上下文域当中
        context.setAttribute("accessCount", accessCount);

        out.write("<h1>此Servlet被访问了" + accessCount + "次</h1>");
    }

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

4 ServletContext与Request域的对比

Context:上下文

ServletContext

上下文域

Request(HttpServletRequest)

请求域

上下文域,在Web应用被Web容器加载的时候被创建,在Web程序被卸载的时候被销毁。在Web应用程序内部有效

请求域上下文域
创建每一次被浏览器访问时创建项目加载/启动/部署时
销毁响应结束时项目卸载/结束时
作用范围1个用户的1个请求所有用户的所有请求

5 小结

  • ServletContext的获取方式

    getServletContext();
    request.getServletContext();
    
  • ServletContext的作用

    • 获得Web应用资源下的文件路径

      String getRealPath("path");
      InputStream getResourceAsStream("path")
      
    • 获得Web应用的全局初始化参数

      • 设置

        param-name

        param-value

      • 获取

        getInitParameter()

    • ServletContext是一个域对象【重点】

      • Object getAttribute(String name)
      • setAttribute(String key, Object object)
      • removeAttribute(String key)
  • ServletContext的生命周期

    项目启动

    项目卸载

    所有用户的所有请求

第四部分 学习目标总结

  • 能够理解HTTP协议的响应部分

    setHeader(String key, String value)

    setContentType(String contentType)

    sendRedirect(“url”)

    getWriter

    getOutputStream

  • 能够应用Response对象的方法

    response.setHeader(“Content-Type”, “text/html”)

    response.setContentType(“text/html;charset=utf-8”)

    sendRedirect(“资源地址”)

  • 能够应用Response对象处理中文乱码

    response.setContentType(“text/html; charset=utf-8”)

  • 能够应用转发和重定向的方法

    **转发:**request.getRequestDispatcher(“路径”).forward(request, response)

    **重定向:**response.sendRedirect(“重定向的地址”)

  • 能够应用Response对象完成文件下载代码

    setHeader(“Content-Disposition”, “attachment; filename=1.gif”)

    把中文转换成url广泛使用的一种英文

    URLEncoder.encode(“中文字符串”, “utf-8”)

    **完整写法:**setHeader(“Content-Disposition”,"attachment;filement= " + URLEncoder.encode(“下载”,“utf-8”) + “.jpg”)

  • 【重点】能够使用ServletContext域对象

    getServletContext()

    setAttribute

    getAttribute

    removeAttribute()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值