一。HttpServletResponse接口

问题:
在使用Requset对象获取了请求数据并进行处理后,处理结果如何显示到浏览器中呢?
解决:
使用Response对象
解释:
服务器在调用指定的Servlet进行请求处理的时候,会给Servlet的方法传递两个实参request和response。其中request中封存了请求相关的请求数据,而response则使用来进行响应的一个对象

1.介绍:


1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar

2)HttpServletResponse接口实现类由Http服务器负责提供

3)HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器

4)开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】

2.作用:


用来响应数据到浏览器的一个对象

3.主要功能:

1)将执行结果以二进制形式写入到【响应体】

//向响应体写入字符串
String s1=”Hello”;
/
通过响应对象,将我们的执行结果写到响应体中
我们的Tomcat实际上是有一个输出流
它可以用这个输出流把文件中的内容和文件中的命令以二进制的形式写到响应体中
如果我们能够拿到这个输出流,我们也可见向响应体中写入数据
/
resp.setContentType(“text/html;charset=utf-8”);
//1、通过响应对象,向Tomcat索要输出流
PrintWriter writer = resp.getWriter();
//2、通过输出流,将执行结果以二进制形式写入到响应体中
writer.write(s1);
//使用完之后这个输出流需不要关闭,因为这是你向Tomcat借来的输出流
//如果写入的是数字会怎么样呢
int money=50;
writer.write(money);
/
此时浏览器显示的是2,并不是50
问题原因:
writer.write()方法可以将【字符】、【字符串】、【ASCII码】写入到响应体
【ASCII码】:a—->97
【ASCII码】:50—->2
当我们的write里面参数是一个数字的时候,它会将这个数字作为ASCII码
解决方法:
在实际开发过程中,都是通过print()这个方法将真是数据写入到响应体中
writer.print()方法可以将任何类型的数据写入到响应体中
/
writer.print(50);
//此时浏览器正常显示50数值


//怎么使浏览器分行展示内容
//要使用HTML标签命令
String s2=”Java
Mysql
HTML”;
writer.print(s2);
/
问题描述:
打印结果:Java
Mysql
HTML
此时我们浏览器在接收到响应结果时将

当做字符串给打印出来了,并没有当做HTML标签命令而执行
问题原因:
设置响应头中【content-type】属性值,
从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
浏览器在接收响应包之后,根据【响应头中content-type】属性的值
采用对应的【编译器】对【响应体中二进制内容】进行编译处理
在默认情况下:content-type属性的值“text”(content-type=”text”)
此时浏览器将会采用【文本编译器】对响应体二进制数据进行解析
文本编译器没有将二进制解析成命令的功能,只能解析成英,中,日,法。。。字母
解决方法:
**
一定要在得到输出流之前*,通过响应对象对响应头中content-type属性进行一次重新的赋值
用于指定浏览器采用正确编译器
因为我们写入的内容包含文本和html命令
resp.setContentType(“text/html”);
表示使用文本编译器和html命令编译器对响应体内容进行相关的解释
/


//向响应体写入中文
String s3=”法外狂徒张三”;
writer.write(s3);
writer.print(s3);
//此时浏览器显示中文出现乱码
/

问题原因:
对于文字内容,浏览器需要通过响应头中的content-type中的一个charset值
对文本内容进行解析,默认charset字符集是ISO-8859-1
这个字符集是偏东欧语系的字符集,靠这种字符集对亚洲文字进行解释,他是解释不了的
解决方法:
设置响应头中【content-type】属性值,
从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
我们可以使用utf-8万国码,它可以对当今世界上所有的国家语言进行解释
//避免乱码,*在获取写入流之前*,设置响应编码格式
//以下前两种方式不仅告诉浏览器字符集,还告诉浏览器我的数据格式是什么,就算是一句话,也可以是页面
//方式一
resp.setHeader(“content-type”,”text/html;charset=utf-8”);
//方式二
resp.serContentType(“text/html;charset=utf-8”);
//方式三
resp.setCharacterEncoding(“utf8”);
*/
//doGet方法执行完毕
//Tomcat将响应包推送给浏览器,浏览器拿到响应包开始解析。

2)设置响应头中属性

//在响应头中添加响应信息,同键会覆盖
resp.setHeader(“key”,”value”);
//在响应头中添加响应信息,同键不会覆盖
resp.addHeader(“key”,”value”);
/
设置响应头中【content-type】属性值,
从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
/
//方式一
resp.setHeader(“content-type”,”text/html;charset=utf-8”);
//方式二
resp.serContentType(“text/html;charset=utf-8”);

3)设置响应头中【location】属性,将一个请求地址赋值给location.从而控制浏览器向指定服务器发送请求

String url=”http://www.baidu.com“;
//通过响应对象,将地址赋值给响应头中location属性
//方式一:设置响应头属性
resp.setHeader(“location”,”http://www.baidu.com“);
//方式二:重定向也会改变location属性的值
resp.sendRedirect(url);

/
浏览器在接受到响应包之后
如果发现响应头中存在location属性
它将自动通过地址栏,向location指定的网站发生请求
可以使用sendRedirect()方法远程控制浏览器请求行为
请求行为有三要素
【请求地址、请求方式、请求参数】
请求参数:String url=”http://www.baidu.com”?key=value&key=value…;
/

4)设置响应状态码

resp.sendError(“404”,”sorry”);

二。HttpServletRequest接口

问题:
浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。那么服务器接受到请求的数据该怎么存储呢?不但要存,而且要保证完成性。
解决:
使用对象进行存储,服务器每接受一个请求,就创建一个对象专门存储此次请求的请求数据。
实现:
requsert对象
解释:
服务器接收到浏览器的请求后,会创建一个Request对象,对象中存储了此次请求相关的请求数据。服务器在调研Servlet时会将创建的Request对象作为实参传递给Servlet的方法(谁调用这个方法,谁传入实参)。比如service方法

注意:
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法

1.介绍:

1)HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar

2)HttpServletRequest接口实现类由Http服务器负责提供

3)HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息

4)开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】

2.作用:


1)reques对象中封存了当前请求的所有数据

3.使用

1)可以读取Http请求协议包中【请求行】信息

//设置字符集,解决请求乱码问题
//此方法只适用于post请求方法,因为get请求参数在url后面
req.setCharacterEncoding(“utf-8”);
//查看远程客户端的IP 谁访问我的资源,显示谁的
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);//127.0.0.1

//1、获取请求方式
String method = req.getMethod();
System.out.println(method);
//2、获取请求URL和URI
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
String requestURI = req.getRequestURI();
System.out.println(requestURI);
//3、获取协议信息
String scheme = req.getScheme();
System.out.println(scheme);

2)可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息

//1、获取请求头中指定属性值
//如果想要获取请求头中不存在的数据,返回的是null
String host = req.getHeader(“Host”);
System.out.println(host);
//2,获取请求头中所有属性的枚举
Enumeration headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){//测试此枚举是否包含更多的元素
String str = headerNames.nextElement();//降下一个属性名称赋值给一个变量
System.out.println(str+”:”+req.getHeader(str));//通过变量存储的属性名称打印值
}

3)获取用户数据

//3、获取用户数据:一键对应一值
String name = req.getParameter(“name”);
System.out.println(name);
//4、获取用户数据:一键对应多值
String[] hobbies = req.getParameterValues(“hobby”);
if (hobbies != null){
for (String str : hobbies){
System.out.println(str);
}
}
//5、获取所有的用户数据以及对应的值
Map parameterMap = req.getParameterMap();
Set strings = parameterMap.keySet();
for(String str:strings){
System.out.println(str+”=”+ Arrays.toString(parameterMap.get(str)));
}
//6、获取所有的用户请求数据的键的枚举集合,需要提交的name值是程序员必须知道的
//暂时不演练req.getParameterNames();

4)可以代替浏览器向Http服务器申请资源文件调用

//1、申请资源文件调用(内部转发)
/
使用内部转发实现界面之间的跳转
1.url地址是不会发生变化的
2.可以传递参数
3.只能转发到项目内部资源,无法访问外部资源
4.只发送一次请求
/
req.getRequestDispatcher(“req1.html”).forward(req,resp);
//获取表单传入某个实现的虚拟路径名
String contextPath = req.getContextPath();
System.out.println(contextPath);
//获取表单传入某个实现类的别名
String servletPath = req.getServletPath();
System.out.println(servletPath);
// 获取get请求的所有参数,也就是URL后面的信息样式
String queryString = req.getQueryString();
System.out.println(queryString);//name=zhang&phone=123&id=666&sex=%E7%94%B7&hobby=%E8%B6%B3%E7%90%83&hobby=%E8%88%9E%E8%B9%88

5)解决请求乱码问题
1)使用String进行数据重新编码
value = new String(uname.getBytes(“iso8859-1”),”utf-8”);
2)设置请求编码格式
req.setCharacterEncoding(“utf-8”);
此方法只适用于post请求方法,因为get请求参数在url后面
3)使用公共配置:
get方法还需要用在conf目录中修改server.xml文件,在Connerctor标签中增加属性useBodyEncodingForURI=”true”

三。请求对象和响应对象生命周期


1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】

2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行

3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁

【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
【请求对象】和【响应对象】相当于用户在服务端的代言人