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" />男&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();
		}
	}		
}
原文地址:https://www.cnblogs.com/vfdxvffd/p/11694242.html