黑马程序员技术交流社区

标题: 【济南中心】JavaEE就业班同步笔记第一阶段:JavaWeb之Request... [打印本页]

作者: 小鲁哥哥    时间: 2017-1-13 16:52
标题: 【济南中心】JavaEE就业班同步笔记第一阶段:JavaWeb之Request...
本帖最后由 小鲁哥哥 于 2020-1-8 21:56 编辑

点击查看济南黑马校区最新开班计划

【济南中心】JavaEE就业班同步笔记第一阶段:
JavaWeb之核心技术--Request和Response


1  案例一:完成登录用户对他提供文件的下载的功能.
1.1  需求:
之前的案例中已经完成的了一个登录的功能,登录失败后回到登录页面.登录成功以后,服务器提供多个文件的下载的链接,点击链接可以完成文件的下载的功能.
1.2 分析:
1.2.1 技术分析:
【响应对象-Response对象】
Response设置状态码:
setStatus(int)
Response设置响应头:
* 一个key对应一个value
setDataHeader(String,long)
setintHeader(String,String)
setIntHeader(String,int)
* 一个key对应多个value
addDatHeader(String,long)
addHeader(String,String)
addIntHeader(String,int)
Response设置响应体:
getoutputStream()
getWriter()
【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.2.2 步骤分析:
1.3 代码实现:
1.在页面中提供一组下载的链接:
[HTML] 纯文本查看 复制代码
    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:
        
[Java] 纯文本查看 复制代码
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.4 总结:
1.4.1 中文文件名下载:
中文文件在不同的浏览器中编码方式不同:
IE               :URL编码
Firefox        :Base64编码
[Java] 纯文本查看 复制代码
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);
                }
        }


2  案例二:网站的注册的功能的实现:
2.1 需求:
在商城的网站上完成一个注册的功能:

2.2 分析:
2.2.1 技术分析
【请求对象-request对象】
* getMethod();                        ---获得请求方式.
* getQueryString();                ---获得请求路径后的参数.
* getRemoteAddr();                ---获得客户机的IP地址.
* getRequestURI();                ---获得请求的路径
* getRequestURL();                ---获得请求的路径
* getContextPath();                ---获得工程名
* request.getHeader(“User-Agent”);
* request.getHeader(“Referer”);
getParemeter(String)
getParameterMap()
getParameterNames()
getParameterValues(String)
removeAttribute(String)
setAttribute(String,Object)
getAttribute(String)
2.2.2 步骤分析:
2.3  代码实现:
1.创建数据库
[SQL] 纯文本查看 复制代码
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.(内省技术)
2.4  总结:
2.4.1  转发和重定向的区别:
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(String path).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.
2.4.2  使用转发和重定向对登录的功能优化:
使用request域保存一个值:在一次请求范围内有效的.
登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}

作者: 小虎同学    时间: 2017-1-14 00:18
路过看看啦

作者: ZytloveGjh    时间: 2017-1-23 15:40
不错,挺好的
作者: 碧海云天    时间: 2017-2-11 18:42
666666666666666
作者: zmanx    时间: 2017-2-12 22:01
多谢大哥分享啊,希望持续更新啊
作者: a690223483    时间: 2017-2-22 21:01
我打算把po主整理的东西全马住  贼好
作者: zhangkaitong    时间: 2017-2-24 13:29
谢谢分享 赞赞赞!!!!!
作者: aifengaixue    时间: 2017-2-27 08:49
谢谢 赞赞 么么哒
作者: xulinml    时间: 2017-2-28 09:01
谢谢老师~!~感谢感谢
作者: 为过去的我买单    时间: 2017-3-2 10:03
谢谢分享!
作者: a690223483    时间: 2017-3-6 23:28
好棒赞一个
作者: 南槿。    时间: 2017-3-15 19:40
多谢分享咯~!
作者: 含沙射影    时间: 2017-3-16 18:55
谢谢分享
作者: 894529070    时间: 2017-3-23 00:59
呵呵,谢谢分享
作者: 掬一束月光    时间: 2017-3-24 18:13
谢谢小鲁哥哥
作者: alone87    时间: 2017-3-24 23:07
我们值得学习
作者: zhouxiaoyang    时间: 2017-3-26 23:17

作者: a798988437    时间: 2017-3-31 20:33
楼主好人
作者: ys5214    时间: 2017-4-1 14:04
66666666666666666
作者: Cerol    时间: 2017-4-12 17:18
力挺楼主,支持你   666
作者: hrywxn    时间: 2017-5-22 22:24
学习一下,真不错
作者: zsldeyou    时间: 2017-5-29 10:31
谢谢分享66666
作者: zsldeyou    时间: 2017-5-29 10:35
力挺楼主,支持你   666
作者: liujinlong666    时间: 2017-5-31 00:12
支持下...
作者: dhj    时间: 2017-6-11 16:46
感谢分享!!!!
作者: a851699    时间: 2017-6-16 22:23
可以,很强势
作者: str.arr    时间: 2017-7-9 09:38
楼主这是在版块开免费班啦·

作者: 梁修成    时间: 2017-7-10 22:33

这样的笔记真不错哦'//'\/'.
作者: cheat    时间: 2017-7-10 22:33
谢谢,好多好资源啊。
作者: rimfwfn    时间: 2017-8-1 20:48
核心技术,要好好掌握
作者: k1453711238    时间: 2017-8-2 22:26
多谢大哥分享啊,希望持续更新啊
作者: k1453711238    时间: 2017-8-2 22:28
多谢大哥分享啊,希望持续更新啊
作者: at123    时间: 2017-8-7 23:14

黑马币来了,大家加油哦。。。
作者: jiangchanghong1    时间: 2017-8-26 23:27
65666666666666666666
作者: →_→←_←    时间: 2017-8-28 15:54
挺好的,学习ing.....
作者: M先生    时间: 2017-8-29 23:12
支持                                          
作者: false    时间: 2017-8-30 15:13
写的太好了,我很喜欢
作者: 15164046497    时间: 2017-9-20 01:22
谢谢作者,用心了
作者: Jason_time    时间: 2017-9-21 13:35
不错,谢谢分享
作者: liuqwer    时间: 2017-9-21 14:26
不错不错不错不错不错
作者: iMoney    时间: 2017-10-12 17:52
果断收藏
作者: newu    时间: 2017-10-12 22:33
66666666666666666
作者: sunshine123    时间: 2017-10-25 14:37
66666666666666666666
作者: 神仙难救    时间: 2017-10-25 22:03
谢谢分享 赞赞赞!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2