BS结构的一个注册用户的功能
2024-08-28 02:11:05
注册用户功能
学了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();
}
}
}
最新文章
- Android Studio 基本使用
- Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突
- Runtime初学习
- H3C交换机配置
- 小白日记23:kali渗透测试之提权(三)--WCE、fgdump、mimikatz
- 转载SSIS中的容器和数据流—举例说明数据转换任务
- iOS之H5和Native混合开发
- webapi 上传图片
- sql 多条件查询 拼接字符串 改成 普通查询格式
- 自适应滤波器(Adaptive Filter)
- HTML5的兼容问题以及调用js文件的方法
- 高德地图JS API获取经纬度,根据经纬度获取城市
- long long
- 2.网络编程-udp
- DOM编程艺术推荐的addLoadEvent和insertAfter
- python笔记6-while、for循环
- 4、redis之使用commons-pool
- Android灯光系统--通知灯深入分析
- 计算时间:一个C++运算符重载示例
- THUSC2018退役预定
热门文章
- maven打包插件maven-assembly-plugin
- 054 Python程序设计思维
- MySQL索引原理及SQL优化
- Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
- 超级密码(BFS)
- Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群
- 细谈Redis五大数据类型
- 一起看期待已久的.NET Core 3.0新的单文件部署特性,记在昨日VS2019更新后
- python,json解析字符串时ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
- Scrapy项目 - 数据简析 - 实现斗鱼直播网站信息爬取的爬虫设计