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
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :