文章目录
Request对象
1.request和response对象:
- request和response对象由tomcat服务器来创建的,request将浏览器发来的请求封装好给我们使用,response对象是我们来设置相应内容返回给浏览器的
2.request对象继承体系结构:
(Tomcat帮我创建的是 org.apache.catalina.connector.RequestFacade类,我们在doGet,doPsot中一般用HttpServletRequest接口来获取request(多态))
3.什么是HttpServletRequest ?
HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。简单来说,要得到浏览器发送过来的信息,就找HttpServletRequest对象
4.HttpServletRequest对象的常用方法:
-
4.1 获取请求行的数据:
GET /test/demo?username=linzeliang&password=123456 HTTP/1.1
- String getMethod():获取请求的方法
GET
- String getContextPath():获取虚拟目录
/test
- String getServletPath():获取资源路径
/demo
- String getQueryString():获取GET请求方法的请求参数
username=linzeliang&password=123456
- String getRequestURI():获取请求URI
/test/demo
(URI:统一资源标识符) - StringBuffer getRequestURL():获取请求URL
http://localhost/test/demo
(URL:统一资源定位符) - String getProtocol():获取HTTP的协议与版本
HTTP/1.1
- String getRemoteAddr():获取请求客户主机的IP地址
127.0.0.1
-
4.2 获取请求头的数据(请求首部字段):
- String getHeader(String name):通过首部字段的名称获取对应的值
- Enumeration getHeaderNames() :获取所有首部字段的名称,封装在Enumeration对象中,通过hasMoreElements()方法来判断是否还有下一个元素,nextElement()方法用来获取下一个元素名称
-
4.3 获取请求体数据(报文主体):
-
只有POST请求方式才有报文主题,GET请求方式没有报文主体,只有报文首部和空行(\r\n)
-
分两个步骤:
- 先获取流对象
- BufferedReader getReader():获取输入字符流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据(图片啥的只能用字节流来传输数据,而普通字符的话,都可以使用。在UTF-8编码中,一个中文字符占3个字节,在GBK中一个中文字符占2个字节,所以用字节流来传输数据要注意编码格式)
-
在从流中获取数据
username=linzeliang&password=123456
-
-
4.4 获取请求参数的通用方法
- 如果是get请求方法,参数名及值存储在URI中,那么可以通过参数名获取值;如果是post方法,参数名及值是存储在报文主体中的,那么也可以通过参数名来获取值、
- String getParameter(String name):通过参数名获取值
- String[] getParameterValues(String name):通过参数名获取值组成的数组,通常是html中的checkbox复选框,一个参数名可以有多个值
- Enumeration<String[]> getParameterNames():获取所有的参数名,封装为Enumeration对象
- Map<String, String[]> getParameterMap():获取所有的参数名称及其对应的值(一个参数名对应值可以是多个)的Map集合
5.Request对象接收的参数是乱码?
5.1 自从Tomcat5以来,GET方式和POST方式提交的请求,tomcat会采用不同的方式来处理编码.在Tomcat8中,使用GET请求方法的乱码问题已经解决了,但是,如果你用的是POST请求方法来获取数据,那么会得到乱码,因为如果未设置编码的话,则默认采用ISO-8859-1编码。所以我们可以通过手动设置编码来解决这个问题:
在doPost方法内部行先写入这一个代码request.setCharacterEncoding("UTF-8")
,同理,如果要输出到页面,也应该先设置一下response的编码response.setCharacterEncoding("UTF-8")
5.2 如果GET请求方式也出现乱码了怎么办呢?
GET方式不同,它的数据是从消息行带过去的,没有封装到request对象里面,所以使用request设置编码是无效的。我们既然知道Tomcat默认的编码是ISO 8859-1,那么GET方式由消息体带过去给浏览器的时候肯定是用*ISO 8859-1编码了。
有两种方法:
-
dfdf
-
我们在Tomcat服务器的配置下改成UTF-8的编码,那么就解决服务器在解析数据的时候造成乱码问题了,在8080端口的Connector上加入URIEncoding=“UTF-8”,设置Tomcat的访问该端口时的编码为UTF-8,从而解决乱码,这种改法是固定使用UTF-8编码的
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
6.请求转发:
请求转发:一种在服务器内部的资源跳转方式
-
通过request.getRequestDsipatcher(String path) 获取请求转发对象
-
然后通过这个RequestDispatcher对象来进行转发(Servlet的请求转发有3种方式):
-
forward:是指转发,只包含一次请求,将当前request和response对象保存,只能转发到服务器当前内部资源种(其他的Servlet对象),地址栏的地址不会发生改变。
-
redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。
-
include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。
-
7. 共享数据
- 域对象:一个拥有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对