1.1 案例一:完成登陸用戶對他提供文件的下載的功能.html
1.1.1 需求:web
以前的案例中已經完成的了一個登陸的功能,登陸失敗後回到登陸頁面.登陸成功之後,服務器提供多個文件的下載的連接,點擊連接能夠完成文件的下載的功能.數據庫
1.1.2 分析:數組
1.1.2.1 技術分析:瀏覽器
響應行:緩存
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); } }
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}