第10章WEB10-requet&response篇 今日任务 Ø 登录系统后完成文件下载 Ø 商城系统注册功能. 1.1 案例一:完成登录用户对他提供文件的下载的功能.1.1.1 需求:之前的案例中已经完成的了一个登录的功能,登录失败后回到登录页面.登录成功以后,服务器提供多个文件的下载的链接,点击链接可以完成文件的下载的功能. 1.1.2 分析:1.1.2.1 技术分析:【响应对象-Response对象】 Ø 响应行: Response设置状态码:Response设置响应头: * 一个key对应一个value 【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");相当于上面两句 【文件下载】 一种:超链接方式.(不推荐) * <a href=”aa.zip”>下载</a> * <a href=”1.jpg”>下载</a> 二种:手动编码方式完成文件下载. * 设置两个头和一个流: * Content-Type:文件MIME的类型. * Content-Dispostion: * 文件的输入流: 1.1.1.1 步骤分析:Ø 之前的登录案例已经存在: Ø 登录成功跳转的页面上提供一组链接: Ø 当点击下载的链接之后,提交到Servlet: Ø 设置两个头和一个流: 1.1.1 代码实现:[AppleScript] 纯文本查看 复制代码 1.在页面中提供一组下载的链接:
response.getWriter().println("<h2>手动编码方式下载</h2>");
response.getWriter().println("<a href='/WEB10/downloadServlet?filename=a.bmp'>a.bmp</a><br/>");
response.getWriter().println("<a href='/WEB10/downloadServlet?filename=WEB01.zip'>WEB01.zip</a>");
2.编写DownloadServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, 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();
}
1.1.1 总结:1.1.1.1 中文文件名下载:
[AppleScript] 纯文本查看 复制代码 中文文件在不同的浏览器中编码方式不同:
IE :URL编码
Firefox :Base64编码
if(agent.contains("Firefox")){
// 火狐浏览器
filename = base64EncodeFileName(filename);
}else{
// IE,其他浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
1.1 案例二:网站的注册的功能的实现:1.1.1 需求:在商城的网站上完成一个注册的功能: 1.1.1 分析:1.1.1.1 技术分析【请求对象-request对象】 Ø 获得客户机信息: * getMethod(); ---获得请求方式. * getQueryString(); ---获得请求路径后的参数. * getRemoteAddr(); ---获得客户机的IP地址. * getRequestURI(); ---获得请求的路径 * getRequestURL(); ---获得请求的路径 * getContextPath(); ---获得工程名 Ø 获得请求头 * request.getHeader(“User-Agent”); * request.getHeader(“Referer”); 1.1.1.1 步骤分析:Ø 步骤一:设计注册页面: Ø 步骤二:点击页面中的注册的按钮:提交到Servlet中. Ø 步骤三:在Servlet中接收参数: Ø 步骤四:封装实体中. Ø 步骤五:调用业务层.处理数据. Ø 步骤六:根据处理的结果做出响应. 1.1.1 代码实现:
1.创建数据库 create database web10; use web10; create table user( id int primary key auto_increment, username varchar(20), password varchar(20), email varchar(20), name varchar(20), sex varchar(10), birthday date, hobby varchar(50) ); 2.接收参数: * request.getParameter(String name); * request.getParameterValues(String name); * request.getParamaterMap(); 3.参数接收中的乱码处理. POST乱码处理: * <form method=”post”>的时候,这种提交才是POST提交.其他的都是get. * POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1. * 处理方式:设置request的缓冲区的编码. * request.setCharacterEncoding(“UTF-8”); GET方式乱码处理: * GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码. * 处理方式: * 修改服务器提交的编码. * 采用URLEncoder 和 URLDecoder类对中文进行编码和解码. * 使用String类的构造方法: username = new String(username.getBytes("ISO-8859-1"),"UTF-8"); System.out.println(username); 4.数据的封装:BeanUtils.(内省技术) 1.1.1 总结:1.1.1.1 转发和重定向的区别:【重定向】 response.sendRedirect(String path); -- 完成重定向 【转发】 request.getRequestDispatcher(String path).forward(request,response); 【区别】 1.转发的地址栏不变的.重定向的地址栏发生变化的. 2.转发是一次请求一次响应,重定向是两次请求两次响应. 3.request域对象存取的值在转发中是有效的,在重定向无效的. 4.转发的路径不需要加工程名.重定向的路径需要加工程名. 1.1.1.2 使用转发和重定向对登录的功能优化:使用request域保存一个值:在一次请求范围内有效的. 登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}
推荐阅读
|