简述
Request对象就是请求消息对应的java类,request和response对象是由tomcat服务器创建的,我们来使用他们。
在创建servlet的时候,tomcat会将客户端的请求消息封装到request消息封装到request类中,然后将request和respone传入servlet的service方法中。
程序员就可以在service方法中通过request对象获取请求信息,通过response对象设置相应信息数据。tomcat会在给浏览器相应前,从response拿程序员设置的相应消息数据。
resquest对象体系结构
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade类(tomcat)
resquest获取请求消息数据
获取请求行数据
请求行格式:请求方式 请求url 请求协议/版本
例如有如下请求行:GET /day14/demo1?name=zhangsan HTTP/1.1
String getMethod() | 获取请求方式 :GET |
String getContextPath() | 获取虚拟目录:/day14 |
String getServletPath() | 获取Servlet路径: /demo1 |
String getQueryString() | 获取get方式请求参数:name=zhangsan |
String getRequestURI(): /day14/demo1 |
获取请求URI:/day14/demo1 |
String getProtocol() | 获取协议及版本:HTTP/1.1 |
String getRemoteAddr() | 获取客户机的IP地址 |
获取请求头数据
String getHeader(String name) | 通过请求头的名称获取请求头的值 |
Enumeration<String> getHeaderNames() | 获取所有的请求头名称 |
Enumeration可以理解为一个迭代器,可以通过方法二配合方法一获取请求头所有的数据,但日常中我们常用的是方法一,因为我们已经知道很多请求头的名称了
获取请求体数据
对于请求体数据可以是字节数据或字符数据,我们可以先获取流对象,然后通过流对象获取数据
BufferedReader getReader() | 获取字符输入流,只能操作字符数据 |
ServletInputStream getInputStream() | 获取字节输入流,可以操作所有类型数据 |
其他功能
获取请求参数通用方式
无论get还是post请求方式都可以使用下列方法来获取请求参数
String getParameter(String name) | 根据参数名称获取参数值 |
String[] getParameterValues(String name) | 根据参数名称获取参数值的数组 hobby=xx&hobby=game |
Enumeration<String> getParameterNames() | 获取所有请求的参数名称 |
Map<String,String[]> getParameterMap() | 获取所有参数的map集合 |
解决中文乱码
乱码的原因:浏览器向服务器发送utf-8编码的数据,
若是get请求,tomcat8之前要在server.xml里进行配置解决乱码,tomcat8之后tomcat帮我们解决了
若是post请求,我们则需调用request.setCharacterEncoding("utf-8");指定服务器的编码集解决乱码
请求转发
请求转发是一种在服务器内部的资源跳转方式,比如我们有两个servlet完成两部分工作,则就需要请求转发的方式了
RequestDispatcher getRequestDispatcher(String path) | 通过request对象获取请求转发器对象,参数是要转发资源的路径 |
forward(ServletRequest request, ServletResponse response) | 使用RequestDispatcher对象来进行转发 |
RequestDispatcher详解(转):https://blog.csdn.net/gaoshan12345678910/article/details/82183820
转发最大的特点就是,过程中只有一次请求,浏览器的URL没有变化,真正产生相应数据的是被转发的servlet,且只能转发当前服务器的内部资源。
共享数据
有了请求转发,就牵扯到数据共享问题了
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
void setAttribute(String name,Object obj) | 存储数据 |
Object getAttitude(String name) | 通过键获取值 |
void removeAttribute(String name) | 通过键移除键值对 |
获取ServletContext
ServletContext getServletContext() | 获取ServletContext对象 |
获取数据
这里的获取数据是对post请求和get请求数据的统称,他们两种请求数据都可以用
String request.getParameter("name") |
获取key值为name的请求数据 |
对于我们要封装一个bean类,例如在登录页面我们填写了个人信息,现在需要把他们封装为一个User类
我们可以通过Map<String,String[]> map = request.getParameterMap();获取数据的map集合,然后通过BeanUtils工具类的populate方法来进行封装
Map<String,String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
因为表单数据如一个checkbox可能有两个value值,所以map的泛型是String,String[]类型的