request对象和response对象
一,原理
- 1,request和response对象是由服务器创建的,我们来使用他们
- 2,request对象是用来获取请求消息,response对象是设置响应消息
二,request对象的继承体系结构
- servletrequest --接口
| 继承 - HTTPservletrequest --接口
| 实现 - org.apache.catalina.connector.requestfacade 类(tomcat)
三,request功能:
- 1,获取请求消息数据
-
1,获取请求行数据
GET /test/ldemo1?name=zhangsan HTTP/1.1
方法:
1,获取请求方式:GET
string getmethod()
2,获取虚拟目录:/test (重要,以后经常用到)
string getcontextpath()
3,获取servlet资源路径
string getservletpath()
4,获取get方式请求的参数:name=zhangsan
string getQeurystring()
5,获取URI:/test/demo1 (重要,常用)
string getrequestERI(): /test/demo
URI:统一资源标识符
stringbuffer getrequestURL():http://localhost/test/demo1
URL:统一资源定位符
6,获取协议及版本信息
string getprotocol()
7,获取客户机的IP地址
string getremoteaddr() -
2,获取请求头数据
方法:
1,string getheader(string name):通过请求头的名称来获取请求头的值
2,getheadernames()获取所有的请求头名称 -
3,获取请求体数据
1,请求体:只有post请求方式,才有请求体,在请求体种封装了post请求的请求参数。
步骤:
1,获取流对象
bufferedreader getreader():获取字符输入流,只有操作字符数据
servletinputstream getinputstream():获取字节流,可以操作所有数据类型数据
2,再从流对象中获取数据 -
4,其他功能
1,获取请求参数的通用方法:不论是get还是post
(1),string getparameter(string name):根据参数名获取值
(2),string[] getparametervalues(string name):根据参数名称获取参数值的数组
(3),Enumeration getparameternames():获取所有的请求的参数名称
(4),Map<string string []> getparameterMap():获取所有参数的map集合
中文乱码问题:
get方式:tomcat8已经解决了
post方式:会乱码;
解决方式:设置request的编码;request.setcharacterencoding(“utf-8”)2,请求转发:一种在服务器内部的资源跳转方式
(1),步骤:
1,通过request对象获取请求转发的对象:requestdispatcher getrequestdispatcher(string path)
2,使用requestdispatcher对象进行转发:forward(servletrequest res,servletresponse resp)(2),特点:
1,浏览器地址栏不发生改变
2,只能转发当前的服务器内部资源
3,转发是一次请求3,数据共享
域对象:一个有作用范围的对象,可以在范围内共享资源数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
1,void setattribute(string name,object obj):存储数据
2,object getattibute(string name):通过键获取值
3,void removeattribute(string name):通过键移出键值对4,获取servletcontext
(1),代表整个web应用,可以和程序的容器(服务器)来通信
servletcontext getservletcontext()
获取方式:request.getservletcontext();(2),功能:
获取MIME类型: string getmimetype(string file)
域对象:共享数据 ;
获取文件真实(服务器)路径:string getrealpath(string path)
-
比较重要的测试代码:
1,getheadernames()获取所有的请求头名称
Enumeration<String> headers = req.getHeaderNames();
while (headers.hasMoreElements()) {
String string = headers.nextElement();
String value = req.getHeader(string);
System.out.println(string+": "+value);
}
打印结果:
host: localhost:8080
connection: keep-alive
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
cookie: JSESSIONID=6E7FC596F895D533CB872A38F2E173AA; Hm_lvt_f1ca44b62370e4b7dc11d5937e51c2d6=1582686890
2,Map<string string []> getparameterMap():获取所有参数的map集合
//获取参数 的map集合
req.setCharacterEncoding("utf-8");
Map<String, String[]> map = req.getParameterMap();
//遍历
Set<String> keySet = map.keySet();
for (String keyname : keySet) {
//获取键获取值
String[] key = map.get(keyname);
System.out.println(keyname);
for (String values : key) {
System.out.println(values);
}
System.out.println("----------------");
}
打印结果
username
wangwu
----------------
password
1234
----------------
hobby
game
study
----------------
3,Enumeration getparameternames():获取所有的请求的参数名称
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String name = parameterNames.nextElement();
String[] parameterValues2 = req.getParameterValues(name);
for (String string : parameterValues2) {
System.out.println(string);
}
}
打印结果同上
4,数据共享,使用requestdispatcher对象进行转发:forward(servletrequest res,servletresponse resp)
登陆的案例
User login = userDao.login(loginUser);
if (login!=null) {
req.setAttribute("login", login);
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/successservlet");
requestDispatcher.forward(req, resp);
} else {
req.getRequestDispatcher("/failservlet").forward(req, resp);
}
四,response对象
- 1,功能:设置响应消息
1,设置响应行
格式:HTTP/1.1 200 ok
设置状态码:setstatus(int sc)
2,设置响应头:setheader(string name,string value)
3,设置响应体:
使用步骤:
1,获取输入流
字符输出流:printwriter getwriter()
字节输出流:servletoutputstream getoutputstream()
2,使用输出流,将数据传输给客户端浏览器
中文乱码问题:
1,printwriter pw = response。getwriter():获取流的默认编码是ISO-8859-1
2,设置该流的默认编码
3,告诉浏览器响应体使用的编码
在获取流之前进行设置
response.setcontenttype(“text/html;charset=utf-8”)
补充说明:
重定向与转发的区别(我面试的经历):
重定向:redirect
1,地址栏发生变化
2,可以访问其他站点的资源
3,重定向是两次请求
转发:forward
1,地址栏不发生变化
2,抓发只能访问当前服务器内部的资源
3,转发是一次请求
先整理到这吧。。。。。。