zoukankan      html  css  js  c++  java
  • Request和Response详解

    转自:http://zhidao.baidu.com/link?url=8BI0cjlcFdBSJKHTZlpo874eqtbTJoZfrh3miQgM_05RvSER8skPiBc1wSPZtXT8OGGCHfVXFAzAosa6E5HBl_

    内置对象
    request:请求对象
    request.getParameter("名字") 获得客户端输入的信息***************
    request.getParameterValues("名字") 获得客户端输入的一组信息
    request.getRequestDispatcher("url").forward(request,response): 转到url页面
    response:响应对象
    response.sednRedirect("url"):转到url指定的页面

    转自:http://blog.csdn.net/a859522265/article/details/7259115

    web服务器收到客户端的HTTP请求,会针对每一次请求分别创建一个用于代表请求的request对象和代表响应的response对象。

    1.要得到客户机提交过来的数据,只需要找request对象就行了。

    2、要向客户机输出数据,只需要找response对象就行了。

    一、response对象

    1.1向客户端发送数据,以字节为单位(一定要先设置编码方式,再输出)

    [java] view plaincopy
     
    1. String data = "你好,中国1";  
    2. OutputStream out = response.getOutputStream();  
    3. out.write(data.getBytes());//查找本机默认编码进行编码  
    [java] view plaincopy
     
    1.     String data = "你好,中国2";  
    2. OutputStream out = response.getOutputStream();  
    3. out.write(data.getBytes("UTF-8"));//以UTF-8进行编码  
    4. //告诉浏览器编码方式  
    5. response.setHeader("Content-Type","text/html;charset=UTF-8" );  
    [java] view plaincopy
     
    1. String data = "你好,中国3";  
    2. OutputStream out = response.getOutputStream();  
    3. out.write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes());////通过meta标签模拟请求头  
    4. out.write(data.getBytes("UTF-8"));//以UTF-8进行编码  
    [java] view plaincopy
     
    1. String data = "你好,中国4";  
    2.     OutputStream out = response.getOutputStream();  
    3.     response.setContentType("text/html;charset=UTF-8");  
    4.     out.write(data.getBytes("UTF-8"));//以UTF-8进行编码  
    [java] view plaincopy
     
    1.   
    [java] view plaincopy
     
    1. response.setContentType("text/html;charset=UTF-8");  

    等价于下面两句代码的效果:

    response.setCharacterEncoding("UTF-8");//更改服务器发送数据的默认编码
    response.setHeader("Content-Type","text/html;charset=UTF-8");//还要通知客户端解码方式

    [java] view plaincopy
     
    1. int x=97;  
    2. OutputStream out = response.getOutputStream();  
    3. out.write((x+"").getBytes());////向客户端发送数字  

    1.2 以字符为单位向客户端发送数据

                  String data = "你是谁?";
                  response.setCharacterEncoding("UTF-8"); //设置编码为UTF-8
                  response.setHeader("Content-Type", "text/html;charset=UTF-8");//告诉客户端编码方式
                  
                  
                 // 第二种方法:相当于以上两句代码
                  //response.setContentType("text/html;charset=UTF-8");
                  PrintWriter writer = response.getWriter();//默认编码是iso-8859-1 创建该对象前必须设置好编码方式
                  
                  writer.write(data);
                  System.out.println(response.getCharacterEncoding());
                 
    1.3 让客户端以下载方式打开文件,解决中文文件名乱码问题(URLEncoder.encode(name, "UTF-8"))

    [java] view plaincopy
     
    1. //得到文件的真实路径  
    2. String realPath = getServletContext().getRealPath("/files/漂亮美眉.jpg");  
    3. //获取文件名  
    4. String name = realPath.substring(realPath.lastIndexOf("\"));  
    5.   
    6. //设置响应头,通知客户端以下载的方式打开文件  
    7. response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(name, "UTF-8"));  
    8.   
    9. //构建输入流  
    10.    InputStream in = new FileInputStream(realPath);  
    11.      
    12.    //输出到客户端的流  
    13.    OutputStream out = response.getOutputStream();  
    14.    int len = -1;  
    15.    byte buf[] = new byte[1024];  
    16.    while((len=in.read(buf))!=-1)  
    17.    {  
    18.     out.write(buf, 0, len);  
    19.    }  
    20.      
    21.    in.close();  


    1.4 输出随机数字生成验证码图片

    [java] view plaincopy
     
      1.         //设置不要缓存(3种方式,建议三种都设置,防止浏览器不支持)  
      2.         response.addHeader("Pragma", "no-cache");   
      3.         response.setHeader("Cache-Control", "no-cache");   
      4.         response.setHeader("Expires", "0");  
      5.           
      6.         //1.内存图像 BufferedImage  
      7.         BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);  
      8.           
      9.         //2.创建画笔  
      10.         Graphics g = image.getGraphics();  
      11.           
      12.         //2.1画边框  
      13.         g.setColor(Color.GRAY);//设置边框颜色  
      14.         g.drawRect(0, 0, WIDTH, HEIGHT);//画矩形边框  
      15.         //2.2填充边框  
      16.         g.fillRect(1, 1, WIDTH-1, HEIGHT-1);  
      17.           
      18.         //2.3输出验证随机数字4个  
      19.         Random r = new Random();  
      20.         g.setColor(Color.BLUE);  
      21.         int x = 5;  
      22.         for(int i=0;i<4;i++)  
      23.         {  
      24.           
      25.             g.setFont(new Font("宋体",Font.BOLD,20));  
      26.             g.drawString(r.nextInt(10)+"", x, 20);  
      27.             x+=30;  
      28.         }  
      29.           
      30.         //2.4画干扰线  
      31.         g.setColor(Color.YELLOW);  
      32.         for(int i = 0;i<9;i++)  
      33.         {     
      34.               
      35.             g.drawLine(r.nextInt(WIDTH),r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));  
      36.         }  
      37.           
      38.         //3 利用response输出流输出image  
      39.         ImageIO.write(image,"jpeg",response.getOutputStream());<pre name="code" class="java">       //response.setHeader("Expires", (System.currentTimeMillis()+24*3600*10*1000)+"");//缓存10天  
      40.         response.setDateHeader("Expires",System.currentTimeMillis()+10*24*1000*60*60);</pre><br>  
      41. <pre></pre>  
      42. <p></p>  
      43. <pre></pre>  
      44. 1.5 控制客户端刷新时间  
      45. <p></p>  
      46. <p></p>  
      47. <pre name="code" class="java">       //response.setHeader("Refresh", "5;URL=/day05/default.html");//5秒后跳转,url是跳转的链接  
      48.          response.getOutputStream().write("<meta http-equiv="Refresh" content="3;URL=/day05/login.html">".getBytes());</pre>1.6 控制客户端缓存时间  
      49. <p></p>  
      50. <p></p>  
      51. <pre name="code" class="java">      //response.setHeader("Expires", (System.currentTimeMillis()+24*3600*10*1000)+"");//缓存10天  
      52.         response.setDateHeader("Expires",System.currentTimeMillis()+10*24*1000*60*60);</pre><br>  
      53. 1.7 用response实现请求重定向  
      54. <p></p>  
      55. <p><img src="http://hi.csdn.net/attachment/201202/14/0_13292204202s0e.gif" alt=""></p>  
      56. <p>特点:地址栏会变,发送两次请求,增加服务器负担。</p>  
      57. <p>实现方式:response.sendRedirect()<br>  
      58. 实现原理:302状态码和location头即可实现重定向<br>  
      59. </p>  
      60. <pre name="code" class="java">           //response.sendRedirect("/day05/servlet/ResponseDemo5");//绝对路径  
      61.  注意      // response.sendRedirect("/servlet/ResponseDemo5");//相对路径这里用是错误的,因为重定向是由客户端发起的  
      62.           response.setStatus(307);//302 或者 307都可  
      63.           response.setHeader("location", "http://localhost:8080/day05/servlet/ResponseDemo1");</pre><br>  
      64. 1.8 小细节  
      65. <p></p>  
      66. <p></p>  
      67. <pre name="code" class="java">          String  s1 = "abc";  
      68.           String  s2 = "def";  
      69.           response.getOutputStream().write(s1.getBytes());  
      70.           //response.getWriter().write(s2);  
      71.           //注:getOutputStream和getWriter这两个方法互相排斥,  
      72.           //调用了其中的任何一个方法后,就不能再调用另一方法,会抛异常。  
      73.           //java.lang.IllegalStateException:   
      74.           //getOutputStream() has already been called for this response</pre><br>  
      75. <p><br>  
      76. </p>  
      77. <p>二、request(HttpServletRequest)对象</p>  
      78. <p>2.1.get方法</p>  
      79. <p></p><pre name="code" class="java">         String locale = request.getLocalName();//传输协议  
      80.          String url = request.getRequestURL().toString();//请求的地址  
      81.          String uri = request.getRequestURI();//没有主机名的地址  
      82.          String protocol = request.getProtocol();//获取协议  
      83.          String  add = request.getRemoteAddr();//客户端IP  
      84.          String host = request.getRemoteHost();//客户端主机名  
      85.          String port = request.getRemotePort()+"";//客户端端口号  
      86.          String method = request.getMethod();//客户端的请求方式  
      87.          String localAddr = request.getLocalAddr();//获取服务器地址  
      88.          String username = request.getParameter("username");//地址后面?请求的参数  
      89.          String serverPort = request.getServerPort()+"";//服务器端口号  
      90.          String serverName = request.getServerName();//服务器名</pre><br>  
      91. 2.2 获取客户端请求头<p></p>  
      92. <p></p><pre name="code" class="java">           response.setContentType("text/html;charset=UTF-8");  
      93.   
      94.            PrintWriter out = response.getWriter();  
      95.            //获取单个请求头的值  
      96.            out.write(request.getHeader("Accept-Language")+"<br/>");  
      97.            //获取单个请求头多个值  
      98.            Enumeration  headers = request.getHeaders("user-agent");  
      99.            while(headers.hasMoreElements())  
      100.            {  
      101.                out.println(headers.nextElement()+"<hr/>");  
      102.            }  
      103.              
      104.            //获取所有的请求头名  
      105.            Enumeration names = request.getHeaderNames();  
      106.            while(names.hasMoreElements())  
      107.            {   //根据请求头名得到对应的值  
      108.                String name = (String)names.nextElement();  
      109.                out.println(name+"="+request.getHeader(name)+"<br/>");  
      110.            }</pre><br>  
      111. 2.3获取请求参数<p></p>  
      112. <p>String usernameValue = request.getParameter("username");//参数不存在为null<br>  
      113. </p>  
      114. <p></p><pre name="code" class="java">String names[] = request.getParameterValues("username");  
      115.         for(String name:names)  
      116.         {  
      117.             System.out.println(name);////得到某个请求参数的所有值  
      118.               
      119.         }</pre><pre name="code" class="java">             //获取所有的请求参数名  
      120.   
      121.         Enumeration names = request.getParameterNames();  
      122.           while(names.hasMoreElements())  
      123.           {  //根据参数名得到值  
      124.               String name = (String)names.nextElement();  
      125.               System.out.println(name+"------->"+request.getParameter(name));  
      126.           }</pre><br>  
      127. 2.4 封装到bean<br>  
      128. <pre name="code" class="java">public class Student {  
      129.    private String[] username;  
      130.    private String password;  
      131.       
      132.    public String[] getUsername() {  
      133.         return username;  
      134.     }  
      135.     public void setUsername(String[] username) {  
      136.         this.username = username;  
      137.     }  
      138.     public String getPassword() {  
      139.         return password;  
      140.     }  
      141.     public void setPassword(String password) {  
      142.         this.password = password;  
      143.     }  
      144.      
      145.      
      146. }  
      147.   
      148. </pre><pre name="code" class="java">//利用BeanUtils和 getParameterMap()将对象封装到bean  
      149.     private void test5(HttpServletRequest request) {  
      150.         // TODO Auto-generated method stub  
      151.         Map map = request.getParameterMap();  
      152.         Student s = new Student();  
      153.         try {  
      154.             BeanUtils.populate(s, map);  
      155.         } catch (IllegalAccessException e) {  
      156.             // TODO Auto-generated catch block  
      157.             e.printStackTrace();  
      158.         } catch (InvocationTargetException e) {  
      159.             // TODO Auto-generated catch block  
      160.             e.printStackTrace();  
      161.         }  
      162.         String[] names = s.getUsername();  
      163.         System.out.println(names[0]);//aa  
      164.         System.out.println(names[1]);//bb  
      165.         System.out.println(s.getPassword());//123  
      166.     }//从客户端传过来的值username两个(假如是aa和bb) 和一个password值(假如是123)</pre><br>  
      167. 2.5 得到请求正文<br>  
      168. <pre name="code" class="java">      //获取请求正文  
      169.         InputStream in = request.getInputStream();  
      170.         byte[] buf =new byte[1024];  
      171.         int len = -1;  
      172.         while((len=in.read(buf))!=-1)  
      173.         {  
      174.             System.out.println(new String(buf,0,len));  
      175.         }</pre><br>  
      176. 2.6解决请求参数的中文乱码<p></p>  
      177. <p> get方式:先按照原编码得到原始字节码,然后再重新编码。如:name = new String(name.getBytes("ISO-8859-1"),"UTF-8");</p>  
      178. <p>post方式:客户端是什么编码,发送的请求数据就是什么编码,根据客户端的编码,告知服务器编码方式。</p>  
      179. <p>如:request.setCharacterEncoding("UTF-8");// 只适合POST请求方式</p>  
      180. <p><br>  
      181. </p>  
      182. <p>2.7请求转发 forward</p>  
      183. <p><span style="white-space:pre"></span>RequestDispatcher rd = request.getRequestDispatcher("path");//得到转发器,path可以是相对路径或者绝对路径(因为是服务器发起的)<br>  
      184. <span style="white-space:pre"></span>rd.forward(request, response);<br>  
      185. </p>  
      186. <p><img src="http://hi.csdn.net/attachment/201202/14/0_1329238218CM8E.gif" alt=""><br>  
      187. </p>  
      188. <p>2.8 包含include</p>  
      189. <p><span style="white-space:pre"></span>RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo9");<br>  
      190. <span style="white-space:pre"></span>rd.include(request, response);<br>  
      191. </p>  
      192. <p><img src="http://hi.csdn.net/attachment/201202/14/0_1329238034rHHG.gif" alt=""><br>  
      193. </p>  
      194. <p>三 、路径的写法:<br>  
      195. a、绝对路径写法:ServeltContext都必须用绝对路径。“/”开始 (如ServletContext.getRequestDispatcher("path") path必须是绝对路径)<br>  
      196. b、相对路径:其他情况都可以使用相对路径,也可以使用绝对路径<br>  
      197. <br>  
      198. <br>  
      199. c、在使用绝对路径时,要不要加"/"或者是项目名:如果是服务器调用的,不用加项目名,用“/”就可以代表了当前应用根目录<br>  
      200. 如果是客户端调用的,必须加上项目名<br>  
      201. <br>  
      202. <br>  
      203. 1、转发:request.getRequestDispather(String url)<br>  
      204. 绝对路径:url    /servlet/ServletDemo<br>  
      205. 2、重定向:response.sendRedirect(String url)<br>  
      206. 绝对路径:url    /day05/servlet/ServletDemo<br>  
      207. <br>  
      208. <br>  
      209. 3、超链接:<a href="url"/><br>  
      210. 绝对路径:url  /day05/servlet/ServletDemo<br>  
      211. 4、类加载文件的路径<br>  
      212. web应用中只能用相对路径,相对于classes目录的<br>  
      213. 5、<fomr action="url"/><br>  
      214. 绝对路径:/day05/servlet/ServletDemo<br>  
      215. 6、页面分帧(frame)<br>  
      216. 绝对路径:/day05/servlet/ServletDemo<br>  
      217. 7、ServletContext.getRealPath(url)<br>  
      218. 绝对路径:url    /servlet/ServletDemo<br>  
      219. <br>  
      220. <br>  
      221. URLEncoder.encode("name", "UTF-8")//解决文件下载名中文乱码</p>  
      222. <p><br>  
      223. </p>  
      224. <p></p>  
      225.      
  • 相关阅读:
    《大道至简》之五
    String类总结
    《大道至简》之沟通
    程序设计及总结
    《大道至简》之团队
    动手动脑课堂作业7---------
    动手动脑课堂作业7
    动手动脑
    大道至简—现实中的软件工程—思考还是思想
    动手动脑
  • 原文地址:https://www.cnblogs.com/name-hanlin/p/5059965.html
Copyright © 2011-2022 走看看