转自: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. sso单点登录解决方案收集

    本文来自:http://blog.csdn.net/huwei2003/article/details/6038017 我的想法是使用集中验证方式,多个站点集中Passport验证. 主站:Passp ...

  2. ASP.NET获取IP的6种方法 【转】

    ).ToString();//方法四(无视代理)HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR" ...

  3. 用Windows Live Writer 2012发博客

    一.软件准备: 最新版的是Windows Live Writer 2012,但是不提供单独的安装包,它是和微软其它软件一起的(包括MSN.Window Move Maker等),软件大小为131M,官 ...

  4. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  5. C# 根据年月获得此月第一天和最后一天,并计算工作日

    string str = "2015年3月"; ); ); , secondIndex - firstIndex - ); , ); DateTime dt = DateTime. ...

  6. sql语句批量处理Batch

    package Statement批量处理; import java.sql.Connection; import java.sql.DriverManager; import java.sql.St ...

  7. php 注释

    @access 使用范围:class,function,var,define,module 该标记用于指明关键字的存取权限:private.public或proteced @author 指明作者 @ ...

  8. ASP.Net引用类库出现问题 二

    一:引用mysql.data.dll出现,问题? error: Package MySql.Data (.NETCoreApp,Version=v1.). Package MySql.Data sup ...

  9. Jquery实现图片切换效果(IE,FF,Goole)都可以正常运行

    这里先对标签的样式进行设置(我这里只用了3张图片,可以根据自己的情况,添加) <style type="text/css"> /*展示图片切换的div样式*/ #Sho ...

  10. Spring2.0集成Quartz1.5.2调度框架

    Quartz是个开放源码项目,提供了丰富的作业调度集.希望您在阅读完本文并看过代码演示后,可以把Quartz的基本特性应用到任何Java™应用程序中.现代的Web应用程序框架在范围和复杂性方面都有所发 ...