response与request

来源:互联网 发布:python 论坛源码 编辑:程序博客网 时间:2024/06/06 14:07

request与response对象介绍:

问题:request与response是什么,它们有什么作用?    Web服务器收到客户端的请求,回针对每一次请求创建一个    用于封装我们html请求信息的对象request,也会创建一个response对象,它对应着http响应;    在我们的程序中,我们得到的request对象就可以操作http请求信息,得到response对象就可以操作http响应信息;    servlet接口中的service方法上        service(ServletRequest req, ServletResponse res)    HttpServlet它的doGet与doPost方法上    public void doPost(HttpServletRequest request, HttpServletResponse response)    问题:ServletRequest 与HttpServletRequest及ServletResponse与HttpServletResponse关系?    ServletRequest 与ServletResponse 它们是HttpServletRequest与HttpServletResponse的父接口

response对象详细介绍:

    response对象它代表的http响应,我们通过他可以操作http响应信息;    http响应有三部分:

操作响应行

    响应状态吗通过response对象如何操作?    setStatus(int sc)是用于操作非错误状态码的    sendError(int sc)    sendError(int sc, String msg)    它是用于操作错误状态码的

操作响应头

    addDateHeader(String name, long date)    addHeader(String name, String value)    addIntHeader(String name, int value)    setDateHeader(String name ,long date)    setHeader(String name, String value)    setIntHeader(String name, int value)    addXxx 方法它的主要作用是添加操作,如果现在http响应中有这个头信息,    它会在这个基础上再添加头信息;    setXxx 方法它的主要作用是修改,如果现在http响应中有这个头信息,    它会将原来的值修改为现在的指定值;    注意:如果http响应中没有这个头信息,那么使用addXxx或setXxx是一样的效果;

案例-重定向

    使用302状态码及location来完成.    1,设置响应状态码为302;    response.setStatus(302);    2,设置响应头location的值为servlet的路径    response.setHeader("location","/day10/servlet");    路径名可以带协议,也可以不带协议    注意: 重定向是指浏览器会再次向location指定的路径发送请求;    在开发中,我们可以使用一下这个简便的方法来完成重定向的操作    response.sendRedirect("/day10/servlet");

案例-定时跳转

    在http响应头中有一个头叫做refresh,它可以实现定时跳转功能;    访问到这个servlet后,会延迟5秒跳转到指定url的路径    response.setHeader("refresh", "5; url=http://localhost/day10/demo1.html");    在开发中我们一般使用html标签实现上述的功能;    <script>        var inter;        页面加载完成后,会执行这个函数        window.onload = function () {            inter = window.setInterval("showTime()", 1000);        }        function showTime() {            1,得到span块的对象            var s = document.getElementById("s");            2,得到span块中的信息            var value = s.innerHTML;            3,将值减一再赋值给原来的value            value = value - 1;            4,判断如果值小于等于0,清除格式            if(value <= 0) {                window.clearInterval(inter);            }        }    </script>    <body>        <span id="s">5</span>秒后会跳转到<a href="/day10/demo1.html">demo1.html</a>    </body>

操作响应正文:

    在HttpServletResponse中提供两个方法可以获取输出流;    getWriter()    getOutputStream()    通过response对象获取到输出流,它输出的内容其实就是我们向浏览器响应的正文的内容;    http响应的正文的内容会在浏览器上直接显示出来    注意:这两个流在使用时,不可以一起使用,他们是互斥的;    问题:我们在开发中是选择使用字符流还是字节流?    操作文本时一般使用字符流,而操作二进制数据使用字节流;    如果要在浏览器显示的信息是自定义的,我们建议使用字符流,如果    是原样copy,就选择字节流;    问题:使用response来操作响应正文,如果是中文会出现乱码,怎样解决?    在response中提供两个方法来处理响应正文乱码    setCharacterEncoding(String charset)    这个方法可以设置响应正文的额编码    setContextType(String type)    这个方法不仅设置响应信息的编码,还可以让浏览器知道一什么编码来解析    响应回的信息;    注意:在servlet的service方法结束后,服务器tomcat会自动检查getOutputStream()和    getWriter()方法获取到的流是否调用了close();如果没有调用,tomcat会自动调用close()方法    将流关闭,如果我们已经关闭了;那么它就不会再执行,建议大家在调用close()方法关闭前,调用    fiushBuffer方法来将缓存区刷新;

案例-生成验证码

    验证码就是一张图片,它可以防止恶意注册;    我们可以通过servlet去动态的生成一张图片来做我们的验证码;    服务器端的代码    int charNum = 4;    int width = 30 * 4;    int height = 30;    // 1. 创建一张内存图片    BufferedImage bufferedImage = new BufferedImage(width, height,            BufferedImage.TYPE_INT_RGB);    // 2.获得绘图对象    Graphics graphics = bufferedImage.getGraphics();    // 3、绘制背景颜色    graphics.setColor(Color.YELLOW);    graphics.fillRect(0, 0, width, height);    // 4、绘制图片边框    graphics.setColor(Color.BLUE);    graphics.drawRect(0, 0, width - 1, height - 1);    // 5、输出验证码内容    graphics.setColor(Color.RED);    graphics.setFont(new Font("宋体", Font.BOLD, 20));    // 随机输出4个字符    Graphics2D graphics2d = (Graphics2D) graphics;    String s = "ABCDEFGHIGKLMNOPQRSTUVWXYZ01234567890";    // String s =    // "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";    Random random = new Random();    String msg = "";    int x = 5;    for (int i = 0; i < 4; i++) {        int index = random.nextInt(26);        String content = String.valueOf(s.charAt(index));        msg += content;        double theta = random.nextInt(45) * Math.PI / 180;        graphics2d.rotate(theta, x, 18);        graphics2d.drawString(content, x, 18);        graphics2d.rotate(-theta, x, 18);        x += 30;    }    // // 6、绘制干扰线    for (int i = 0; i < 10; i++) {        int r = random.nextInt(255);        int g = random.nextInt(255);        int b = random.nextInt(255);        graphics.setColor(new Color(r, g, b));        int x1 = random.nextInt(width);        int x2 = random.nextInt(width);        int y1 = random.nextInt(height);        int y2 = random.nextInt(height);        graphics.drawLine(x1, y1, x2, y2);    }    // 释放资源    graphics.dispose();    // 图片输出 ImageIO    ImageIO.write(bufferedImage, "jpg", response.getOutputStream());    客户端代码:    <scripr>        function change() {            document.getElementById("img").src =             "/day10/imageCode?time=" + new Date().getTime();        }    </script>    <body>        使用img标签来接收图片        <img src="/day10/imageCode" id="img">        <a href="javascript:void(0)" onclick="change()">        看不清换一张        </a>    </body>

request对象详细介绍

        我们在开发中可以通过request对象来获取http请求信息及客户机信息        http请求分三个部分 请求行 请求头 请求正文 ,通过request对象我们就可以获取http        请求信息;

操作http请求行

    在请求行中有        1,请求的方式        getMethod()        2,请求的资源路径        getRequestURI()        如果在请求的资源上有请求参数就可以使用        getQueryString()        3,请求的协议版本        getProtocol()        获取客户机信息        1,获取客户机的ip地址        getRequestAddr()        2,获取访问的资源的URL        getRequestURL()        3,获取访问的工程名字        getContextPath()

操作http请求头

        (long)getDateHeader(String name)        (String)getHeader(String name)        (Enumeration)   getHeaderNames()        (Enumeration)   getHeaders(String name)        getIntHeader(String name)        在http请求头中有一个user-agent,它可以帮助我们获取浏览器信息;

操作http请求正文

        问题:什么情况下请求正文有内容?            只有请求方式是post,并且有请求参数的情况下才会在正文中存在内容;        问题:怎么样可以获取到请求参数?        1,(String)getParameter(String s)        根据指定的的请求参数的名称获取对应的的值        2,(String[])getParameterValues        根据指定的请求参数的名称获取对应的值        3,(Map<String,String[]>)getParameterMap();        它是获取所有的请求参数封装的Map集合,集合的key就是        请求参数的名称;value 就是相当于getParameterValues()        获取的值;        4,(Enumeration)getParameterNames()        它是获取所有请求参数的名字封装到Enumeration中

请求参数乱码问题,它是如何产生的,怎样解决的?

        乱码产生的最根本原因是在编码与解码时使用的是不同的编码表;        简单说就是浏览器使用了UTF-8对汉字进行了编码,服务器使用了ISO8859-1        对信息进行了解码,就出现了乱码;        解决乱码的方案:            将得到的信息再以ISO8859-1进行编码,使用UTF-8进行解码就可以;        String userName = request.getParameter("username");        userName = new String(userName,getBytes("ISO8859-1"),"UTF-8");        如果我们的额请求方式是post,我们也可以直接通过        request.setCharacterEncoding("utf-8");        来处理请求参数乱码的问题;

request域对象

        request域对象可以在域范围内实现数据的共享;        可以通过setAttribute() getAttribute()        removeAttribute() 来操作域中的数据;        request的生命周期:            Request对象是在浏览器向服务器发送请求时,服务器会创建            request对象.当服务器产生了响应时,request对象就销毁了,            简单说就是请求时创建request,响应时销毁request;        什么是请求转发?如何实现?            请求转发指的就是服务器内的资源的跳转,请求转发时,就会形成            一个请求链,他们共享同一个request与response对象;也就是            说他们之间就存在一个request域,要想实现请求转发,可以通过            request对象的getRequestDispatcher方法得到一个RequestDispatcher            对象,调用这个对象的forward方法来实现;            RequestDispatcher rd = request.getRequestDispatcher("/second");            rd.forward(request, response);

请求转发与重定向的区别:

            1,请求转发是服务器的内部跳转,所以浏览器地址栏上的路径没有改变;            重定向时,因为会从浏览器再次发送请求,所以地址栏会改变;            2,请求转发只有一次请求,一次响应,重定向是两次请求两次响应;            3,请求转发它存在request域,资源之间使用的是同一个request;            而重定向它使用的不是同一个request;            4,请求转发它是服务器内部跳转,也就是说只能跳转到站内资源;            而重定向可以跳转到任意资源;            5,请求转发的实现是靠request对象            request.getRequestDispathcher(“路径”).forward(request,response);            而重定向response.sendRedirect(“路径”);            6,请求转发时它的路径写法是   直接就是资源路径,简单说url-pattern值,            也就是说在请求转发时它的”/”其实代表的就是当前工程了。而重定向它的路径            写法是 “/工程名”+url-pattern值,也就是说,当重定向时,我们所使用的            是”/”它代表的是tomcat的根路径.            简单说,请求转发与重定向它的路径区别就在于是否多一个工程名            请求转发  /资源路径            重定向  /工程名/资源路径
1 0
原创粉丝点击