轉自: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向客戶端發送數據,以字節為單位(一定要先設置編碼方式,再輸出)
?
- String?data?=?"你好,中國1";??
- OutputStream?out?=?response.getOutputStream();??
- out.write(data.getBytes());//查找本機默認編碼進行編碼??
?
- ????String?data?=?"你好,中國2";??
- OutputStream?out?=?response.getOutputStream();??
- out.write(data.getBytes("UTF-8"));//以UTF-8進行編碼??
- //告訴瀏覽器編碼方式??
- response.setHeader("Content-Type","text/html;charset=UTF-8"?);??
?
- String?data?=?"你好,中國3";??
- OutputStream?out?=?response.getOutputStream();??
- out.write("<meta?http-equiv='Content-Type'?content='text/html;charset=UTF-8'>".getBytes());通過meta標簽模擬請求頭??
- out.write(data.getBytes("UTF-8"));//以UTF-8進行編碼??
?
- String?data?=?"你好,中國4";??
- ????OutputStream?out?=?response.getOutputStream();??
- ????response.setContentType("text/html;charset=UTF-8");??
- ????out.write(data.getBytes("UTF-8"));//以UTF-8進行編碼??
- ??
?
?
- response.setContentType("text/html;charset=UTF-8");??
?
等價于下面兩句代碼的效果:
response.setCharacterEncoding("UTF-8");//更改服務器發送數據的默認編碼
response.setHeader("Content-Type","text/html;charset=UTF-8");//還要通知客戶端解碼方式
?
- int?x=97;??
- OutputStream?out?=?response.getOutputStream();??
- 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"))
?
- //得到文件的真實路徑??
- String?realPath?=?getServletContext().getRealPath("/files/漂亮美眉.jpg");??
- //獲取文件名??
- String?name?=?realPath.substring(realPath.lastIndexOf("\\"));??
- ??
- //設置響應頭,通知客戶端以下載的方式打開文件??
- response.setHeader("Content-Disposition",?"attachment;filename="+URLEncoder.encode(name,?"UTF-8"));??
- ??
- //構建輸入流??
- ???InputStream?in?=?new?FileInputStream(realPath);??
- ?????
- ???//輸出到客戶端的流??
- ???OutputStream?out?=?response.getOutputStream();??
- ???int?len?=?-1;??
- ???byte?buf[]?=?new?byte[1024];??
- ???while((len=in.read(buf))!=-1)??
- ???{??
- ????out.write(buf,?0,?len);??
- ???}??
- ?????
- ???in.close();??
1.4?輸出隨機數字生成驗證碼圖片
?
?
- ????????//設置不要緩存(3種方式,建議三種都設置,防止瀏覽器不支持)??
- ????????response.addHeader("Pragma",?"no-cache");???
- ????????response.setHeader("Cache-Control",?"no-cache");???
- ????????response.setHeader("Expires",?"0");??
- ??????????
- ????????//1.內存圖像?BufferedImage??
- ????????BufferedImage?image?=?new?BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);??
- ??????????
- ????????//2.創建畫筆??
- ????????Graphics?g?=?image.getGraphics();??
- ??????????
- ????????//2.1畫邊框??
- ????????g.setColor(Color.GRAY);//設置邊框顏色??
- ????????g.drawRect(0,?0,?WIDTH,?HEIGHT);//畫矩形邊框??
- ????????//2.2填充邊框??
- ????????g.fillRect(1,?1,?WIDTH-1,?HEIGHT-1);??
- ??????????
- ????????//2.3輸出驗證隨機數字4個??
- ????????Random?r?=?new?Random();??
- ????????g.setColor(Color.BLUE);??
- ????????int?x?=?5;??
- ????????for(int?i=0;i<4;i++)??
- ????????{??
- ??????????
- ????????????g.setFont(new?Font("宋體",Font.BOLD,20));??
- ????????????g.drawString(r.nextInt(10)+"",?x,?20);??
- ????????????x+=30;??
- ????????}??
- ??????????
- ????????//2.4畫干擾線??
- ????????g.setColor(Color.YELLOW);??
- ????????for(int?i?=?0;i<9;i++)??
- ????????{?????
- ??????????????
- ????????????g.drawLine(r.nextInt(WIDTH),r.nextInt(HEIGHT),?r.nextInt(WIDTH),?r.nextInt(HEIGHT));??
- ????????}??
- ??????????
- ????????//3?利用response輸出流輸出image??
- ????????ImageIO.write(image,"jpeg",response.getOutputStream());<pre?name="code"?class="java">???????//response.setHeader("Expires",?(System.currentTimeMillis()+24*3600*10*1000)+"");//緩存10天??
- ????????response.setDateHeader("Expires",System.currentTimeMillis()+10*24*1000*60*60);</pre><br>??
- <pre></pre>??
- <p></p>??
- <pre></pre>??
- 1.5?控制客戶端刷新時間??
- <p></p>??
- <p></p>??
- <pre?name="code"?class="java">???????//response.setHeader("Refresh",?"5;URL=/day05/default.html");//5秒后跳轉,url是跳轉的鏈接??
- ?????????response.getOutputStream().write("<meta?http-equiv=\"Refresh\"?content=\"3;URL=/day05/login.html\">".getBytes());</pre>1.6?控制客戶端緩存時間??
- <p></p>??
- <p></p>??
- <pre?name="code"?class="java">??????//response.setHeader("Expires",?(System.currentTimeMillis()+24*3600*10*1000)+"");//緩存10天??
- ????????response.setDateHeader("Expires",System.currentTimeMillis()+10*24*1000*60*60);</pre><br>??
- 1.7?用response實現請求重定向??
- <p></p>??
- <p><img?src="http://hi.csdn.net/attachment/201202/14/0_13292204202s0e.gif"?alt=""></p>??
- <p>特點:地址欄會變,發送兩次請求,增加服務器負擔。</p>??
- <p>實現方式:response.sendRedirect()<br>??
- 實現原理:302狀態碼和location頭即可實現重定向<br>??
- </p>??
- <pre?name="code"?class="java">???????????//response.sendRedirect("/day05/servlet/ResponseDemo5");//絕對路徑??
- ?注意??????//?response.sendRedirect("/servlet/ResponseDemo5");//相對路徑這里用是錯誤的,因為重定向是由客戶端發起的??
- ??????????response.setStatus(307);//302?或者?307都可??
- ??????????response.setHeader("location",?"http://localhost:8080/day05/servlet/ResponseDemo1");</pre><br>??
- 1.8?小細節??
- <p></p>??
- <p></p>??
- <pre?name="code"?class="java">??????????String??s1?=?"abc";??
- ??????????String??s2?=?"def";??
- ??????????response.getOutputStream().write(s1.getBytes());??
- ??????????//response.getWriter().write(s2);??
- ??????????//注:getOutputStream和getWriter這兩個方法互相排斥,??
- ??????????//調用了其中的任何一個方法后,就不能再調用另一方法,會拋異常。??
- ??????????//java.lang.IllegalStateException:???
- ??????????//getOutputStream()?has?already?been?called?for?this?response</pre><br>??
- <p><br>??
- </p>??
- <p>二、request(HttpServletRequest)對象</p>??
- <p>2.1.get方法</p>??
- <p></p><pre?name="code"?class="java">?????????String?locale?=?request.getLocalName();//傳輸協議??
- ?????????String?url?=?request.getRequestURL().toString();//請求的地址??
- ?????????String?uri?=?request.getRequestURI();//沒有主機名的地址??
- ?????????String?protocol?=?request.getProtocol();//獲取協議??
- ?????????String??add?=?request.getRemoteAddr();//客戶端IP??
- ?????????String?host?=?request.getRemoteHost();//客戶端主機名??
- ?????????String?port?=?request.getRemotePort()+"";//客戶端端口號??
- ?????????String?method?=?request.getMethod();//客戶端的請求方式??
- ?????????String?localAddr?=?request.getLocalAddr();//獲取服務器地址??
- ?????????String?username?=?request.getParameter("username");//地址后面?請求的參數??
- ?????????String?serverPort?=?request.getServerPort()+"";//服務器端口號??
- ?????????String?serverName?=?request.getServerName();//服務器名</pre><br>??
- 2.2?獲取客戶端請求頭<p></p>??
- <p></p><pre?name="code"?class="java">???????????response.setContentType("text/html;charset=UTF-8");??
- ??
- ???????????PrintWriter?out?=?response.getWriter();??
- ???????????//獲取單個請求頭的值??
- ???????????out.write(request.getHeader("Accept-Language")+"<br/>");??
- ???????????//獲取單個請求頭多個值??
- ???????????Enumeration??headers?=?request.getHeaders("user-agent");??
- ???????????while(headers.hasMoreElements())??
- ???????????{??
- ???????????????out.println(headers.nextElement()+"<hr/>");??
- ???????????}??
- ?????????????
- ???????????//獲取所有的請求頭名??
- ???????????Enumeration?names?=?request.getHeaderNames();??
- ???????????while(names.hasMoreElements())??
- ???????????{???//根據請求頭名得到對應的值??
- ???????????????String?name?=?(String)names.nextElement();??
- ???????????????out.println(name+"="+request.getHeader(name)+"<br/>");??
- ???????????}</pre><br>??
- 2.3獲取請求參數<p></p>??
- <p>String?usernameValue?=?request.getParameter("username");//參數不存在為null<br>??
- </p>??
- <p></p><pre?name="code"?class="java">String?names[]?=?request.getParameterValues("username");??
- ????????for(String?name:names)??
- ????????{??
- ????????????System.out.println(name);得到某個請求參數的所有值??
- ??????????????
- ????????}</pre><pre?name="code"?class="java">?????????????//獲取所有的請求參數名??
- ??
- ????????Enumeration?names?=?request.getParameterNames();??
- ??????????while(names.hasMoreElements())??
- ??????????{??//根據參數名得到值??
- ??????????????String?name?=?(String)names.nextElement();??
- ??????????????System.out.println(name+"------->"+request.getParameter(name));??
- ??????????}</pre><br>??
- 2.4?封裝到bean<br>??
- <pre?name="code"?class="java">public?class?Student?{??
- ???private?String[]?username;??
- ???private?String?password;??
- ??????
- ???public?String[]?getUsername()?{??
- ????????return?username;??
- ????}??
- ????public?void?setUsername(String[]?username)?{??
- ????????this.username?=?username;??
- ????}??
- ????public?String?getPassword()?{??
- ????????return?password;??
- ????}??
- ????public?void?setPassword(String?password)?{??
- ????????this.password?=?password;??
- ????}??
- ?????
- ?????
- }??
- ??
- </pre><pre?name="code"?class="java">//利用BeanUtils和?getParameterMap()將對象封裝到bean??
- ????private?void?test5(HttpServletRequest?request)?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????Map?map?=?request.getParameterMap();??
- ????????Student?s?=?new?Student();??
- ????????try?{??
- ????????????BeanUtils.populate(s,?map);??
- ????????}?catch?(IllegalAccessException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}?catch?(InvocationTargetException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}??
- ????????String[]?names?=?s.getUsername();??
- ????????System.out.println(names[0]);//aa??
- ????????System.out.println(names[1]);//bb??
- ????????System.out.println(s.getPassword());//123??
- ????}//從客戶端傳過來的值username兩個(假如是aa和bb)?和一個password值(假如是123)</pre><br>??
- 2.5?得到請求正文<br>??
- <pre?name="code"?class="java">??????//獲取請求正文??
- ????????InputStream?in?=?request.getInputStream();??
- ????????byte[]?buf?=new?byte[1024];??
- ????????int?len?=?-1;??
- ????????while((len=in.read(buf))!=-1)??
- ????????{??
- ????????????System.out.println(new?String(buf,0,len));??
- ????????}</pre><br>??
- 2.6解決請求參數的中文亂碼<p></p>??
- <p>?get方式:先按照原編碼得到原始字節碼,然后再重新編碼。如:name?=?new?String(name.getBytes("ISO-8859-1"),"UTF-8");</p>??
- <p>post方式:客戶端是什么編碼,發送的請求數據就是什么編碼,根據客戶端的編碼,告知服務器編碼方式。</p>??
- <p>如:request.setCharacterEncoding("UTF-8");//?只適合POST請求方式</p>??
- <p><br>??
- </p>??
- <p>2.7請求轉發?forward</p>??
- <p><span?style="white-space:pre"></span>RequestDispatcher?rd?=?request.getRequestDispatcher("path");//得到轉發器,path可以是相對路徑或者絕對路徑(因為是服務器發起的)<br>??
- <span?style="white-space:pre"></span>rd.forward(request,?response);<br>??
- </p>??
- <p><img?src="http://hi.csdn.net/attachment/201202/14/0_1329238218CM8E.gif"?alt=""><br>??
- </p>??
- <p>2.8?包含include</p>??
- <p><span?style="white-space:pre"></span>RequestDispatcher?rd?=?request.getRequestDispatcher("/servlet/RequestDemo9");<br>??
- <span?style="white-space:pre"></span>rd.include(request,?response);<br>??
- </p>??
- <p><img?src="http://hi.csdn.net/attachment/201202/14/0_1329238034rHHG.gif"?alt=""><br>??
- </p>??
- <p>三?、路徑的寫法:<br>??
- a、絕對路徑寫法:ServeltContext都必須用絕對路徑。“/”開始?(如ServletContext.getRequestDispatcher("path")?path必須是絕對路徑)<br>??
- b、相對路徑:其他情況都可以使用相對路徑,也可以使用絕對路徑<br>??
- <br>??
- <br>??
- c、在使用絕對路徑時,要不要加"/"或者是項目名:如果是服務器調用的,不用加項目名,用“/”就可以代表了當前應用根目錄<br>??
- 如果是客戶端調用的,必須加上項目名<br>??
- <br>??
- <br>??
- 1、轉發:request.getRequestDispather(String?url)<br>??
- 絕對路徑:url????/servlet/ServletDemo<br>??
- 2、重定向:response.sendRedirect(String?url)<br>??
- 絕對路徑:url????/day05/servlet/ServletDemo<br>??
- <br>??
- <br>??
- 3、超鏈接:<a?href="url"/><br>??
- 絕對路徑:url??/day05/servlet/ServletDemo<br>??
- 4、類加載文件的路徑<br>??
- web應用中只能用相對路徑,相對于classes目錄的<br>??
- 5、<fomr?action="url"/><br>??
- 絕對路徑:/day05/servlet/ServletDemo<br>??
- 6、頁面分幀(frame)<br>??
- 絕對路徑:/day05/servlet/ServletDemo<br>??
- 7、ServletContext.getRealPath(url)<br>??
- 絕對路徑:url????/servlet/ServletDemo<br>??
- <br>??
- <br>??
- URLEncoder.encode("name",?"UTF-8")//解決文件下載名中文亂碼</p>??
- <p><br>??
- </p>??
- <p></p>??
- ? ? ?