JavaSE02_Day05(中)-WebServer項目(十):完成注冊業務


一、webserver注冊業務(續)

完成注冊業務:用戶打開注冊頁面,輸入注冊信息后點擊注冊按鈕,服務端在接受這些數據后寫入文件中,並響應注冊成功。

頁面完成注冊流程

步驟1:在webapps/myweb目錄下新建一個注冊頁面:reg.html,頁面中表單提交的地址指定為:reg

步驟2:由於請求中的url中可能包含用戶提交的數據,對此我們在解析請求時要對url進行進一步解析 。

  將其拆分2部分: 請求路徑與參數部分,並且對參數再次進行進一步解析,得到每個具體的參數。

  2.1 重構HttpRequest解析請求行的代碼

  2.2 定義三個屬性:

    String requesturi 存儲url請求部分

    String queryString 存儲url中的參數部分

    Map parameters 存儲具體的每一個參數 key:參數名 value:參數值

  2.3 提供一個方法: parseURL,該方法要對url進行進一步解析,並將解析出來的內容分別設置到 (2.2)中定義的屬性中 。

  2.4 在原來的解析請求行中的方法內,當獲得到url后,就調用parseURL,對其進一步解析。

  2.5 在(2.2)定義的屬性對外提供get方法。

步驟3:創建一個包:servlets

  定義一個用於處理注冊業務的類:RegServlet,並定義一個用於處理注冊的方法service

步驟4:在ClientHandler處理請求的地方再添加一個分支,先根據請求判斷是否為請求注冊業務,如果是請求注冊業務,則實例化一個 RegServlet並調用其service方法處理;如果不是,則執行原流程,判斷是否請求一個資源。

步驟5:在webapps/myweb下新建一個注冊成功頁面:reg_success.html頁面

步驟6:完成RegServlet的service方法,在該方法中首先獲取用戶提交的注冊信息,並寫入user.txt文件之后,設置response響應注冊成功頁面。

注意:在注冊時年齡填寫不正確,報錯NumberFormatException:For input string:"xxx" 包裝類把字符串轉換成數字時會拋出異常,里面輸入的不是數字。

reg_fail.html

 <!DOCTYPE html>
 <html>
     <head>
         <meta charset="UTF-8">
         <title>注冊失敗</title>
     </head>
     <body>
         <h1>該用戶已經被注冊過,請重新注冊用戶!!!</h1>
     </body>
 </html>

RegServlet.java

 package cn.tedu.servlets;
 
 import java.io.File;
 import java.io.RandomAccessFile;
 import java.util.Arrays;
 import cn.tedu.http.HttpRequest;
 import cn.tedu.http.HttpResponse;
 
 /**
  *
  * @author cjn
  *
  */
 public class RegServlet {
 
     public void service(HttpRequest request, HttpResponse response) {
         /*
          * 1.從paramters這個Map中取出對應key的value值
          * 2.檢查用戶是否已經注冊過
          * 3.將沒有注冊過的用戶信息存儲到user.dat文件中
          * 4.注冊成功以后,響應一個注冊成功的頁面,反之注冊失敗響應注冊失敗的頁面
          * username=包佳奇
          * password=123456
          * nickname=baozi
          * age=30
          */
         String userName = request.getParamters("username");
         String password = request.getParamters("password");
         String nickName = request.getParamters("nickname");
         Integer age = Integer.parseInt(request.getParamters("age"));
         System.out.println("用戶名:" + userName + ",密碼:" + password
                 + ",昵稱:" + nickName + ",年齡" + age);
             
         //創建文件對象
         try (RandomAccessFile raf = new RandomAccessFile("user.txt", "rw");){
             //判斷該用戶是否已經注冊過,沒有重復注冊過的用戶才可以進行執行下面注冊的邏輯
             for (int i = 0; i < raf.length()/100; i++) {
                 //文件中有多少個用戶就循環多少次
                 raf.seek(i * 100);
                 //根據每位用戶的開始位置讀取該用戶的用戶名(去除空格)
                 byte[] data = new byte[32];
                 raf.read(data);
                 String name = new String(data, "utf-8").trim();
                 if (name.equals(userName)) {
                     //將要注冊的用戶已經注冊過,提示該用戶已經注冊過
                     response.setEntity(new File("webapps/myweb/reg_fail.html"));
                     //結束處理注冊業務的方法
                     return;
                }
            }
 
             //將用戶需要注冊的信息存儲到user.txt文件中,每個信息占用規定的字節
             //嚴謹性操作:后注冊的用戶不能覆蓋掉之前注冊的用戶,移動到文件的末尾位置
             raf.seek(raf.length());
             //對用戶名進行寫出
             byte[] arrayName = userName.getBytes("utf-8");      
             arrayName = Arrays.copyOf(arrayName, 32);
             raf.write(arrayName);
        
             //對密碼進行寫出
             byte[] arrayPassword = password.getBytes("utf-8");
             arrayPassword = Arrays.copyOf(arrayPassword, 32);
             raf.write(arrayPassword);

             //對昵稱進行寫出
             byte[] arrayNick = nickName.getBytes("utf-8");
             arrayNick = Arrays.copyOf(arrayNick, 32);
             raf.write(arrayNick);

             //對年齡進行寫出,注意此處是writeInt而不是write
             raf.writeInt(age);
             
             System.out.println(userName+"用戶注冊完畢");
             //目前測試沒有響應報空指針異常,注冊成功后,響應注冊成功頁面
             response.setEntity(new File("webapps/myweb/reg_success.html"));
        } catch (Exception e) {
             e.printStackTrace();
        }  
    }
 
 }

測試:啟動webserver10版本項目的WebServer主類,然后打開瀏覽器,在瀏覽器的地址欄中輸入http://localhost:8888/myweb/reg.html顯示一個注冊頁面,在注冊頁面中填寫相關的注冊信息,建議用戶名處和昵稱處寫英文,填寫完注冊的信息以后,點擊注冊按鈕,查看是否有提示注冊成功的頁面顯示,並且查看控制台中是否有相關報錯。然后再次回到注冊頁面,再次進行注冊之前注冊過的用戶,查看瀏覽器中是否顯示該用戶已經被注冊過的信息。

 

二、查詢注冊過的用戶信息

 package cn.tedu.core;
 
 import java.io.IOException;
 import java.io.RandomAccessFile;
 
 /**
  * 用於顯示user.dat文件中用戶信息內容
  * @author cjn
  *
  */
 public class ShowUserInfoDemo {
 
     public static void main(String[] args) throws IOException {
         RandomAccessFile raf =
                 new RandomAccessFile("user.txt", "r");
         //使用for循環遍歷用戶信息
         for (int i = 0; i < raf.length()/100; i++) {
             byte[] data = new byte[32];
             raf.read(data);
             String name = new String(data, "utf-8");
             System.out.println(raf.getFilePointer());
             
             raf.read(data);
             String password = new String(data, "utf-8");
             System.out.println(raf.getFilePointer());
             
             raf.read(data);
             String nick = new String(data, "utf-8");
             System.out.println(raf.getFilePointer());
                     
             int age = raf.readInt();
             System.out.println(raf.getFilePointer());
             
             System.out.println(name.trim()+","+password.trim()+","+nick.trim()+","+age);
             
        }
         System.out.println("查詢完畢");
         raf.close();
                 
 
    }
 
 }
 

測試結果:啟動ShowUserInfoDemo類即可

 32
 64
 96
 100
 baojaiqi,123456,baozi,30
 查詢完畢

 

三、企業的開發流程

  • 項目是真實來自於市場的應用

  • 未來大家入職企業中進行開發(外包、承接外部項目、內部系統)

  • 需求的分析、需求的評審、UI設計、功能開發、功能測試、驗收、項目上線、版本的迭代、系統運維、運營推廣

  • 后續有時間再詳細明確每一個步驟的開發流程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM