注册用户功能

  学了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. 【Spring】 IOC Base

    一.关于容器 1. ApplicationContext和BeanFactory 2. 配置文件 XML方式 Java-configuration 方式 @Configuration 3. 初始化容器 ...

  2. Day002_LInux基础_常用命令

    #空格和tab键↓↓mkdir 创建目录 ↓ls list 显示目录里面的内容详情↓cd change directory 切换目录,进入到目录↓pwd 显示当前所在路径 ,定位↓###绝对路径和相对 ...

  3. 011 实例2-Python蟒蛇绘制

    目录 一."Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 二."Python蟒蛇绘制"实例编写 三.运行效果 3.1 程序关键 四." ...

  4. sqlserver 用户定义表类型

    有时需要将内存中的表与数据库中的表比较,比如Datatable中有100行数据,需要判断在数据库中是否存在,这个时候我们就可以使用sqlserver中的[用户 定义表类型] 这里最最最重要的思路是把[ ...

  5. Flutter开发环境配置(MAC版)

    一.配置镜像 打开命令终端,输入命令open ~/.bash_profile,打开bash_profile文本,添加镜像路径并保存 export PUB_HOSTED_URL=https://pub. ...

  6. Android 网络通信框架Volley(三)

    NetworkImageView 分析:public class NetworkImageView extends ImageView 他继承自ImageView,并且添加了一个新方法: public ...

  7. charles 发布Glist

    本文参考:charles 发布Glist Publish Gist /发布代码段 选中某个文件,点击Publish Gist,如果你没有github,这个文件将被匿名发布,您也就无法删除它: 当然你可 ...

  8. vue2.0搭建vue手脚架(vue-cli)

    1.安装node.js 从node官网下载并安装node,安装步骤很简单,只要一路“next”就可以了.安装完成后,打开命令行工具输入命令node -v,如下图,如果出现对应版本号,就说明安装成功了. ...

  9. 面试官: 聊一聊Babel

    点击关注本公众号获取文档最新更新,并可以领取配套于本指南的 <前端面试手册> 以及最标准的简历模板. 前言 Babel 是现代 JavaScript 语法转换器,几乎在任何现代前端项目中都 ...

  10. Vue学习之vue中的计算属性和侦听器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...