Request
- 相关概念
- 获取请求消息数据
- 其它功能
一、相关概念
1.1、什么是Request?
由服务器创建的一个对象,里面封装了请求消息的相关信息。
1.2、请求消息的原理
- 当Tomcat接收到请求消息时,会第一时间解析请求消息,获取请求消息的内容和目标访问资源
- 创建Request对象和Responce对象,将请求消息中的数据封装进Request对象中
- 根据目标访问资源(如:xxx/libibrary/demo1)创建对应Servlet对象(第一次),调用Servlet对象的
service()
方法,并将Request对象和Responce对象丢进去。
二、获取请求消息数据
2.1、获取请求行数据
请求行数据:GET http://localhost:8080/project1/demo1?name=zhangsan&pswd=123456 HTTP/1.1
-
获取请求方式————>>HttpServletRequest
String getMethod();//GET
-
获取URL————>>HttpServletRequest
StringBuffer getRequestURL();//http://localhost:8080/project1/demo1
-
获取协议及版本号————>>ServletRequest
String getProtocol();//HTTP/1.1 String getScheme();//http
-
获取请求主机的IP地址和端口号————>>ServletRequest
String getRemoteAddr();//0:0:0:0:0:0:0:1 int geServletPort()//11032
-
获取URI————>>HttpServletRequest
String getRequestURI();// /project1/demo1
-
获取虚拟目录————>>HttpServletRequest
String getContextPath();// /project
-
获取Servlet路径————>>HttpServletRequest
String getServletPath();// /demo1
-
获取请求参数————>>HttpServletRequest
String getQueryString();//name=zhangsan&pasw=123456
URL:统一资源定位符
URI:统一资源标识符
2.2、获取请求头数据
-
通过请求头的名称获取请求头的值
String getHeader(String name);
-
获取所有的请求头名称
Enumeration<String> getHeaderNames();
//案例演示 protected void doGet(HttpServletRequest req, HttpServletResponse resp){ Enumeration<String> en = req.getHeaderNames(); //Get模式的请求参数不在这里面 while(en.hasMoreElements()){ String name = en.nextElement(); String value = req.getHeader(name); System.out.println(name+"----"+value); } }
-
获取请求参数(get模式)
String getParameter(String name);
2.3、获取请求体数据
只有POST请求方式才有请求体,请求体中封装了Post请求的请求参数。
-
获取流对象
BufferedReader getReader();//获取字符输入流,可以操作所有类型数据
三、其它功能
3.1、获取请求参数的通用功能(GET/POST)
-
根据参数名称获取参数值
String getParameter(String name);
-
根据参数名称获取参数值的数组
String[] getParameterValues(String name);
-
获取所有的请求参数名称
Enumeration<String> getParameterNames();
-
获取所有请求参数的键值对集合
Map<String,String[]> getParameterMap();
中文乱码问题
- get模式:Tomcat已经内部将乱码问题处理了,所以get模式一般不会出现乱码问题
- post模式:需要将request的流编码改成和页面一样。
req.setCharacterEncoding(“UTF-8”);
3.2、请求转发
-
获取请求转发器对象
RequestDispatcher awr = request.getRequestDispatcher("/demo9");//创建转发器对象
-
通过转发器对象进行请求转发
awr.forward(reqquest,response);//请求转发
3.3、共享数据
request对象本质是一个域对象,当服务器接收到请求时创建,当服务器响应请求时释放。其作用域就是一次完整的请求,利用作用域的特点,我们可以实现一些信息的共享。
-
存储数据
void setAttribute(String key,Object obj);//向域中存储数据
-
通过键从域中取值
Object getAttribute(String key);//通过键名从域中取值
-
通过键从域中移除键值对
void removeAttribute(String key);//利用键名从域中删除键值对
-
案例
protected void doGet(HttpServletRequest req, HttpServletResponse resp) { req.setAttribute("message1","surprize1");//存值 req.setAttribute("message2","surprize2");//存值 req.getRequestDispatcher("/demo5").forward(req,resp);//请求转发——>>/demo5 }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) { System.out.println(req.getAttribute("message1"));//surprize1 req.removeAttribute("message2");//删除键值对 System.out.println(req.getAttribute("message2"));//null }
3.4、获取ServeletContext
ServletContext getServletContext();