2021-12-05  2021-12-05    3398 字   7 分钟

请求与响应

一、请求

1. 理解

ServletRequest接口  ----> HttpServletRequest子接口 ---->HttpServletRequestWrapper 实现类
    ① 客户端请求将请求信息封装该对象中
    ② 该对象是由Servlet容器创建的,开发者只需要使用
    ③ 在核心方法中直接使用
    定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法。

2. 作用

作用:获取请求信息: 请求行  请求头 请求正文

3. 使用

1. 获取请求行信息
        String scheme = request.getScheme();
        System.out.println("协议:"+scheme);

        String serverName = request.getServerName();
        System.out.println("主机名:"+serverName);

        int serverPort = request.getServerPort();
        System.out.println("端口号:"+serverPort);

        String contextPath = request.getContextPath();
        System.out.println("项目名:"+contextPath);

        String method = request.getMethod();
        System.out.println("请求方式:"+method);

        StringBuffer requestURL = request.getRequestURL();

        System.out.println("请求URL:"+requestURL);

2. 获取请求头信息
        String accept = request.getHeader("Accept");
        System.out.println("accept:"+accept);
        System.out.println("------------------------------------------");
        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            String value = request.getHeader(name);
            System.out.println(name+":"+value);
        }

3. 获取请求正文(重点)
    · 获取URL拼接参数
    	//① 根据一个name获取一个value
    	String value = request.getParameter("name");
    · 获取表单数据
        // ② 获取一个name对应多个value
        String[] values = request.getParameterValues("name");
		
        // ③ 获取表单中所有的name 
	   Enumeration<String> names = request.getParameterNames();

	   // ④ 获取全部的name和 value
	   Map<String, String[]> map = request.getParameterMap();


4. BeanUtils实现map映射实体类对象
     ① 下载导包 commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar
     ② 使用
    	BeanUtils.populate(要映射对象, map数据);
		要求:表单的name值 和 实体类的属性名 一致
        
5. 请求中文乱码
        request.setCharacterEncoding("utf-8");

6. 案例:注册案例
    
7. 转发
    理解:
    	客户端请求资源ServletA时,ServletA资源不足或者没有,请求其他的资源(页面、Servlet),再响应给客户端。请求其他的资源的过程叫做转发
    
    使用:
   	// 1. 获取转发器
     RequestDispatcher rd = request.getRequestDispatcher("要转发资源的路径");

 	// 2. 请求转发
	rd.forward(request, response); // 完全转发
	rd.include(request, response); // 部分转发

  使用场景:跳转页面 如:注册成功跳转登录页

二、响应

1. 理解

	定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。
      ① 是Servlet中处理响应的对象
      ② 是Servlet容器 创建的
      ③ 作为核心方法的参数 开发者只需要在核心方法中使用
        
   ServletResponse接口 ----> HttpServletResponse子接口 ----> HttpServletResponseWrapper 实现了

2. 作用

Servlet中处理响应客户端的对象。可以响应文本,也可以响应字节

3. 使用

① 文本

响应文本:
    PrintWriter writer = response.getWriter();
    writer.print("I am server, 这是文本信息");

中文乱码问题解决:
    response.setContentType("text/html; charset=utf-8");

② 字节

响应字节:
    ServletOutputStream sos = response.getOutputStream();

文件下载案例:
    文件从服务器 ----> 客户端 ----> 下载到本地磁盘
     // 1. 获取请求信息
     String filename = request.getParameter("filename");

    // 2. 实现下载:读入到内存  然后写出到客户端  再由客户端下载到本地
    // 3. 读入内存
    // 3.1 获取web目录下资源的真实路径
    String realPath = request.getServletContext().getRealPath("img/" + filename);
    // System.out.println(realPath);

    FileInputStream fis = new FileInputStream(realPath);


    // 告诉浏览器 该文件需要下载
    response.setHeader("Content-Disposition", "attchment;filename="+filename);

    // 4. 写出到客户端 
    ServletOutputStream sos = response.getOutputStream();

    // 5. 边读边写
    byte[] buff = new byte[2*1024];

    int len = 0;
    while((len=fis.read(buff))!=-1){
        sos.flush();
        sos.write(buff, 0, len);
    }

    // 6. 关闭
    sos.close();
    fis.close();

4. 重定向

理解:	
	客户端请求ServletA资源,ServletA没有资源ServletA响应客户端携带302状态码和重定向的url地址。客户端立刻对重定向的地址发送请求。这个过程称为重定向

实现:
    response.sendRedirect("重定向地址");

使用场景:跳转页面 如:登录成功跳转首页

三、转发和重定向区别

转发特点:
    1. 转发是由请求发起的
    2. 发生在服务器内部
    3. 转发过程中请求地址不变 
    4. 转发只能转发内部资源
    5. 转发可以转发WEB-INF中的资源
    6. 表单提交完成之后转发不可以刷新当前页面
重定向特点:
    1. 重定向是由响应发起的
    2. 发生在客户端与服务器之间
    3. 重定向过程请求地址发生变化
    4. 重定向既可以重定向内部资源 也可以重定向外部资源
    5. 重定向不可以重定向WEB-INF下的资源
    6. 表单提交完成之后重定向可以刷新当前页面

四、作业

实现登录和注册功能

共享域

1. 理解

 在Servlet可以实现数据共享的对象。  

2. 分类

① ServletContext 范围最大 可以在项目的任何地方实现数据的共享
② session   范围 一次会话中 实现数据的共享
③ request   范围 一次请求中 实现数据的共享

3. 作用

实现Servlet与Servlet之间 或者 Servlet与页面之间  数据的共享

4. 使用

保存数据到共享域:
    setAttribute(String name, Object value);

取共享域数据:
    getAttribute(String name);

删除共享域数据
    removeAttribute(String name)

Cookie 和 session

一、会话

1.理解

 	客户端发送请求到服务器,连接成功会话开始,只有连接不断开整个过程就属于一次会话。从连接成功开始 到 服务器或者客户端断开结束。在此期间的任何请求 任何资源都属于该次会话。

2. 作用

 	由于HTTP协议,无状态的特点。每次请求都是一次新的会话,有时候需要重复验证。所以用户体验太差,要解决这种问题 使用会话技术。

3. 会话技术

Cookie  客户端会话
session 服务器端会话

二、Cookie

1. 理解

	创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
    
    1. 需要在Servlet中创建
    2. 保存到浏览器
    3. 唯一标识客户端 保存少量数据

2. 使用

1. 创建cookie
    Cookie cookie = new Cookie(String name, String value);

2. 响应客户端
    response.addCookie(cookie);

3. 获取cookie 
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+"=="+value);
            }
        }else{
            System.out.println("没有cookie.....");
        }
4. 过期时间 和浏览器无关
    cookie.setMaxAge(); // 单位:m   +秒数 -默认浏览器会话结束  0立即销毁

5. 有效路径:只在当前的有效路径下 生效
    默认当前创建cookie的Servlet访问路径的上一层
    cookie.setPath(路径); 

3. 场景

1. 记录上次访问时间
2. 登录时的记住账号功能(作业)
3. 浏览记录

4. 特点

1. Cookie保存到客户端 安全性低
2. Cookie保存数据只能是字符串 不能有特殊符号 空格 分号 逗号 不能以$开头等
3. Cookie保存数据大小最多4KB
4. 一个服务器可以创建多个Cookie   
5. Cookie可以设置有效时间 从调用addCookie方法开始 到期之后销毁了
6. Cookie的名字、路径、有效时间 决定了是不是同一个cookie

三、session

1. 理解

 	HttpSession 提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
     Servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。
        
     ① session是由Servlet容器创建
     ② 维护客户端和服务器的会话

2. 使用

1. 创建cookie
    Cookie cookie = new Cookie(String name, String value);

2. 响应客户端
    response.addCookie(cookie);

3. 获取cookie 
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+"=="+value);
            }
        }else{
            System.out.println("没有cookie.....");
        }
4. 过期时间 和浏览器无关
    cookie.setMaxAge(); // 单位:m   +秒数 -默认浏览器会话结束  0立即销毁

5. 有效路径:只在当前的有效路径下 生效
    默认当前创建cookie的Servlet访问路径的上一层
    cookie.setPath(路径); 

3. 场景

1. 用户登录成功保存用户信息
2. 购物车

4. 特点

1. session将数据保存到服务器 相对安全
 
2. session可以保存任意数据 
    
3. session保存数据的大小 没有限制
    
4. 一个服务器对应一个session对象 每个用户分别分配不同的id
    
5. session可以设置有效时间  这个时间是指两次相邻访问的时间间隔
    
6. session是通过JSESSIONID确定是否是同一次会话
    
隐藏特点:
    session数据的钝化(序列化到本地磁盘)和活化(从本地磁盘序列化到内存)

5. 总结

1. 保存数据量比较小  安全性低  数据易变 使用cookie维护会话
2. 保存的数据量较大  安全性高  数据不易变 使用session维护会话
    
 cookie数据保存到了客户端 减轻了服务器的压力,session默认需要借助cookie使用
即使没有cookie session也可以维护会话 比如:重写url地址
   

avatar
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :