千锋逆战班学习第55天
千锋逆战班学习第55天
努力或许没有收获,但不努力一定没收获,加油。
今天我学习了request与response。
response操作响应正文(重点)
- 响应正文
- 就是浏览器显示的主体内容
- 常用方法
- response.getWriter().write():操作响应正文
- 注意事项
- 响应正文中文乱码
- 本质原因,服务器的编码和浏览器的解码,格式不同!
- setCharacterEncoding(“utf-8”):
- 告诉服务器,应该以utf-8格式编码响应正文
- setHeader(“Content-Type”,“text/html;charset=utf-8”):
- 告诉浏览器 , 响应正文是文本+html标签,应该以utf-8格式解码响应正文
- setContentType(“text/html;charset=utf-8”)
- 告诉服务器,应该以utf-8格式编码响应正文
- 告诉浏览器 , 响应正文是文本+html标签,应该以utf-8格式解码响应正文
- 响应正文中文乱码
request操作请求行
- 常用方法
- getRequestURI
- 获取请求路径
- getMethod
- 获取请求方式
- getRemoteAddr
- 获取请求ip
- getLocalPort
- 获取请求端口
- getQueryString
- 请求网址"?"后面的路径
- getRequestURI
request操作请求头
- getHeader()
- 获取指定请求头的值
request操作请求参数(重点)
- 请求正文
- post+请求参数
- 请求参数
- 不管是get请求 还是 post请求 都有!!!
- 常用方法
- getParameter
- 获取指定请求参数值
- getParameterNames
- 获取所有请求参数名称
- getParameterValues(String parameterName)
- 获取指定请求参数所有值
- getParameterMap
- 键,获取所有请求参数名称 , 相当于getParameterNames方法
- 值,获取指定请求参数所有值,相当于getParameterValues方法
- getParameter
- 代码实现
//获取指定参数值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username : " + username + " , password : " + password);
System.out.println("---------------");
//获取所有请求参数名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement();
String parameterValue = request.getParameter(parameterName);
System.out.println("name : " + parameterName + " , value : " + parameterValue);
}
System.out.println("---------------");
//获取指定请求参数所有值
String[] usernames = request.getParameterValues("username");
System.out.println(usernames[0]);
String[] hobbys = request.getParameterValues("hobbys");
for (String hobby : hobbys) {
System.out.println(hobby);
}
System.out.println("---------------");
//获取请求参数对应的map :Map(String,String[])
//键:请求参数名称 相当于 getParameterNames
//值:一组请求参数值 相当于 getParameterValues
Map<String, String[]> parameterMap = request.getParameterMap();
Set<Map.Entry<String, String[]>> entrySet = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entrySet) {
//键 - 请求参数名称
String parameterName = entry.getKey();
//值 - 一组请求参数值
String[] values = entry.getValue();
StringBuffer valueStr = new StringBuffer();
for (String value : values) {
valueStr.append(value + " ");
}
System.out.println("参数名称 : "+ parameterName + " , 参数值 : " + valueStr);
}
请求参数中文乱码之post
- 本质
- 请求正文中的中文参数乱码
- 解决方案
- request.setCharacterEncoding(“utf-8”)
- 告诉服务器应该以utf-8解码请求正文
- 逆向,先编码在解码
- 先将乱码字符串以iso8859-1编码成字节
- 将字节以utf-8解码成字符串
username = new String(username.getBytes(“iso8859-1”),“utf-8”);
- request.setCharacterEncoding(“utf-8”)
- 注意事项
- 将tomcat容器的URIEncoding=“utf-8”,对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!
请求参数中文乱码之get
- 本质
- Query String中的中文参数乱码
- 解决方案
- 逆向,先编码在解码
- 先将乱码字符串以iso8859-1编码成字节
- 将字节以utf-8解码成字符串
username = new String(username.getBytes(“iso8859-1”),“utf-8”);
- 修改tomcat容器的URIEncoding=“utf-8”
- 逆向,先编码在解码
- 注意事项
- request.setCharacterEncoding(“utf-8”)对get请求无效,告诉服务器应该以utf-8来解码请求正文,跟Query String 没有关系!
请求参数中文乱码终极解决方案
- 方案
- tomcat8.5
- 相当于是tomcat7.0修改了URIEncoding=“utf-8”
- 就解决了get请求参数中文乱码问题
- request.setCharacterEncoding(“utf-8”)
- 就解决了post请求参数中文乱码问题
- tomcat8.5
request操作请求转发
- 请求转发
- 服务器中,从一个资源跳转到另外一个资源
- 流程
- 浏览器发起请求,请求Demo01Servlet
- Demo01Servlet,请求转发到Demo02Servlet
- 在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
- RequestDispatcher dispatcher = request.getRequestDispatcher(“demo09”);
- dispatcher.forward(request,response)
- 注意事项
- 转发只有一次请求
请求转发和重定向的区别
- 请求次数
- 重定向有2次请求
- 转发有1次请求
- 跳转区别
- 重定向既可以站内资源进行跳转,站外资源也可以进行跳转
- 转发只能站内资源进行跳转
- 路径区别
- 要转发的资源的相对路径无区别
- 要转发的资源的绝对路径有区别
- 重定向,是从先从项目开始找,再找资源
- 转发,是直接从项目中找资源
request作为域对象
- 域对象
- 可以存储数据的对象
- 回顾ServletContext域对象的作用范
- 不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据!
- request域对象的作用范围
- request对象的生命周期
- 发起请求时,request初始化
- 响应时,request销毁
- request域对象的作用范围在一次请求中!
- request对象的生命周期
- request在重定向和转发中使用!
- 重定向中不能使用request域对象