Java Web之request常用API-3

在这里插入图片描述

Request

获取请求行数据

GET localhost:8080/servletDemo/demo1?id=3 HTTP/1.1

上述代码是一个简单的URL路径,也就是请求行,通过该请求发送到指定后台,通过request对象获取其中参数

  1. 获取请求方式: GET
    String getMethod()
  2. 获取虚拟目录: /servletDemo
    String getContextPath()
  3. 获取Servlet路径:/demo1
    String getServletPath()
  4. 获取get方式的请求参数: id=3
    String getQueryString()
  5. 获取请求URI:/servletDemo/demo1
    String getRequestURI()
  6. 获取完整请求路径:/http://localhost:8080/serveltDemo/demo1
    String getRequestURL()
  7. 获取协议及版本:/HTTP/1.1
    String getProtocol()
  8. 获取客户机的IP地址:192.168.0.0
    String getRemoteAddr()

获取请求头

看浏览器发送的请求头信息,下图所实例F12操作…

在这里插入图片描述

  1. 获取请求头数据,通过请求头名称获取值
    String getHeader(String name)
  2. 获取所有请求头信息
    Enumeration<String> getHeaderNames()
// 示例
protected void doGet(HttpServletRequest request,HttpServletResponse response){
	Enumeration<String> headerNames = request.getHeaderNames();
	while(headerNames.hasMoreElements()){
		// 获取请求头名称
		String name = headerNames.nextElement();
		// 获取请求头名称对应的参数
		String value = request.getHeader(name);
		System.out.println(name+"---"+value);
	}
}

在这里插入图片描述

获取请求体

只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数,首先获取流对象,在从流对象中取出参数

  1. 获取流对象-获取字符输入流,只能操作字符数据
    BufferedReader getReader()
  2. 获取流对象-获取字节输入流,既能操作字节也能操作字符
    ServletInputStream getInputStream()

写一个输入框
在这里插入图片描述

后台代码

扫描二维码关注公众号,回复: 10789938 查看本文章
// 示例
protected void doPost(HttpServletRequest request,HttpServletResponse response){
	BufferedReader reader = request.getReader();
	String line = null;
	while((line = reader.getLine()) != null){
		System.out.println(line);
	}
}

控制台打印会把参数拼在一行之上
在这里插入图片描述

其他通用功能

也是一些常用的API无论get/post均可以获取

  1. 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
    String getParameter(String name)
  2. 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
    String[] getParameters(String name)
  3. 获取请求参数名称(与获取请求头方法类似)
    Enumeration<String> getParameterNames()
  4. 获取所有参数的Map集合
    Map<String,String> getParameterMap()

后台代码

// 示例
protected void doPost(HttpServletRequest request,HttpServletResponse response){
	Map<String,String> map = request.getParameterMap();
	Set<String,String> set = map.keySet();
	for(String name:set){
		System.out.println(name);
		String value = request.getParameter(name);
		System.out.println(value);
		
		System.out.println("---------")
	}
}

在这里插入图片描述
结果都是一样的。。。 目的都是相同的,就是写法上有些区别

中文乱码问题,Tomcat8 已经将GET 请求方式的乱码问题 解决了,但是POST方式的中文乱码问题 依旧存在,需要自行配置
在获取参数之前配置

request.setCharacterEncoding("UTF-8");

转发

一种在服务器内部的资源跳转方式,可以将request,response转发到别的对应的Servlet上面

步骤:

  • 通过request对象获取请求转发服务器:
    RequestDispatcher getRequestDispatcher(String path);
  • 使用==RequestDispatcher对象来进行转发
    forward(ServlertRequest request,ServletResponse response);

特点:

  • 浏览器地址没有发生变化
  • 只能访问当前服务器内部资源中
  • 转发是一次请求

共享数据

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

方法:

  • 存储数据
    setAttribute(String name,Object obj)
  • 通过键来获取值
    Object getAttribute(String name);
  • 通过键移除键对应的值
    removeAttribute(String name)
@WebServlet("/requestDemo01")
public class RequestDemo01 extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest request,HttpServletResponse response){
		request.setAttribute("name","Zhan San");
		request.getRequestDispatcher("/requestDemo02").forword(request,response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request,HttpServletResponse response){
		this.doGet(request,response);
	}
}
@WebServlet("/requestDemo02")
public class RequestDemo02 extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest request,HttpServletResponse response){
		String name = (String)request.getAttribute("name","Zhan San");
		Systme.out.println(name);
	}
	
	@Override
	protected void doPost(HttpServletRequest request,HttpServletResponse response){
		this.doGet(request,response);
	}
}

执行步骤:

  • 访问 /requestDemo01 设置共享数据,并转发到 /requestDemo02 资源中
  • 进入 /requestDemo02 资源中,取出共享数据并打印
  • 浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作
发布了24 篇原创文章 · 获赞 33 · 访问量 2391

猜你喜欢

转载自blog.csdn.net/weixin_41241629/article/details/104625628