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设计、功能开发、功能测试、验收、项目上线、版本的迭代、系统运维、运营推广

  • 后续有时间再详细明确每一个步骤的开发流程

 

posted @ 2021-07-20 23:20  Coder_Cui  阅读(423)  评论(0编辑  收藏  举报