A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1.1 上次课内容回顾:
[AppleScript] 纯文本查看 复制代码
HTTP协议:
* HTTP协议请求部分:
    * 请求行 :请求方式 请求路径 协议版本
    * 请求头 :一个key对应一个value ,也有一个key对应多个value
        * Referer,User-Agent,If-Modified-Since
    * 请求体 :POST方式的参数.
* HTTP协议响应部分:
    * 响应行 :协议版本 状态码 状态码描述
        * 状态码:200 302 304 404 500
    * 响应头 :一个key对应一个value ,也有一个key对应多个value
        * Location,Refresh,Last-Modified,禁用本地缓存,Content-Dispostion
    * 响应体 :显示到页面的内容.
 
Servlet:服务器端程序.
* 编写Servlet:
    * 编写一个类,实现Servlet接口.继承GenericServlet,HttpServlet.
    * 配置Servlet.在web.xml中配置Servlet
* Servlet的执行原理:
* Servlet的生命周期:
    * 第一次访问Servlet的时候,服务器创建一个Servlet的对象.init方法就会执行.任何一次请求服务器都会创建一个新的线程执行service方法.service的方法内部根据请求方式调用doXXX方法.当服务器关闭的时候,servlet就会被销毁.destroy方法就会执行.
* Servlet的接口实现关系:
* Servlet的登录的案例:
    * 页面提交Servlet
        * 获得请求参数:request.getParameter();
        * 封装请求参数:
        * 调用业务层类:
        * 根据处理结果作出响应:
* 页面定时刷新:
* ServletConfig对象:(了解)
* ServletContext对象:(重要)-被多个用户共享.
    * 记录网站被登录的次数.
    * 在服务器启动的时候ServletContext就会被创建.一个WEB项目创建一个ServletContext对象.
在服务器关闭的时候销毁.域对象-存的数据有作用范围.
    * 功能:
        * 1.获得文件的MIME的类型.
        * 2.获得全局初始化参数.
        * 3.存取数据-作为域对象来使用.
            * setAttribute(String name,String value);
            * getAttribute(String name);
            * removeAttribute(String name);
        * 4.读取WEB项目的文件:
            * getResourceAsStream(String path);
            * getRealPath(String path);
1.2 案例一:完成登录用户对他提供文件的下载的功能.1.2.1 需求:
之前的案例中已经完成的了一个登录的功能,登录失败后回到登录页面.登录成功以后,服务器提供多个文件的下载的链接,点击链接可以完成文件的下载的功能.
1.2.2 分析:1.2.2.1 技术分析:
【响应对象-Response对象】
Ø 响应行:
Response设置状态码:
Ø 响应头:
Response设置响应头:
* 一个key对应一个value
* 一个key对应多个value
Ø 响应体:
Response设置响应体:
【response处理中文乱码】
[AppleScript] 纯文本查看 复制代码
Ø 字节流:
设置浏览器默认打开编码
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.2.2.2 步骤分析:
Ø 之前的登录案例已经存在:
Ø 登录成功跳转的页面上提供一组链接:
Ø 当点击下载的链接之后,提交到Servlet:
Ø 设置两个头和一个流:
1.2.3 代码实现:
[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.2.4 总结:
1.2.4.1 中文文件名下载:
中文文件在不同的浏览器中编码方式不同:
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);
}
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马