Response/Request
一、 乱码问题
1. 出现乱码的原因
1) 在计算机中数据以二进制的形式进行存储的, 数据的传输也是通二进制的形式
2)需要存字符,会出现字符与字节之间的转换 (输入字符 读到的字符)
3) 字符和字节之间如何实现转换? 都是通过查码表
4) 字符到字节是编码,字节到字符是解码, 编码和解码用到了不同码表就会出现乱码问题
2. 解决乱码
1) 拿到乱码基本上都是由于解码错误导致的, 解决办法,重新编码再解码
2) 以后将文件交给解析器,出现乱码,首先想到是否通知别人文件的编码格式
二、 Response 对象
1. response getWriter方法获得字符流,用于向浏览器输出字符数据
中文乱码问题
2. 文件下载
文件名中文乱码问题
由于文件名是跟着 content-disposition 头发送给浏览器的
凡是http头的数据都会经过 url 编码, 编成全世界通用的符号,这样传输过程中才不会乱码
3. 请求重定向
发送 302 状态码和 location 头
ie向浏览器发送了两次请求 第一次直接请求资源,第二次重定向的页面
地址栏是有变化
4. getWriter 和 getOutputStream 不能同时使用,有冲突
response的流我们不用关闭,交给web容器去管理
三、 Request 对象
1. request 帮助我们取获取 ie 浏览器发送给 服务器的请求消息 (请求行 消息头 消息体)
2. request 获得请求消息
3. request 获得请求参数 做验证
// 根据指定的参数名 获得参数值
String name = request.getParameter("name");
// System.out.println(name);
// 根据指定的参数名 获得所有的参数值
String[] preference = request.getParameterValues("preference");
// 迭代数组会有空指针异常, 如何杜绝
for(int i=0; preference!=null&&i<preference.length; i++)
System.out.println(preference[i]);
System.out.println("---------------------------------");
// 获得所有的参数名,
// 写个通用的方法,将表单的参数封装到bean
// 遍历请求参数 name作为bean的属性名 value作为bean的属性值, 通过反射 批量给javabean对象赋值
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()) {
name = (String) e.nextElement();
String value = request.getParameter(name);
System.out.println(name + "=" + value);
}
4. request 中文参数乱码问题
表单提交post方式下 : request.setCharacterEncoding(“utf-8”);
指定处理消息体的解码方式
表单提交get方式下 :
1) 手动解决乱码问题
byte[] bytes = username.getBytes("iso-8859-1");
String str = new String(bytes, "utf-8");
2) 在 %tomcat%\conf\server.xml 中找到当前连接器元素 Connector
配置URIEncoding 属性 它用于指定tomcat对消息头的url解码方式
3) 配置useBodyEncodingForURI 属性
用于让tomcat按照处理消息体的编码方式处理消息头
超链接提交参数 : 也是使用 get 方式提交,和表单的区别是,表单提交ie自动进行url编码
超链接提交,ie不进行url编码,此时我们需要将超链接中的中文参数手动进行url编码
在服务器端的处理方式和 表单 get 方式的处理一样
5. 请求转发
Servlet 负责对用户的请求做处理,处理完的结果交给jsp来做显示
获得 RequestDispatcher 对象做请求转发
请求转发的时候需要将处理结果存入 request 域 带给 jsp
请求转发的时候, web容器会清空response中的数据
转发后也无法向response输入数据
在Servlet中不输出任何数据,所有数据显示的事情都交给jsp
mvc 的过程
1) 用户发送请求(提交表单)
2) Servlet 做处理, 将用户名和密码封装到 javabean(User)对象
3) 将 user 对象存入request域
4) 请求转发给 jsp
5) jsp 页面中 从request域取出数据 做显示
面试题: 请求转发和请求重定向的区别?
1) 请求重定向地址栏有变化 请求转发地址栏无变化
2) 请求重定向客户端向服务器发送两次请求 请求转发发送一次请求
3) 应用场景:
一件事情做完了,应该做第二件事情了,就请求重定向 (用户登陆、购物)
Servlet处理完了,让jsp做显示,用请求转发(mvc设计模式)
web应用中的路径怎么写?
读取web中的文件 用 context 读取,路径要写相对于web应用的路径 可以加’/’
严禁用绝对路径,通通以”/”开头
原则: 就看路径是给浏览器用的还是给服务器用的,
给浏览器用的,要加上web应用的名称
给服务器用的,斜线即表示当前web应用
1) 请求转发 /表示web应用, 不用加web应用的名称 /a.jsp
2) 请求重定向 路径给浏览器,加上web应用名称 /day06/a.jsp
3) 超链接 路径给浏览器用的,/day06/a.jsp
4) 表单的action提交 路径给浏览器用的,/day06/a.jsp
5) img标签的src属性 路径给浏览器用的,/day06/a.jsp
记住: 路径以“/”开头,请求转发不加web应用名,其他的都要加