转自: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向客户端发送数据,以字节为单位(一定要先设置编码方式,再输出)

  1. String data = "你好,中国1";
  2. OutputStream out = response.getOutputStream();
  3. out.write(data.getBytes());//查找本机默认编码进行编码
  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" );
  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进行编码
  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进行编码
  1. response.setContentType("text/html;charset=UTF-8");

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

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

  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"))

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

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

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

Request和Response详解的更多相关文章

  1. Servlet技术——request、respone详解

    Servlet之request.respone详解 Request (一) 概述 request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个reque ...

  2. JavaWeb学习篇之----容器Response详解

    今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了.下面我们就来看一下Response容器的相关知识吧.Response和我们即将在后面说到的R ...

  3. umi request 请求资源库详解

    umi-request: 网络请求库,基于fetch封装,兼具fetch 和 axios 的所有特点,具有缓存,超时,字符编码处理,错误处理等常用功能. 1 支持url 参数自动序列化. 2 post ...

  4. ajax.request函数使用详解

    Ajax.Request   ? Ajax.Request( url, { method:method, parameters:para, postBody:xmlString, asynchrono ...

  5. 爬虫基本原理及requests,response详解

    一.爬虫基本原理 1.爬虫是什么 #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据 ...

  6. HttpServletResponse response详解

    //内容类型和编码格式可以被调用多次,最后一次将覆盖之前的设置 //内容类型和编码格式必须在 //设置内容类型getWriter和getOutputStream方法之前调用,否则不起作用 //若未设置 ...

  7. flask response 详解

    from flask import Flask,Response,jsonify #Flask = werkzeug(处理网络的) + sqlalchemy(处理数据库的) + jinja2 (处理模 ...

  8. request对象方法详解

    自己整理的 javax.servlet.http.HttpServletrequest 所有方法,欢迎收藏! 方法名 说明 isUserInRole 判断认证后的用户是否属于某一成员组 getAttr ...

  9. HTTP协议 (六) 状态码详解

    HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果 ...

随机推荐

  1. hdu 5532 Almost Sorted Array(模拟)

    Problem Description We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, ...

  2. Life is short, you need Python

    今年四五月份的时候我打算学一门计算机语言. 计算机语言实在是很多,选哪一个? 其实这个选择就和去市场买菜类似,想明白了自己的需求才能做好决定.你想做什么饭,就去买什么菜.想做南瓜粥,就要去买南瓜,想要 ...

  3. iOS 各种传值方式

    属性传值 将A页面所拥有的信息通过属性传递到B页面使用 B页面定义了一个naviTitle属性,在A页面中直接通过属性赋值将A页面中的值传到B页面. A页面DetailViewController.h ...

  4. Fiddler 跟踪 手机页面数据包

    随着 HTML5 的急速增长,现在越来越多的人,开始涉及到移动终端的 Web 开发领域,但手机端始终没有 PC 端这么多的调试工具.即使 PC 端浏览器模拟 user-agent 进行开发,也可能会发 ...

  5. Web--->>>Cookie与Session

    1.cookie 1.cookie是存在客户端(浏览器)的进程内存中和客户端所在的机器硬盘上 2.cookie只能能够存储少量文本,大概4K大小 3.cookie是不能在不同浏览器之间共享 3.创建c ...

  6. C#文件读写操作

    方法1:使用FileStream读写文件 using System;using System.Collections.Generic;using System.Text;using System.IO ...

  7. PhoneGap Xcode iOS教程

    http://mobile.51cto.com/web-334924.htmhttp://phonegap.com/install/http://www.phonegap100.com/jiaoche ...

  8. NHibernate各种数据库连接参数文件配置方法说明

    //NHibernate各种数据库连接参数文件配置方法说明 //配置文件Config/Hibernate.cfg.xml内容如下所示: <?xml version="1.0" ...

  9. oracle11g用户名密码不区分大小写

    oracle 11g 以前的版本的用户名和密码是不区分大小写的; oracle 11g 用户名和密码默认区分大小写,可更改alter system set sec_case_sensitive_log ...

  10. (转载)iscroll.js的使用

    入门 Scroll是一个类,每个需要使用滚动功能的区域均要进行初始化.每个页面上的iScroll实例数目在设备的CPU和内存能承受的范围内是没有限制的. 尽可能保持DOM结构的简洁.iScroll使用 ...