Request
获取请求行数据
GET localhost:8080/servletDemo/demo1?id=3 HTTP/1.1
上述代码是一个简单的URL路径,也就是请求行,通过该请求发送到指定后台,通过request对象获取其中参数
- 获取请求方式: GET
String getMethod()
- 获取虚拟目录: /servletDemo
String getContextPath()
- 获取Servlet路径:/demo1
String getServletPath()
- 获取get方式的请求参数: id=3
String getQueryString()
- 获取请求URI:/servletDemo/demo1
String getRequestURI()
- 获取完整请求路径:/http://localhost:8080/serveltDemo/demo1
String getRequestURL()
- 获取协议及版本:/HTTP/1.1
String getProtocol()
- 获取客户机的IP地址:192.168.0.0
String getRemoteAddr()
获取请求头
看浏览器发送的请求头信息,下图所实例F12操作…
- 获取请求头数据,通过请求头名称获取值
String getHeader(String name)
- 获取所有请求头信息
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请求的请求参数,首先获取流对象,在从流对象中取出参数
- 获取流对象-获取字符输入流,只能操作字符数据
BufferedReader getReader()
- 获取流对象-获取字节输入流,既能操作字节也能操作字符
ServletInputStream getInputStream()
写一个输入框
后台代码
// 示例
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均可以获取
- 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
String getParameter(String name)
- 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
String[] getParameters(String name)
- 获取请求参数名称(与获取请求头方法类似)
Enumeration<String> getParameterNames()
- 获取所有参数的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 资源中,取出共享数据并打印
- 浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作