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

[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. 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 输出随机数字生成验证码图片

[java] view plaincopy

    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>
时间: 2024-08-03 06:50:30

Request和Response详解的相关文章

【黑马程序员】第8课:Request与Response详解

<pre> day08 昨天内容回顾 (1)servlet三种实现的方式 (2)servlet的生命周期 *三个方法 init service  destroy (3)URL-Pattern的配置有三种 (4)路径的问题 *绝对路径 /day09/.... *重定向和转发 (5)ServletConfig对象 *初始化参数的配置 <init-param> <param-name> <param-value> ..... (6)ServletContext对象

Servlet中Request和Response 详解

一.Response 1.Resonse的继承结构:   ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容都可以由它进行操作,由此引伸出如下实验: 3.利用Response输出数据到客户端  response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服

容器Response详解

今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了.下面我们就来看一下Response容器的相关知识吧.Response和我们即将在后面说到的Request容器是一一对应的,他是web容器在用户每次请求服务端的时候,创建的一对容器对象,Response容器是服务端返还给客户机的一个响应内容对象容器,比如说:响应头,响应行,实体数据等信息,而Request容器对象是,代表用户请求服务端的的一个容器对象,比如客户机的请求头,请求行,以及携带的参

HttpServletResponse response详解

1 //内容类型和编码格式可以被调用多次,最后一次将覆盖之前的设置 2 //内容类型和编码格式必须在 3 //设置内容类型getWriter和getOutputStream方法之前调用,否则不起作用 4 //若未设置则返回的数据将使用web容器默认的编码 5 response.setHeader("Content-type", "text/html;charset=UTF-8"); 6 //设置编码格式 7 response.setCharacterEncoding

HTTP协议 (六) 状态码详解

HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫,机器人等程序.还是需要了解其他状态码.  本文我花了一个多月的时间把所有的状态码都总结了下,内容太多,看的时候麻烦耐心点了. HTTP状态码的学习资料到处都有,但是都是理论上讲解.  本文介绍HTTP协议中的HTTP状态码(HTTP Status Code), 会对大部分的状态码都进行了详细的实例讲

response和request详解

JavaEE:response响应和request请求 Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象既然代表请求和响应,那么我们要获取客户机提交过来的数据,只需要找request对象,就行了.要向客户机输出数据,只需要找response对象就行了. HttpServletRequest封装客户端相关信息,服务器Servlet程序可以通过request对象操作客户端信

javaweb part3 ----HTTP协议详解,以及java中request response的类以及方法

HTTP协议详解Requsert Headers 浏览器 向服务器 发送的 请求信息Get /Myweb/persons.html HTTP/1.1 (必须)Host:localhost:8080Connection:keep-alive Accept支持格式:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8User-Agent:兼容浏览器的版本Accept-

Tomcat架构详解(三) Request和Response处理的全过程

从Tomcat源码分析(二)可知,用户的一个请求会经过n个环节的处理,最后到达开发人员写的Servlet,传给Servlet也就是HttpServletRequest和HttpServletResponse,因此可以认为这一路走下来无非就是把最原始的Socket包装成Servlet里用到的HttpServletRequest和HttpServletResponse,只不过每个环节完成的包装功能和部分不一样而已,信息流如下图所示: 其中,Request与Response的类图如下所示: org.a

JSP request.setAttribute()详解及实例

 javascript request.setAttribute()详解 request.setAttribute()怎么用的? JSP1代码 ? 1 2 3 4 5 String [] test=new String[2]; test[0]="1"; test[1]="2"; request.setAttribute("test",test) ; response.sendRedirect("jsp2.jsp"); JSP2