1_response操作响应正文(重点)
基本概念:响应正文就是浏览器显示的主体内容
常用方法:response.getWriter().write();
操作响应正文
注意:服务器向浏览器传递数据的时候不是直接传递,而是通过字节,Tomcat服务器编码为iso8859-1,而浏览器的解码格式为utf-8,因此会出现乱码情况
因此,操作响应正文中文乱码问题,不仅要告诉服务器编码格式,也要告诉浏览器解码格式,如下:
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格式解码响应正文
02_request操作请求行
常用方法:
//获取请求路径
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求方式
String method = request.getMethod();
System.out.println(method);
//获取请求ip
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
//获取请求端口
int port = request.getLocalPort();
System.out.println(port);
//获取请求网址后的请求参数
String queryString = request.getQueryString();
//在网址后的请求参数,如果要使用,需要做字符串的拆分!!
System.out.println(queryString);
//SpringMVC:前后端交互使用的是json字符串,json解析 --> java对象!!
03_request操作请求头getHeader()
:获取指定请求头的值
4_request操作请求参数(重点)
请求正文:post+请求参数
请求参数:不管是get请求 还是 post请求 都有!!!
常用方法
- getParameter
- 获取指定请求参数值
- getParameterNames
- 获取所有请求参数名称
- getParameterValues(String parameterName)
- 获取指定请求参数所有值
- getParameterMap
- 键,获取所有请求参数名称 , 相当于getParameterNames方法
- 值,获取指定请求参数所有值,相当于getParameterValues方法
//获取指定参数值
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);
}
5_请求参数中文乱码之post
本质:请求正文中的中文参数乱码
浏览器的编码和服务器的解码不一致导致的
解决方案 1:
告诉服务器应该以utf-8解码请求正文
request.setCharacterEncoding("utf-8")
解决方案 2:
逆向,将乱码以iso8859-1解码成字节,再将字节以utf-8解码成字符串
username = new String(username.getBytes("iso8859-1"),"utf-8");
注意:将tomcat容器的URIEncoding=“utf-8”,对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!
6_请求参数中文乱码之get
get方式没有请求正文,所以通过以上方式不能解决,本质为Query String中的中文参数乱码
解决方案 1:逆向,将乱码以iso8859-1解码成字节,再将字节以utf-8解码成字符串
username = new String(username.getBytes("iso8859-1"),"utf-8");
解决方案 2:
修改tomcat容器的URIEncoding=“utf-8”
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="utf-8"
redirectPort="8443" />
修改方式:
验证是否修改成功:
注意:request.setCharacterEncoding(“utf-8”)对get请求无效,告诉服务器应该以utf-8来解码请求正文,跟Query String 没有关系!7_请求参数中文乱码终极解决方案
方案:tomcat8.5
相当于是tomcat7.0修改了URIEncoding=“utf-8”–就解决了get请求参数中文乱码问题
request.setCharacterEncoding(“utf-8”)–就解决了post请求参数中文乱码问题
8_request操作请求转发
请求转发: 服务器中,从一个资源跳转到另外一个资源
代码:
request.getRequestDispatcher("转发路径").forward(request,response);
流程:
- 浏览器发起请求,请求Demo01Servlet
- Demo01Servlet,请求转发到Demo02Servlet
- 在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
注意事项: 转发只有一次请求
9_请求转发和重定向的区别
- 请求次数
- 重定向有2次请求
- 转发有1次请求
- 跳转区别
- 重定向既可以站内资源进行跳转,站外资源也可以进行跳转
- 转发只能站内资源进行跳转
- 路径区别
- 要转发的资源的相对路径无区别
- 要转发的资源的绝对路径有区别
- 重定向,是先从项目开始找,再找资源
- 转发,是直接从项目中找资源
10_request作为域对象
域对象: 可以存储数据的对象
回顾:ServletContext域对象的作用范围–
不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据!
request域对象的作用范围
- request对象的生命周期
- 发起请求时,request初始化
- 响应时,request销毁
- request域对象的作用范围在一次请求中!
request在重定向和转发中使用!
- 重定向中不能使用request域对象
- 转发中可以使用request域对象