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.      

转载于:https://www.cnblogs.com/name-hanlin/p/5059965.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Maven与Ivy集成

问题是&#xff1a;您在Ivy存储库中&#xff08;只有那里&#xff09;有一些资源&#xff0c;您想在基于Maven的项目中使用这些资源。 可能的解决方案&#xff1a; 由于Ivy可以轻松使用Maven风格的存储库&#xff08;因此&#xff0c;您的Ivy客户端可以继续使用Ivy并进行一些微…

用python下载辞典

用python下载词源词典Etymoline Online Etymology Dictionary是最好的 English 词源词典&#xff0c;现在来说没有之一。但是&#xff0c;一直在PC上查单词有时不是很方便&#xff0c;遂就想怎么才能在手机上使用。现在的手机上的词典&#xff0c;除了BlueDict、MDict之外&…

程序员都用什么来记录知识_1年前的小五都用 Python 来做什么?

↑ 点击上方 “凹凸数据” 关注 星标 ~ 每天更新&#xff0c;干货不断 (多图预警)注&#xff1a;这是小五一年前在知乎的回答&#xff0c;当时还只有凹凸数读一个公众号&#xff0c;所以很多图片都会带有数读或者知乎的水印。作为一个菜鸟数据分析师&#xff0c;只会sqlpytho…

CSDN编程挑战——《高斯公式》

高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:12..1005050。现在问题在于给你一个正整数n&#xff0c;问你他可以表示为多少种连续正整数之和&#xff1f;&#xff08;自身也算&#xff09;。 输入格式&#xff1a; 多组数据&#xff0c;每组数据一行&#xff0c…

SQL-行转列(PIVOT)实例1

--未旋转之前的查询结果 select s.Name ShiftName,h.BusinessEntityID,d.Name as DpartmentName from HumanResources.EmployeeDepartmentHistory h inner join HumanResources.Department d on h.DepartmentIDd.DepartmentIDinner join HumanResources.Shift s on s.ShiftIDh…

将MongoDB与Morphia结合使用

在过去的几年中&#xff0c; NoSQL数据库&#xff08;例如CouchDB&#xff0c;Cassandra和MongoDB&#xff09;在不需要运行传统RDBMS的语义和开销的应用程序中得到了普及。 我不会进入选择NoSQL数据库的设计决策&#xff0c;因为其他人已经做得很好&#xff0c;但是我将结合我…

webservice接口_webservice服务器端发票识别接口

关键词&#xff1a;发票识别 私有云发票识别 发票识别API接口 webservice发票识别平台发票&#xff0c;一个再也熟悉不过的财务往来凭证&#xff0c;录入发票&#xff0c;一项让多少财会人员头疼的工作。过去录入一张发票需要一个财会人员5分钟的时间&#xff0c;那么这个人在工…

二叉树学习——简单入门题

入门题一&#xff1a; 输入一颗二叉树&#xff0c;你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到它的移动序列给出 &#xff08;L表示左&#xff0c;R表示右&#xff09;。在输入中&#xff0c;每个节点的左括号和右括号之间没有空格&#…

java8-4 多态的练习以及题目

1、/* 多态练习&#xff1a;猫狗案例*/ 1 class Animal {2 public void eat(){3 System.out.println("吃饭");4 }5 }6 7 class Dog extends Animal {8 public void eat() {9 System.out.println("狗吃肉"); 10 } 11 12 public void lookDoor() { 13 Syste…

一个简单的socket通信小demo

写了一个socket的程序&#xff0c;可以和本地的服务器进行通信&#xff0c;要先和服务器建立链接&#xff0c;然后发送登录信息&#xff0c;验证成功&#xff0c;就可以和服务器通信了 1 页面截图 2 点击链接服务器&#xff0c;可以链接服务器&#xff0c;服务器的ip地址为&…

Java并发教程– CountDownLatch

Java中的某些并发实用程序自然会比其他并发实用程序受到更多关注&#xff0c;因为它们可以解决通用问题而不是更具体的问题。 我们大多数人经常遇到执行程序服务和并发集合之类的事情。 其他实用程序不太常见&#xff0c;因此有时它们可​​能会使我们逃脱&#xff0c;但是请记…

汉仪尚巍手书可以商用吗_【商用车维修】夏天修空调可以撑起全年修车收入的一半,你会了吗?...

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;车载空调是炎热的季节必不可少的利器&#xff0c;但用得多&#xff0c;毛病也多了起来&#xff0c;今天和大家分享一些空调系统的相关知识&#xff0c;助力修车师傅们来应对空调系统的相关故障问题。如何判断制冷系统的…

CSDN编程挑战——《-3+1》

-31 题目详情: 有一个数列&#xff0c;所有的数都是非负整数&#xff0c;你可以进行如下方式进行一次操作&#xff08;注意一次完整的操作必须先后完成如下两个步骤&#xff09;&#xff1a; &#xff08;1&#xff09; 任选一个不小于3的数&#xff0c;把它减少3。 &#xff…

游戏感悟

1.所谓游戏平衡&#xff0c;就是指玩家没有最优解。 2.所谓公司的文化&#xff0c;就是指员工被公司洗脑的那些观点(认知)。 3.人是能动的&#xff0c;摆脱平庸。转载于:https://www.cnblogs.com/yangzhou33/p/5074509.html

Git 简单使用

1.Git是什么 简介&#xff1a;Git是 Linux 之父 Linus Trovalds&#xff0c;为管理 Linux 内核代码而建立的&#xff0c;被认为是分布式版本控制工具中的顶级水准。智能、友好、强健、高效。 作用&#xff1a;新建一个分支&#xff0c;把服务器上最新版的代码fetch下来&#x…

Vaadin附加组件和Maven

介绍 我喜欢Vaadin的 &#xff08;众多&#xff09;一件事是它对Vaadin框架的“附加组件”社区-他们称之为Vaadin目录 。 “附加组件”是框架中社区贡献的附加组件&#xff0c;可以是任何东西&#xff0c;例如从新的客户端小部件到数据表的延迟加载容器。 我肯定会为Activiti看…

八皇后时间复杂度_【算法打卡】N皇后

难度&#xff1a;困难题目&#xff1a;n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n&#xff0c;返回 n 皇后不同的解决方案的数量。提示&#xff1a;皇后&#xff0c;是国际…

Android-Binder 简析

前言 对于Android来说&#xff0c;Binder的重要性怎么说都不为过。不管是我们的四大组件Activity、Service、BroadcastReceiver、ContentProvider&#xff0c;还是经常在应用中使用到的各种ServiceManager&#xff0c;其背后都是Binder在支撑。然而Binder机制又不是三言两语能够…

CSDN编程挑战——《进制转换》

进制转换 题目详情: 我们通常用的十进制数包含0-9十个数字。假设有一种进制系统包含3种数字&#xff0c;从低到高分别为"oF8”&#xff0c;那么从1到9分别表示为F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF。给定一种进制的数和两种进制的数字表&#xff0c;请把它从第一种进…

tplink 703刷固件

1.软件下载: ImageBuilder链接 如果是全新刷机的话,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin 如果是系统升级的话,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/op…