注册用户功能

  学了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. Empire – PowerShell 后渗透攻击框架

    0x01 简介 Empire是一个后开发框架.它是一个纯粹的PowerShell代理,具有加密安全通信和灵活架构的附加功能.Empire具有在不需要PowerShell.exe的情况下执行PowerS ...

  2. Navicat Premium基本使用

    Navicat Premium基本使用 转自:https://blog.csdn.net/Yangchenju/article/details/80633055 Navicat Premium基本使用 ...

  3. 前端利器躬行记(5)——Git

    Git是一款开源的分布式版本控制系统,它的出现和Linux紧密相关.Linux内核项目组为了能更好地管理和维护Linux内核开发,于2002年开始启用商业的分布式版本控制系统BitKeeper.虽然软 ...

  4. 前端 页面加载完成事件 - onload,五种写法

    在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...

  5. zookeeper 集群相关配置实践

    一,zookeeper 集群下载及配置 1.1, 准备三台服务器node1,node2,node3. 1.2, [root@liunx local]#yum install -y java #安装ja ...

  6. 03 (H5*) Vue第三天

    目录: 1:Vue-resource中的全局配置. 2:Vue动画2部曲 3:animate动画 4:钩子函数动画 5:组件三部曲,推荐使用template标签来创建组件模板 1:Vue-resour ...

  7. 基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  8. Android [启动方式:standard singleTop singleTask singleInstance]

    栈顶Activity是当前正在显示的. 以A.B举例 1.standard 不同的Activity都存放在同一个栈中,每次创建实例都会堆放到栈顶,逐次返回直至退出. 创建实例B 创建实例A 点击返回时 ...

  9. 第九周java动手动脑

    1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. import java.io.IOException; import java.nio.fi ...

  10. 如何把安全证书导入到java中的cacerts证书库

    每一步:进入某个https://www.xxx.com开头的网站,把要导入的证书下载, 在该网页上右键 >> 属性 >> 点击"证书" >> 再 ...