zoukankan      html  css  js  c++  java
  • Request 和 Response 原理

    * Request 和 Response 原理:


        * request对象和response对象由服务器创建,我们只需要在service方法中使用这两个对象即可
        
        * 继承体系结构:
            ServletRequest <--继承-- HttpServletRequest <--实现--- RequestFacade

    * Response:封装响应消息,设置响应消息
        * 设置响应行:HTTP/1.1 200 ok
            * setStatus(int code):设置响应状态码
                * 演示重定向:302
                    //简化版的重定向
                    response.sendRedirect("http://192.168.1.66:8080/zxc/one");
                    
                    * 实现原理
                    //1.设置响应状态码为 302
                    response.setStatus(302);
                    //2.设置响应头 location
                    response.setHeader("location", "http://192.168.1.66:8080/zxc/one");
            
        * 设置响应头:
            * setHeader(String name,String value):
            * setDateHeader(String name, long date)
            * setIntHeader(String name, int value)

        * 设置响应体:
            * getOutputStream():发送字节数据
                * 验证码:
                    * 防止恶意注册
            
            * getWriter():发送字符数据
                * 发送中文数据时,需要在获取流之前设置编码方式,并且要告诉客户端浏览器,服务器使用的编码方式
                    //简化版设置编码的方式
                    response.setContentType("text/html;charset=utf-8");

     1 package Response;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class ResponseTest extends HttpServlet {
    12 
    13     
    14     private static final long serialVersionUID = -3007244764565301466L;
    15 
    16     public void doGet(HttpServletRequest request, HttpServletResponse response)
    17             throws ServletException, IOException {
    18     /*
    19      * 设置响应消息体:
    20      *     getOutputStream():发送字节数据
    21      *     getWriter():发送字符数据
    22      */
    23         /*
    24         //设置流的编码方式
    25         response.setCharacterEncoding("utf-8");
    26         //告诉客户端,服务器使用的编码方式
    27         response.setHeader("content-type", "text/html;charset=utf-8");
    28         */
    29         
    30         //设置编码方式
    31         response.setContentType("text/html;charset=utf-8");
    32         //获取字符输出流
    33         PrintWriter pw = response.getWriter();//默认编码是 iso-8859-1
    34         //设置数据
    35         pw.write("<h3>你好啊 ! response...</h3>");
    36         //刷新
    37         pw.flush();
    38     }
    39 
    40     public void doPost(HttpServletRequest request, HttpServletResponse response)
    41             throws ServletException, IOException {
    42         this.doGet(request, response);
    43 
    44     }
    45 
    46 }


    * Request:封装请求消息,获取请求消息
        * 获取请求消息:
            * 获取请求行:GET /day08/req1?name=zs HTTP/1.1
                * getMethod():获取请求方式
                * getContextPath():获取虚拟目录
                
                * getRequestURI():获取URI(统一资源标识符)    /day07/one        /one
                * getRequestURL():获取URL(统一资源定位符)    http://localhost:8080/day07/one
                * getRemoteAddr():获取客户机的IP地址
                
                * getQueryString():get方式获取请求参数
            * 获取请求头:
                * String getHeader(String name)
                * long getDateHeader(String name)
                * int getIntHeader(String name)  
                
                

     1 package Request;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 public class RequestTest2 extends HttpServlet {
    11 
    12     private static final long serialVersionUID = -5095708647887091449L;
    13 
    14     public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16 
    17         //获取请求头
    18         String agent = request.getHeader("user-agent");
    19         System.out.println(agent);
    20         
    21         if(agent.contains("MSIE")){
    22             System.out.println("IE  来了...");
    23         }else if(agent.contains("Firefox")){
    24             System.out.println("火狐   来了...");
    25         }else if(agent.contains("Chrome")){
    26             System.out.println("谷歌    来了...");
    27         }else{
    28             System.out.println("其他浏览器  来了...");
    29         }
    30         
    31         System.err.println("..............................");
    32     }
    33 
    34     public void doPost(HttpServletRequest request, HttpServletResponse response)
    35             throws ServletException, IOException {
    36         this.doGet(request, response);
    37 
    38     }
    39 
    40 }


            * 获取请求体:封装post请求参数数据
                * BufferedReader getReader():
                * ServletInputStream getInputStream():
            
            
                * 通用的获取请求参数的方式:
                    * String getParameter(String name):根据键名获取值
                    * String[] getParameterValues(String name):根据键名获取值的数组,一般用于复选框
                    * Map<String,String[]> getParameterMap():获取所有参数的map集合
                    * Enumeration getParameterNames():获取所有的键名枚举
            
            

     1 package Request;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 public class RequestTest extends HttpServlet {
    11 
    12     private static final long serialVersionUID = 4919849090529066482L;
    13 
    14     public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16 
    17         //演示获取请求行数据
    18         
    19         System.out.println(request.getMethod());//获取请求发式
    20         System.out.println(request.getContextPath());//获取虚拟目录
    21         System.out.println(request.getRequestURI());//获取URI
    22         System.out.println(request.getRequestURL());//获取URL
    23         System.out.println(request.getRemoteAddr());//获取ip
    24         System.out.println(request.getQueryString());//获取请求参数
    25         System.out.println(request.getProtocol());//获取协议
    26         
    27         System.err.println("--------------------------");
    28         
    29         response.sendRedirect(request.getContextPath()+"/index.jsp");
    30     }
    31 
    32     public void doPost(HttpServletRequest request, HttpServletResponse response)
    33             throws ServletException, IOException {
    34         this.doGet(request, response);
    35 
    36     }
    37 
    38 }

       * 请求参数中文乱码问题:
                    1.通用:
                        //1.解码  iso
                        byte[] bytes = username.getBytes("iso-8859-1");
                        //2.编码 utf-8
                        username = new String(bytes, "utf-8");
                    2.post专用
                        //设置输入流的编码为 utf-8
                        request.setCharacterEncoding("utf-8");
        
        * 域对象:代表一次请求
        
        * 请求转发:
            * 转发特点:
                1.地址栏不发生变化
                2.一次请求,一次响应
                3.不能转发外部站点

     1 package Request;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 public class RequestTest7 extends HttpServlet {
    11 
    12     private static final long serialVersionUID = 3744695995118989884L;
    13 
    14     public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16 
    17         System.out.println("req7 被访问了。。。");
    18         
    19         //存储数据
    20         request.setAttribute("msg", "hehehe...");
    21         
    22         //转发至req
    23         request.getRequestDispatcher("/req").forward(request, response);
    24     }
    25 
    26     public void doPost(HttpServletRequest request, HttpServletResponse response)
    27             throws ServletException, IOException {
    28         this.doGet(request, response);
    29 
    30     }
    31 
    32 }


            * 重定向的特点:
                1.地址栏发生变化
                2.两次请求,两次响应
                3.可以访问外部的站点

     1 package Response;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 public class ResponseTest2 extends HttpServlet {
    11 
    12     /**
    13      * 
    14      */
    15     private static final long serialVersionUID = -449184946348811489L;
    16 
    17     public void doGet(HttpServletRequest request, HttpServletResponse response)
    18             throws ServletException, IOException {
    19 
    20         System.out.println("resp2 被访问了。。。");
    21         //演示重定向
    22         //1.设置相应状态码 302
    23         response.setStatus(302);
    24         
    25         //2.设置相应头  location
    26         //注意: http:// 不可以少
    27         //response.setHeader("location", "http://192.168.1.66:8080/zxc/resp");
    28         
    29         //简化版的重定向
    30         response.sendRedirect("http://192.168.1.66:8080/zxc/resp");
    31     }
    32 
    33     public void doPost(HttpServletRequest request, HttpServletResponse response)
    34             throws ServletException, IOException {
    35         this.doGet(request, response);
    36 
    37     }
    38 
    39 }
  • 相关阅读:
    [原]【实例化需求】1.FitNesse工具应用简介
    [原][问题解决]常见问题的5种解决办法(由Jenkins问题解决谈起)
    [原][自动化测试]Robot Framework Selenium基本使用
    [原]好玩的Linux,关于时间cal命令
    [原][问题解决]Romote Control 图形化界面显示问题解决办法
    【SBE】由需求管理谈起
    [Robot]关于robot的几个学习网站
    coolite中在UserControl中使用Coolite.AjaxMethods方法
    javascript实现页面加载进度条(转)
    coolite 在前台更新Window中控件的值
  • 原文地址:https://www.cnblogs.com/rongsnow/p/5167692.html
Copyright © 2011-2022 走看看