一、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
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");