【响应对象-Response对象】
响应行:
Response设置状态码:
响应头:
Response设置响应头:
* 一个key对应一个value
* 一个key对应多个value
响应体:
Response设置响应体:
【response处理中文乱码】
字节流:
设置浏览器默认打开编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
字符流:
设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
设置浏览器默认打开的编码.
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相当于上面两句
【文件下载】
一种:超链接方式.(不推荐)
* <ahref=”aa.zip”>下载</a>
* <ahref=”1.jpg”>下载</a>
二种:手动编码方式完成文件下载.
* 设置两个头和一个流:
*Content-Type:文件MIME的类型.
*Content-Disposition:
* 文件的输入流:
代码实现:
1.在页面中提供一组下载的链接:
response.getWriter().println("<h2>手动编码方式下载</h2>");
response.getWriter().println("<ahref='/WEB10/downloadServlet?filename=a.bmp'>a.bmp</a><br/>");
response.getWriter().println("<ahref='/WEB10/downloadServlet?filename=WEB01.zip'>WEB01.zip</a>");
2.编写DownloadServlet:
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
/**
* 接收参数:
* 设置两个头和一个流:
* 文件输入流和响应的输出流对接:
*/
// 接收参数:get乱码 new String("中文".getBytes("ISO-8859-1"),"UTF-8");
String filename =request.getParameter("filename");
System.out.println(filename);
// 设置两个头和一个流:
// 设置Content-Type头
String fileType =this.getServletContext().getMimeType(filename);
response.setContentType(fileType);
// 设置Content-Disposition:
response.setHeader("Content-Disposition","attachment;filename="+filename);
// 设置文件的输入流:
String path =this.getServletContext().getRealPath("/download/"+filename); //
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b,0, len);
}
is.close();
}
中文文件名下载:
中文文件在不同的浏览器中编码方式不同:
IE :URL编码
Firefox :Base64编码
if(agent.contains("Firefox")){
// 火狐浏览器
filename= base64EncodeFileName(filename);
}else{
//IE,其他浏览器
filename= URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(StringfileName) {
BASE64Encoder base64Encoder = newBASE64Encoder();
try {
return"=?UTF-8?B?"
+new String(base64Encoder.encode(fileName
.getBytes("UTF-8")))+ "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
thrownew RuntimeException(e);
}
}
【请求对象-request对象】
获得客户机信息:
* getMethod(); ---获得请求方式.
* getQueryString(); ---获得请求路径后的参数.
* getRemoteAddr(); ---获得客户机的IP地址.
* getRequestURI(); ---获得请求的路径
* getRequestURL(); ---获得请求的路径
* getContextPath(); ---获得工程名
获得请求头
* request.getHeader(“User-Agent”);
* request.getHeader(“Referer”);
请求参数:
用来作为域对象存取值:
参数接收中的乱码处理.
POST乱码处理:
* <form method=”post”>的时候,这种提交才是POST提交.其他的都是get.
* POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.
* 处理方式:设置request的缓冲区的编码.
* request.setCharacterEncoding(“UTF-8”);
GET方式乱码处理:
* GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码.
* 处理方式:
* 修改服务器提交的编码.
* 采用URLEncoder 和URLDecoder类对中文进行编码和解码.
* 使用String类的构造方法:
username = newString(username.getBytes("ISO-8859-1"),"UTF-8");
转发和重定向的区别:
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(Stringpath).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.