JavaWeb(2)

学习目标:

  • 学习Request
  • 学习Response
  • 学习ServletContext对象
  • 了解会话技术Cookie\Session

学习内容:

  1. 掌握Request
  2. 掌握Response
  3. 掌握ServletContext对象
  4. 熟悉会话技术Cookie\Session

学习产出:

1、Request:请求消息:客户端发送数据给服务端

1)获取请求行数据

Get /request-demo/req1?username=zhangsan Http/1.1
  • 获取请求方式Get

    String getMethod()

  • 获取虚拟目录(项目访问路径) --request-demo

    String getContextPath()

  • 获取Servlet路径-- /req1

    String getServletPath()

  • 获取请求参数(GET方式) --username = zhangsan

    String getQueryString()

  • 获取请求参数(POST方式)
    BufferedReader getReader()
    在这里插入图片描述

  • 获取请求URL(统一资源定位符)–http://localhost:8080/request-demo/req1

    StringBuffer getRequestURL

  • 获取请求URI(统一资源标识符)–/request-demo/req1
    String getRequestURI()

  • 获取协议及版本

    String getProtocol()

  • 获取客户机的IP地址

    String getRemoteAddr()

2)获取请求头数据–User-Agent

  • 通过请求头的名称,获取请求头的值

    String getHeader(String name)

3)获取请求体数据
请求体:只有post请求方式才有请求体,在请求体中封装了post请求的请求参数

  • 获取流对象

    BufferedReader getReader() 获取字符输入流,只能操作字符数据
    在这里插入图片描述

    ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型的数据(使用文件上传中)

  • 其他(get、post都可以用)

    String getParameter(String name) 根据参数名获取参数值 username = zs

//3、根据key获取单个参数值
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        System.out.println("username");
        System.out.println("password");
    }

String[] getParameterValues(String name) 根据参数名称获取参数值数组

 //2、根据key获取参数值,数组
        String[] hobbies=req.getParameterValues("hobby");
        for(String hobby:hobbies){
            System.out.println(hobby);
        }

Enumeration<string> getParameterNames() 获取所有请求的参数名称

Map<String, String[]> getParameterMap() 获取所有参数的Map集合

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("get...");
    Map<String,String[]> map=req.getParameterMap();
    for(String key:map.keySet()){
        System.out.print(key+":");
//        获取值
        String[] values=map.get(key);
        for(String value:values){
            System.out.print(value+" ");
        }
    }
 }
  • 乱码问题

    get方式,tomcat已经处理了

    post方式,设置request.setCharacterEncoding(“utf8”)

4)请求转发
一种服务器内部资源跳转的方法,servlet之间的跳转
步骤:

  1. 通过request请求对象获取请求转发器对象

  2. 通过RequestDispatcher对象进行转发

request.getRequestDispatcher("转发路径/demo8").forward(request, response)

特点:

  1. 浏览器地址路径不发生变化
  2. 只能转发到服务器内部资源
  3. 转发是一次请求

5)共享数据
1、域对象:一个有作用范围的对象,可以在范围内共享数据
2、 request域:代表一次请求范围,一般用于请求转发的多个资源数据

setAttribute(String name, Object object) // 存储数据
getAttribute(String name) // 通过键获取数据
removeAttribute(String name) // 通过键移除数据
//        存储数据,写在demo7
        request.setAttribute("msg","hello");
 //        根据key,获取值,写在demo8
        request.getAttribute("msg");

2、Response

1)响应行

  • 组成:协议/版本 响应状态码 状态码描述
  • 响应状态码:服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数
    • 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送1xx状态码
    • 2xx:成功,200
    • 3xx:重定向。302重定向,304访问缓存
    • 4xx:客户端错误。404找不到后台地址
    • 5xx:服务器端错误。500服务器内部错误

2)响应头
常见

  • Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
  • Content-disposition:服务器告诉客户端以什么格式打开响应体数据
    • in-line默认值,在当前页打开
    • attachment;filename=xxx 以附件的形式打开响应体,文件下载

3)响应体
向客户端返回数据

  • 设置响应行
    格式:HTTP/1.1 200 OK
    设置状态码:setStatus(int sc)
  • 设置响应头
    setHeader(String name, String value)
  • 设置响应体
//response.getWriter().write(内容)
//response.getOutputStream.write()

//获取字节输出流
//    读取文件
    FileInputStream fis=new FileInputStream("");
//    获取response字节输出流
    ServletOutputStream os=resp.getOutputStream();
//    完成流的copy
   // byte[] buff=new byte[1024];
    //int len=0;
   // while((len=fis.read(buff))!=-1){
    //    os.write(buff,0,len);
//}
 	IOUtils.copy(fis,os);
    fis.close();



//pom.xml中要写入
<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
  • 解决返回乱码
//获取字符输出流
//先设置流的编码
response.setContentType("text/html",charset=utf-8)
        PrintWriter writer=response.getWriter();
//        content-type  解析html标签  plain普通文本
        //resp.setHeader("content-type","text/html");
        writer.write("<h1>aaa</h1>");
    }

4)重定向

特点:

  1. 地址栏发生变化
  2. 重定向可以访问其他站点的资源
  3. 重定向是两次请求,不能使用request对象来共享数据
response.sendRedirect("./MyHttpServlet02"); // 相对路径
response.sendRedirect("http://127.0.0.1:8080/Web02/MyHttpServlet02"); // 绝对路径
response.sendRedirect("http://www.baidu.com"); // 绝对路径

3、ServletContext对象

ServletContext官方叫Servlet上下文。服务器会为每一个工程创建一个ServletContext对象。这个对象全局唯一,工程内所有的servlet都共享这个对象。所以叫全局应用程序共享对象

代表整个web应用,可以和程序的容器(服务器)来通信
1)作用

  • 是一个域对象
  • 可以读取全局配置参数
  • 可以搜索当前工程目录下面的资源文件

2)凡是域对象都有以下3个方法

  • setAttribute(name, value) 添加数据
  • getArrtibute(name) 获取数据
  • removeAttribute(name) 删除数据

3)获取方式

  • request.getServletContext()
  • this.getServletContext()

4)获取MIME类型
在互联网通信过程中定义的一种文件数据类型

String filename = "a.jpg";
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);

5)获取文件真实的路径

String path = context.getRealPath("/index.html");
System.out.println(path);

4、会话技术

会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方停止
功能:在一次会话的范围内的多次请求,共享数据
方式:客户端cookie、服务端session
1)Cookie
客户端存储技术、将数据保存在客户端
步骤

  • 创建cookie对象
    new Cookie(String name, String value)
  • 发送cookie对象
    response.addCookie(Cookie cookie)
  • 获取cookie对象,拿到数据
    Cookie[] request.getCookie()
    其他
  • 可以一次发送多个cookies
    创建多个Cookie对象,通过response.addCookie()添加多次
  • 在浏览器保存的时长
    默认情况下,当浏览器关闭的时候,cookie被销毁
    正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)
    负数:默认
    0:删除cookie信息
public class web01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("web1");

      //创建cookie对象
        Cookie cookie=new Cookie("num","100");

        //通知浏览器往cookie里面存数据
        resp.addCookie(cookie);
        resp.addCookie(new Cookie("a","200"));

    }
}

2)session
服务器端会话技术,将数据保存到服务器端对象中

public class web02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("web1");
		//setAttribute
      HttpSession session=req.getSession();
      session.setAttribute("name","张三");
    }

//getAttribute
HttpSession session = request.getSession();
System.out.println(session.getAttribute("name"));

注意

  • Session是依赖于Cookie
  • 当客户端关闭后,服务器不关闭,两次获取的session id默认是不一样的
    如果需要相同,可以创建cookie,键为JSESSIONID
HttpSession session = request.getSession();
session.setAttribute("userid", "123");

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
    • 客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样

    • session销毁

      服务器关闭,session失效

      session对象调用invalidate()方法

      session默认试校时间是30分钟,在tomcat的conf目录下的web.xml,配置session-config

  • 特点

    • session用于存储一次会话的多次请求的数据,存在服务端
    • session可以存储任意类型,任意大小的数据
    • session数据存在服务端,cookie存在客户端
    • session没有数据大小限制,cookie有
    • session数据安全,cookie相对不安全
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值