BS结构的一个注册用户的功能
注册用户功能
学了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" />男
<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="提交数据"/>
<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结构的一个注册用户的功能的更多相关文章
- 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!
不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- 07-SSH综合案例:前台用户模块:结构创建及注册页面跳转
现在就不要直接访问一个JSP,要通过一个Action映射过去.我现在点击要去一个注册的页面 这还不是一个真正的注册,只是一个页面的跳转. 1.5.2 用户模块 注册功能: 在index.jsp页面中点 ...
- 注册一个GitHub用户的过程
今天,我注册了一个GitHub用户.一开始,不知道GitHub是什么,还以为叫什么"getup",心里还想着什么网站名字这么奇怪,后来在舍友的帮助之下知道了原来是叫GitHub.下 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 1_python小程序之实现用户的注册登陆验证功能
python小程序之实现用户的注册登陆验证功能 程序扼要简述: 一.程序流程:1.程序开始2.判断本地文件/数据库是否已存在用户信息,存在则跳转到登陆,否则跳转到注册,注册成功后后跳转到登陆3.判断 ...
- java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框
LoginDialog类的代码修改如下: package com.swift.frame; import java.awt.EventQueue; import java.awt.event.Acti ...
- 自动化测试(二)如何用python写一个用户登陆功能
需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...
- 什么是CS和BS结构,两种结构的区别
什么是CS和BS结构,两种结构的区别 什么是C/S和B/S结构? C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系 ...
随机推荐
- 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)
作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点.这是因为控制器有很多,具体实现大相径庭:且控制器的实现用到了一些较 ...
- LeetCode go
用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就没有了尊严. 1. 两数之和 题目 ...
- springboot的Interceptor、Filter、Listener及注册
springboot拦截器: public class Interceptor implements HandlerInterceptor{ private Logger logger = Logge ...
- http压力测试工具及使用说明
http压力测试工具及使用说明 转 说明:介绍几款简单.易使用http压测工具,便于研发同学,压测服务,明确服务临界值,寻找服务瓶颈点. 压测时候可重点以下指标,关注并发用户数.TPS(每秒事务数量) ...
- 内存泄露检测工具Valgrind
内存泄露简介 什么是内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 内存泄 ...
- 代理损失函数(surrogate loss function)
Surrogate loss function,中文可以译为代理损失函数.当原本的loss function不便计算的时候,我们就会考虑使用surrogate loss function. 在二元分类 ...
- STL中区间最值max_element和min_element的用法
前面的博客已经讲解了nth_element寻找区间第K大的用法,现在我们来说说这两个找区间最值的用法.两个函数都包含在algorithm库中. 一.函数原型 max_element template& ...
- 一个基于vue的时钟
前两天写了一个基于vue的小钟表,给大家分享一下. 其中时针和分针使用的是图片,结合transform制作:表盘刻度是通过transform和transformOrigin配合画的:外面的弧形框框,啊 ...
- java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...
- Chrome 查看产品原型图
1.找到产品发的原型图 2.找到文件resources\chrome\axure-chrome-extension,修改文件的后缀为rar,然后解压 3.找到chrome的extensions,找到开 ...