request和response详细解说

request对象和response对象

一,原理html

  • 1,request和response对象是由服务器建立的,咱们来使用他们
  • 2,request对象是用来获取请求消息,response对象是设置响应消息

二,request对象的继承体系结构web

  • servletrequest --接口
    | 继承
  • HTTPservletrequest --接口
    | 实现
  • org.apache.catalina.connector.requestfacade 类(tomcat)

三,request功能:面试

  • 1,获取请求消息数据
    • 1,获取请求行数据
      GET /test/ldemo1?name=zhangsan HTTP/1.1
      方法:
      1,获取请求方式:GET
      string getmethod()
      2,获取虚拟目录:/test (重要,之后常常用到)
      string getcontextpath()
      3,获取servlet资源路径
      string getservletpath()
      4,获取get方式请求的参数:name=zhangsan
      string getQeurystring()
      5,获取URI:/test/demo1 (重要,经常使用)
      string getrequestERI(): /test/demo
      URI:统一资源标识符
      stringbuffer getrequestURL():http://localhost/test/demo1
      URL:统一资源定位符
      6,获取协议及版本信息
      string getprotocol()
      7,获取客户机的IP地址
      string getremoteaddr()apache

    • 2,获取请求头数据
      方法:
      1,string getheader(string name):经过请求头的名称来获取请求头的值
      2,getheadernames()获取全部的请求头名称数组

    • 3,获取请求体数据
      1,请求体:只有post请求方式,才有请求体,在请求体种封装了post请求的请求参数。
      步骤:
      1,获取流对象
      bufferedreader getreader():获取字符输入流,只有操做字符数据
      servletinputstream getinputstream():获取字节流,能够操做全部数据类型数据
      2,再从流对象中获取数据浏览器

    • 4,其余功能
      1,获取请求参数的通用方法:不管是get仍是post
      (1),string getparameter(string name):根据参数名获取值
      (2),string[] getparametervalues(string name):根据参数名称获取参数值的数组
      (3),Enumeration getparameternames():获取全部的请求的参数名称
      (4),Map<string string []> getparameterMap():获取全部参数的map集合
      中文乱码问题:
      get方式:tomcat8已经解决了
      post方式:会乱码;
      解决方式:设置request的编码;request.setcharacterencoding(“utf-8”)tomcat

      2,请求转发:一种在服务器内部的资源跳转方式bash

      (1),步骤:
      1,经过request对象获取请求转发的对象:requestdispatcher getrequestdispatcher(string path)
      2,使用requestdispatcher对象进行转发:forward(servletrequest res,servletresponse resp)服务器

      (2),特色:
      1,浏览器地址栏不发生改变
      2,只能转发当前的服务器内部资源
      3,转发是一次请求cookie

      3,数据共享
      域对象:一个有做用范围的对象,能够在范围内共享资源数据
      request域:表明一次请求的范围,通常用于请求转发的多个资源中共享数据
      方法:
      1,void setattribute(string name,object obj):存储数据
      2,object getattibute(string name):经过键获取值
      3,void removeattribute(string name):经过键移出键值对

      4,获取servletcontext
      (1),表明整个web应用,能够和程序的容器(服务器)来通讯
      servletcontext getservletcontext()
      获取方式:request.getservletcontext();

      (2),功能:
      获取MIME类型: string getmimetype(string file)
      域对象:共享数据 ;
      获取文件真实(服务器)路径:string getrealpath(string path)

比较重要的测试代码:

1,getheadernames()获取全部的请求头名称

Enumeration<String> headers = req.getHeaderNames();
		while (headers.hasMoreElements()) {
			String string = headers.nextElement();
			String value = req.getHeader(string);
			System.out.println(string+": "+value);
		}

打印结果:

host: localhost:8080
connection: keep-alive
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
cookie: JSESSIONID=6E7FC596F895D533CB872A38F2E173AA; Hm_lvt_f1ca44b62370e4b7dc11d5937e51c2d6=1582686890

2,Map<string string []> getparameterMap():获取全部参数的map集合

//获取参数 的map集合
		req.setCharacterEncoding("utf-8");
		Map<String, String[]> map = req.getParameterMap();
		//遍历
		Set<String> keySet = map.keySet();
		
		for (String keyname : keySet) {
			//获取键获取值
			String[] key = map.get(keyname);
			System.out.println(keyname);
			for (String values : key) {
				System.out.println(values);
			}
			System.out.println("----------------");
		}

打印结果

username
wangwu
----------------
password
1234
----------------
hobby
game
study
----------------

3,Enumeration getparameternames():获取全部的请求的参数名称

Enumeration<String> parameterNames = req.getParameterNames();
		while (parameterNames.hasMoreElements()) {
			String name =  parameterNames.nextElement();
			String[] parameterValues2 = req.getParameterValues(name);
			for (String string : parameterValues2) {
				System.out.println(string);
			}
		}

打印结果同上
4,数据共享,使用requestdispatcher对象进行转发:forward(servletrequest res,servletresponse resp)
登录的案例

User login = userDao.login(loginUser);
		if (login!=null) {
			req.setAttribute("login", login);
			RequestDispatcher requestDispatcher = req.getRequestDispatcher("/successservlet");
			requestDispatcher.forward(req, resp);
		} else {
			req.getRequestDispatcher("/failservlet").forward(req, resp);
		}

四,response对象

  • 1,功能:设置响应消息
    1,设置响应行
    格式:HTTP/1.1 200 ok
    设置状态码:setstatus(int sc)
    2,设置响应头:setheader(string name,string value)
    3,设置响应体:
    使用步骤:
    1,获取输入流
    字符输出流:printwriter getwriter()
    字节输出流:servletoutputstream getoutputstream()
    2,使用输出流,将数据传输给客户端浏览器
    中文乱码问题:
    1,printwriter pw = response。getwriter():获取流的默认编码是ISO-8859-1
    2,设置该流的默认编码
    3,告诉浏览器响应体使用的编码
    在获取流以前进行设置
    response.setcontenttype(“text/html;charset=utf-8”)

补充说明:
重定向与转发的区别(我面试的经历):
重定向:redirect
1,地址栏发生变化
2,能够访问其余站点的资源
3,重定向是两次请求

转发:forward
1,地址栏不发生变化
2,抓发只能访问当前服务器内部的资源
3,转发是一次请求

先整理到这吧。。。。。。