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
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.