requet&response

requet&response


1.1 案例一:完成登陸用戶對他提供文件的下載的功能.html

1.1.1 需求:web

以前的案例中已經完成的了一個登陸的功能,登陸失敗後回到登陸頁面.登陸成功之後,服務器提供多個文件的下載的連接,點擊連接能夠完成文件的下載的功能.數據庫

1.1.2 分析:數組

1.1.2.1 技術分析:瀏覽器

【響應對象-Response對象】

響應行:緩存

Response設置狀態碼:服務器


響應頭:post

Response設置響應頭:優化

* 一個key對應一個value網站


* 一個key對應多個value

響應體:
Response設置響應體:

【亂碼】

字節流:

設置瀏覽器默認打開編碼

response.setHeader("Content-Type", "text/html;charset=UTF-8");

中文轉成字節數組編碼

response.getOutputStream().write("王守義".getBytes("UTF-8"));

字符流:

設置response的緩衝區的編碼

response.setCharacterEncoding("UTF-8");

設置瀏覽器默認打開的編碼.

response.setHeader("Content-Type", "text/html;charset=UTF-8");

response.setContentType("text/html;charset=UTF-8");至關於上面兩句

【文件下載】

一種:超連接方式.(不推薦)

* <a href=」aa.zip」>下載</a>

* <a href=」1.jpg」>下載</a>

二種:手動編碼方式完成文件下載.

* 設置兩個頭和一個流:

* Content-Type:文件MIME的類型.

* Content-Disposition:

* 文件的輸入流:

1.1.2.2 步驟分析:

以前的登陸案例已經存在:

登陸成功跳轉的頁面上提供一組連接:

當點擊下載的連接以後,提交到Servlet:

設置兩個頭和一個流:

1.1.3 代碼實現:

1.在頁面中提供一組下載的連接:

response.getWriter().println("<h2>手動編碼方式下載</h2>");

response.getWriter().println("<a href='/WEB10/downloadServletfilename=a.bmp'>a.bmp</a><br/>");

response.getWriter().println("<a href='/WEB10/downloadServletfilename=WEB01.zip'>WEB01.zip</a>");

 

2.編寫DownloadServlet:

protected void doGe
(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

/**

* 接收參數:

* 設置兩個頭和一個流:

* 文件輸入流和響應的輸出流對接:

*/
// 接收參數:get亂碼 new String("中文".getBytes("ISO-8859-1"),"UTF-8");


String filename = request.getParameter("filename");

System.out.println(filename);
// 設置兩個頭和一個流:
// 設置Content-Type頭
String fileType = this.getServletContext().getMimeType(filename);
response.setContentType(fileType);
// 設置Content-Disposition:
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 設置文件的輸入流:
String path = this.getServletContext().getRealPath("/download/"+filename); // 
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
}

 

【總結】

1.1.4.1 中文文件名下載:

中文文件在不一樣的瀏覽器中編碼方式不一樣:

IE :URL編碼

Firefox :Base64編碼

if(agent.contains("Firefox")){

// 火狐瀏覽器

filename = base64EncodeFileName(filename);
}else{
// IE,其餘瀏覽器
filename = URLEncoder.encode(filename, "UTF-8");
}

public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=UTF-8B"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

 

reg and login

1.2.1 需求:

在商城的網站上完成一個註冊的功能:


1.2.2 分析:

1.2.2.1 技術分析

【請求對象-request對象】

得到客戶機信息:

* getMethod(); ---得到請求方式.

* getQueryString(); ---得到請求路徑後的參數.

* getRemoteAddr(); ---得到客戶機的IP地址.

* getRequestURI(); ---得到請求的路徑

* getRequestURL(); ---得到請求的路徑

* getContextPath(); ---得到工程名

得到請求頭

* request.getHeader(「User-Agent」);

* request.getHeader(「Referer」);

請求參數:

用來做爲域對象存取值:


1.2.2.2 步驟分析:

步驟一:設計註冊頁面:

步驟二:點擊頁面中的註冊的按鈕:提交到Servlet中.

步驟三:在Servlet中接收參數:

步驟四:封裝實體中.

步驟五:調用業務層.處理數據.

步驟六:根據處理的結果作出響應.
1.2.3 代碼實現:
1.建立數據庫
create database web10;
use web10;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date,
hobby varchar(50)
);
2.接收參數:
* request.getParameter(String name);
* request.getParameterValues(String name);
* request.getParamaterMap();
3.參數接收中的亂碼處理.
POST亂碼處理:
* <form method=」post」>的時候,這種提交纔是POST提交.其餘的都是get.
* POST方式提交的參數在請求體中.request對象在後臺接收參數.request對象有緩存區.默認緩衝區的編碼ISO-8859-1.
* 處理方式:設置request的緩衝區的編碼.
* request.setCharacterEncoding(「UTF-8」);

GET方式亂碼處理:
* GET方式提交的參數會在地址欄上顯示 在請求行的路徑後面.瀏覽器就會對路徑進行一次編碼.將編碼後內容取出來.再進行一次編碼.
* 處理方式:
* 修改服務器提交的編碼.
* 採用URLEncoder 和 URLDecoder類對中文進行編碼和解碼.
* 使用String類的構造方法:
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username);

4.數據的封裝:BeanUtils.(內省技術) 1.2.4 總結: 1.2.4.1 轉發和重定向的區別: 【重定向】 response.sendRedirect(String path); -- 完成重定向 【轉發】 request.getRequestDispatcher(String path).forward(request,response); 【區別】 1.轉發的地址欄不變的.重定向的地址欄發生變化的. 2.轉發是一次請求一次響應,重定向是兩次請求兩次響應. 3.request域對象存取的值在轉發中是有效的,在重定向無效的. 4.轉發的路徑不須要加工程名.重定向的路徑須要加工程名. 1.2.4.2 使用轉發和重定向對登陸的功能優化: 使用request域保存一個值:在一次請求範圍內有效的. 登陸失敗就能夠保存一個錯誤信息到request中在動態頁面中取出這個值${msg}

本站公眾號
   歡迎關注本站公眾號,獲取更多信息