注册用户功能

  学了Java一段时间,就想折腾折腾,就做了一个注册的功能,用HTML写了一个网页上的比较简陋的界面,用Java做了一个后台简陋的服务器处理数据,最后将数据存储到数据库中。

注册界面

  先是最简单的用HTML表单做一个简陋的界面,上一个效果图:

  这块就直接上代码了,用到了HTML的表单,没有什么花里胡哨的渲染美化

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<fieldset id="">
<legend>注册区域</legend> <!--这里说明一下,action是提交的服务器的IP是192.168.37.1 使用的端口是10003,这些都要与服务器相对应,提交方式是post,安全-->
<form action="http://192.168.37.1:10003" method="post">
<table border="1" bordercolor="blue" cellspacing="0" width="600" cellpadding="5">
<tr>
<th colspan="2">注册页面</th>
</tr>
<tr>
<td>用户名(U):</td>
<td><input type="text" name="username" id="" value="" /></td>
</tr>
<tr>
<td>密码(P):</td>
<td><input type="password" name="pas" id="" value="" /></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type="password" name="surepas" id="" value="" /></td>
</tr>
<tr>
<td>性别:</td>
<td><input type="radio" name="sex" value="male" />男&nbsp;&nbsp;&nbsp;
<input type="radio" name="sex" value="fmale" />女
</td>
</tr>
<tr>
<td>国家:</td>
<td>
<select name="country">
<option value ="none">--选择国家--</option>
<option value ="China">--中国--</option>
<option value ="America">--美国--</option>
<option value ="Japan">--日本--</option>
</select>
</td> </tr>
<tr>
<td>技术:</td>
<td>
<input type="checkbox" name="technology" value="Java" />Java
<input type="checkbox" name="technology" value="Html" />Html
<input type="checkbox" name="technology" value="Css" />Css
<input type="checkbox" name="technology" value="JavaScript" />JavaScript
</td>
</tr>
<tr>
<th colspan="2">
<input type="submit" value="提交数据"/>&nbsp;&nbsp;&nbsp;
<input type="reset" value="重置数据" />
</th>
</tr>
</table> </form>
</fieldset>
</body>
</html>

数据库的塑造

  然后是对数据库的塑造,主要是建库和创建table。

create table user(
username varchar(15) primary key, //用户名 主键约束
password varchar(15), //密码
country varchar(15), //国家
sex varchar(10), //性别
technology_one varchar(10), //技术一,以下分别是2,3,4
technology_two varchar(10),
technology_thr varchar(10),
technology_fou varchar(10)
); //一个插入的示例
insert into user values('ergouzi','123456','China','male','Java','Html',null,null);

后台

思路

  通过将网页表单中传回来的数据处理得到用户提交的注册信息,然后通过分析,如果符合规范则将其存入数据库中。

处理传回来的信息

网页上通过post方式提交的数据格式是这样的:

POST / HTTP/1.1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
Accept-Language: zh-CN
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate
Host: 192.168.37.1:10003
Content-Length: 65
Connection: Keep-Alive username=1&pas=1&surepas=1&sex=male&country=China&technology=Html

  可以看出最后一句是我们想得到的内容,然后通过正则表达式进行切割,就可以得到一个个信息的键值对,用“=”分割即可得到用户的注册信息。

代码实现
// 接收浏览器表单界面发送回来的注册信息,最后将注册信息保存在info里并返回
public static String getInfo(Socket s) throws IOException
{
//先将从客户端读取到的信息存到一个文件中
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
FileOutputStream fos = new FileOutputStream("D://forio//demo.txt");
fos.write(buf, 0, len); //再从文件中读取到最后一行就是所求的info信息,不要问我为什么搞得这么麻烦,因为其他方法都会抛出异常,只有这种没问题
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D://forio//demo.txt")));
String info ; while ((info = br.readLine()) != null) {
if(info.contains("&"))
{
fos.close();
br.close();
return info;
}
}
return info;
}

向数据库中加入新用户

链接数据库之前先得设置一些常量值

private static final String DB_URL = "jdbc:mysql://localhost:3306/unkonwn?useSSL=false&&serverTimezone=UTC";
private static final String NAME = ""; //用户名,一般为root
private static final String PASSWORD = ""; //数据库的密码
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";

通过上一个函数返回的存储着注册信息的字符串数组来加入数据库中。

public static boolean mysqlcon(String[] arr) throws ClassNotFoundException, SQLException {
Connection conn = null; // 注册JDBC驱动
Class.forName(JDBC_DRIVER); // 打开链接
// System.out.println("连接数据库 。。。");
conn = DriverManager.getConnection(DB_URL, NAME, PASSWORD); // 预执行sql语句
String sql = "insert into user(username,password,country,sex,technology_one,technology_two,technology_thr,technology_fou) values(?,?,?,?,?,?,?,?)";
PreparedStatement presta = conn.prepareStatement(sql); // 设置sql语句中的values值
presta.setString(1, arr[0].split("=")[1]);
presta.setString(2, arr[1].split("=")[1]);
presta.setString(3, arr[4].split("=")[1]);
presta.setString(4, arr[3].split("=")[1]); //因为技术这一选项是不定项选择,所以这样才能保证把所选技术正确加入数据库
//从第五个字段开始是技术
int i = 5; //arr的长度标数据的数量,这些应该填入注册时候的信息
for(i = 5; i <= arr.length - 1; i++)
{
presta.setString(i, arr[i].split("=")[1]);
} //从数据的数量+1开始就应该是没有的技术了,填入null
for( ;i <= 8; i++)
{
presta.setString(i, null);
} // 执行sql语句
try {
presta.execute();
} catch (SQLIntegrityConstraintViolationException e) {
return false;
}
return true;
}
}

实现main函数

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException; public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
System.out.println("服务端 run..."); // 服务端
ServerSocket ss = new ServerSocket(10003); while(true)
{
// 接收客户端
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()); // 打印连接的客户端主机 try { // 接收浏览器表单界面发送回来的注册信息,最后将注册信息保存在info里
String info = getInfo(s);
// 切割字符串info,得到注册信息键值对
String[] arr = info.split("&"); // 判断两次输入的密码是否一样,如果不一样,直接注册失败,直接将结果显示在浏览器上
if (!arr[1].split("=")[1].equals(arr[2].split("=")[1])) {
System.out.println("注册失败!");
PrintWriter out = new PrintWriter(s.getOutputStream());
out.println("<font size='7' color='red'>注册失败!两次输入的密码不一致!</font>");
out.flush();
return;
} // 调用函数向数据库中加入新用户,如果成功,则在浏览器上显示注册成功,否则显示注册失败
if (mysqlcon(arr)) {
System.out.println("新增加一位用户!");
PrintWriter out = new PrintWriter(s.getOutputStream());
out.println("<font size='7' color='red'>注册成功!</font>");
out.flush();
} else {
System.out.println("注册失败!");
PrintWriter out = new PrintWriter(s.getOutputStream());
out.println("<font size='7' color='red'>注册失败!</font>");
out.flush();
}
} finally {
// 关闭客户端和服务端
s.close();
}
}
}

BS结构的一个注册用户的功能的更多相关文章

  1. 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!

    不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  3. 07-SSH综合案例:前台用户模块:结构创建及注册页面跳转

    现在就不要直接访问一个JSP,要通过一个Action映射过去.我现在点击要去一个注册的页面 这还不是一个真正的注册,只是一个页面的跳转. 1.5.2 用户模块 注册功能: 在index.jsp页面中点 ...

  4. 注册一个GitHub用户的过程

    今天,我注册了一个GitHub用户.一开始,不知道GitHub是什么,还以为叫什么"getup",心里还想着什么网站名字这么奇怪,后来在舍友的帮助之下知道了原来是叫GitHub.下 ...

  5. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  6. 1_python小程序之实现用户的注册登陆验证功能

    python小程序之实现用户的注册登陆验证功能 程序扼要简述:  一.程序流程:1.程序开始2.判断本地文件/数据库是否已存在用户信息,存在则跳转到登陆,否则跳转到注册,注册成功后后跳转到登陆3.判断 ...

  7. java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框

    LoginDialog类的代码修改如下: package com.swift.frame; import java.awt.EventQueue; import java.awt.event.Acti ...

  8. 自动化测试(二)如何用python写一个用户登陆功能

    需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...

  9. 什么是CS和BS结构,两种结构的区别

    什么是CS和BS结构,两种结构的区别 什么是C/S和B/S结构?         C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系 ...

随机推荐

  1. C++ 深入浅出工厂模式(初识篇)

    初识工厂模式 我们先看工厂模式的介绍 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创 ...

  2. Nginx总结(六)nginx实现负载均衡

    前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...

  3. Linux ln 软、硬链接

    最近在学习Linux系统的,给我的感觉就是“智慧的结晶,智慧的大脑,智慧的操作” 今天研究到了一个有趣的命令  ln   我们先来看一下它的概念吧 Linux ln命令是一个非常重要命令,它的功能是为 ...

  4. linux 操作系统级别监控 iostat 命令

    iostat命令可以查看当前机器磁盘io的数据 命令:iostat -x -k 1 -x:展示磁盘的扩展信息 -k:以k为单位展示磁盘数据 1:每1秒刷新一次 展示结果 util:磁盘IO使用率,单位 ...

  5. Driect3D初始化演示

    初始化Direct3D演示 初始化Driect3D类: #include "Common\d3dApp.h" #include <DirectXColors.h> us ...

  6. CSS3动画animation认识,animate.css的使用

    CSS动画 可以取代js动画 在移动端会更加流畅! 下面是一个的绘制太阳系各大行星运行轨迹笔记,可以自学参考! -------------------------------------------- ...

  7. zookeeper伪集群

    Zookeeper运行需要java环境,需要安装jdk,建议本地下载好需要的安装包然后上传到服务器上面,服务器上面下载速度太慢. 上传 [root@192 ~]# java -version java ...

  8. 安全性测试:OWASP ZAP 2.8 使用指南(三):ZAP代理设置

    ZAP本地代理设置 如前文所言,ZAP的工作机制,是通过“中间代理”的形式实现. ZAP的代理设置可以从菜单中的:工具 - 选项 - Local Proxies加载. 在这里可以设置ZAP用来接受接入 ...

  9. Introduction to ES6上课笔记

    课程链接:https://scrimba.com/g/gintrotoes6 这个网站有几个热门的前端技术栈的免费课程,上课体验除了英语渣只能看代码理解听老师讲的一知半解之外,是极佳的学编程的网站了. ...

  10. SpringBoot起飞系列-入门(一)

    一.SpringBoot简介 1.1 什么是SpringBoot 说到spring系列,可能大家都很熟悉,spring.springmvc,美之名曰:spring全家桶,那么springboot其实也 ...