基于unity3d的用户表单数据验证
今天我们来谈一谈基于unity3d的表单验证。
先来看下架构图:

整体逻辑:用户通过游戏客户端登录界面,进入玩家界面。具体功能:实现数据的验证,判断用户是否存在!
游戏客户端:

C#脚本:

脚本文件是Login.cs,必须要绑定在Login组件上。如下:

从上图可以看到,Login组件下有两个参数,分别是UserName,PassWord组件。只有把UserName,PassWord组件绑定到Login组件,才可以在脚本里获取用户名与用户密码,然后服务器交互。
C#代码部分:
1 using System.Collections; 2 using System.Collections.Generic; 3 using System.Net; 4 using UnityEngine; 5 using UnityEngine.Networking; 6 using UnityEngine.SceneManagement; 7 using UnityEngine.UI; 8 9 public class Login : UnityEngine.MonoBehaviour 10 { 11 //定义文本提交对象,上文所说的UserName 与UserPassword 的两个组件会被unity引擎自动加载赋值给变量 12 public UnityEngine.GameObject UserName; 13 public UnityEngine.GameObject PassWord; 14 //定义用户名与密码 15 private string username; 16 private string password; 17 18 // 游戏方法初始化 19 void Start () { 20 this.GetComponent<Button>().onClick.AddListener(() => ClickButton(UserName,PassWord)); //当回调方法传递参数时,并且这个方法的参数是一个对象 21 } 22 23 // 游戏场景更新 24 void Update () { 25 26 } 27 28 //为登录按钮绑定事件 29 public void ClickButton(UnityEngine.GameObject UserName, UnityEngine.GameObject PassWord) 30 { 31 32 //获取玩家的用户名和密码 33 username = UserName.GetComponent<InputField>().text; 34 password = PassWord.GetComponent<InputField>().text; 35 36 //输出用户信息,用于调试 37 print("username====" + username); 38 print("password====" + password); 39 40 //调用方法进行加载 UpLoad()方法在下面定义 41 StartCoroutine(Upload()); 42 43 }
UpLoad()方法:
-
1 //upload()方法用于处理表单登录 返回值类型是:IEnumerator 2 IEnumerator Upload() 3 { 4 5 //新建一个表单 6 WWWForm formData = new WWWForm(); 7 8 //向表单中添加用户名与密码字段 9 formData.AddField("username",username); 10 formData.AddField("password", password); 11 12 //创建一个web请求对象 用的本地服务器 数据接口用的Servlet 13 UnityWebRequest www = UnityWebRequest.Post("http://localhost:8080/Hello/Login",formData); 14 15 //向tomcat服务器发送数据请求 16 yield return www.SendWebRequest(); 17 18 if(www.isNetworkError || www.isHttpError) 19 { 20 Debug.Log(www.error); 21 22 } 23 else 24 { 25 Debug.Log("Form complete"); 26 27 //当请求处理成功后 28 if (www.responseCode == 200) 29 { 30 //用于调试 31 print("处理请求成功"); 32 print("result" + www.downloadHandler.text); 33 34 //获取服务器返回结果 35 string result = www.downloadHandler.text; 36 37 //如果返回1,代表用户存在 38 if (result.Equals("1")) 39 { 40 SceneManager.LoadScene("002"); 41 } 42 //如果返回0用户不存在 43 else if (result.Equals("0")) 44 { 45 print("用户不存在"); 46 } 47 } 48 //请求处理失败 49 else if (www.responseCode == 404) 50 { 51 print("处理失败"); 52 } 53 } 54 } 55 }
接下来我们来瞧一瞧服务器架构逻辑:
-
![]()
-
从上图可发现:SRC目录下有7个包,分别是:
- link.VO:用来定义与数据库数据表映射的类
- link.DAO:用来定义操作数据表的接口
- link.DAO.Impl:用来定义实现操作数据表的接口类
- link.proxy:DAO操作的代理类
- link.DAO.factory:用于生产DAO类对象的工厂
- link.mysql:数据库连接类
- link.services:数据接口的定义
- 这里只有一个用户数据表,数据库如下:
![]()
- 这里只有一个用户。
- 下面看下Java代码:
- VO包下的User类:
-
View Code1 package link.VO; 2 3 //用户类 4 public class User { 5 6 //用户名 7 private String UserName; 8 //用户密码 9 private String UserPassword; 10 //构造方法 11 public User(){ 12 this.UserName = null; 13 this.UserPassword = null; 14 } 15 //有参构造方法 16 public User(String username,String userpass){ 17 this.UserName = username; 18 this.UserPassword = userpass; 19 } 20 //set和get方法 21 public String getUserName() { 22 return UserName; 23 } 24 25 public void setUserName(String userName) { 26 UserName = userName; 27 } 28 29 public String getUserPassword() { 30 return UserPassword; 31 } 32 33 public void setUserPassword(String userPassword) { 34 UserPassword = userPassword; 35 } 36 }
DAO包下的User接口:
-
View Code1 package link.DAO; 2 //用户的DAO接口 3 import link.VO.User; 4 5 public interface UserDAO { 6 7 //查找登录用户是否存在 8 public boolean FindLogin(User user); 9 10 }
DAO.Impl包下的User接口实现类:
-
View Code1 package link.DAOImpl; 2 import java.sql.Connection; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import link.DAO.UserDAO; 7 import link.VO.User; 8 9 public class UserDAOImpl implements UserDAO{ 10 11 //定义用户私有变量 12 private User user; 13 //定义数据库连接符 14 private Connection conn = null; 15 //定义数据库链接查询符 16 private PreparedStatement ps = null; 17 18 //无参构造方法 19 public UserDAOImpl(){ 20 this.user = null; 21 } 22 //有参构造方法 23 public UserDAOImpl(Connection conn){ 24 this.conn = conn; 25 } 26 27 //实现查找用户是否存在的方法 28 @Override 29 public boolean FindLogin(User user){ 30 31 System.out.println("username===>"+user.getUserName()); 32 System.out.println("password===>"+user.getUserPassword()); 33 34 //设一个标志,判断用户是否存在 35 boolean flag = false; 36 37 try { 38 39 //定义一个sql语句 40 String sql = "select user_name from fengku.user_info where user_name='"+user.getUserName()+"' and user_password='"+user.getUserPassword()+"'"; 41 System.out.println("sql==="+sql); 42 43 //准备sql语句 44 this.ps = this.conn.prepareStatement(sql); 45 //向语句中拼接数据,分别是用户名和密码 46 //this.ps.setString(1,user.getUserName()); 47 //this.ps.setString(2,user.getUserPassword()); 48 49 //System.out.println("sql==="+sql); 50 51 //执行sql语句 52 ResultSet rs = this.ps.executeQuery(sql); 53 if(rs.next()){ 54 //记录存在设置为真 55 flag = true; 56 } 57 } catch (SQLException e) { 58 // TODO Auto-generated catch block 59 e.printStackTrace(); 60 } finally{ 61 //ps资源符用完就要立刻关闭,数据库连接符不需要立刻关闭 62 if(this.ps!=null){ 63 try{ 64 this.ps.close(); 65 }catch(SQLException e){ 66 e.printStackTrace(); 67 } 68 } 69 } 70 71 return flag; 72 } 73 }
proxy包下的User代理类:
-
View Code1 package link.proxy; 2 3 import link.DAO.UserDAO; 4 import link.DAOImpl.UserDAOImpl; 5 import link.VO.User; 6 import link.mysql.GetMysqlCon; 7 /* 8 * 9 * 用户DAO的代理类 10 * 11 */ 12 13 public class UserDAOProxy implements UserDAO{ 14 15 private GetMysqlCon dbc = null; 16 private UserDAO userDAO = null; 17 18 //代理类构造方法 19 public UserDAOProxy(){ 20 21 this.dbc = new GetMysqlCon(); 22 23 this.userDAO =new UserDAOImpl(dbc.getMysqlCon()); 24 25 } 26 27 //判断用户是否存在 28 @Override 29 public boolean FindLogin(User user) { 30 31 boolean flag = true; 32 try{ 33 //判断该用户是否存在 34 flag = this.userDAO.FindLogin(user); 35 }catch(Exception e){ 36 e.printStackTrace(); 37 }finally{ 38 //关闭数据库 39 dbc.closeMysql(); 40 } 41 return flag; 42 } 43 44 45 }
DAO工厂类,用于生产各个DAO类:
-
View Code1 package link.DAO.factory; 2 3 import link.DAO.UserDAO; 4 import link.proxy.UserDAOProxy; 5 6 //DAO工厂类定义 7 public class DAOFactory { 8 9 //使用静态方法 10 public static UserDAO GetUserInstance(){ 11 12 //返回一个DAO代理类对象 13 return new UserDAOProxy(); 14 } 15 }
mysql包下的数据库连接类:
-
View Code1 package link.mysql; 2 //导入相关类包 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 //MySQL数据库连接类定义 8 public class GetMysqlCon { 9 10 //定义一个数据库连接符 11 private Connection MysqlCon = null; 12 13 //构造方法 14 public GetMysqlCon(){ 15 16 try{ 17 //加载驱动 18 Class.forName("com.mysql.jdbc.Driver"); 19 }catch(Exception e){ 20 //信息报错 21 System.out.println(e.toString()); 22 System.out.println("驱动加载失败"); 23 } 24 //如果MysqlCon为空,获取一个连接符资源 25 try{ 26 this.MysqlCon = DriverManager.getConnection(MysqlConfig.path, MysqlConfig.username, MysqlConfig.password); 27 28 }catch(SQLException e){ 29 System.out.print(e.toString()); 30 System.out.println("MySQL连接符获取失败"); 31 } 32 } 33 //MySQL连接资源释放 34 public void closeMysql(){ 35 try { 36 this.MysqlCon.close(); 37 38 } catch (SQLException e) { 39 40 e.printStackTrace(); 41 System.out.println("MySQL连接资源释放出错"); 42 } 43 } 44 //获取数据库连接符的get与set方法 45 public Connection getMysqlCon() { 46 return MysqlCon; 47 } 48 49 public void setMysqlCon(Connection mysqlCon) { 50 MysqlCon = mysqlCon; 51 } 52 53 54 }
services包下的接口:
-
View Code1 package link.services; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import link.DAO.UserDAO; 11 import link.DAO.factory.DAOFactory; 12 import link.VO.User; 13 import link.proxy.UserDAOProxy; 14 15 /* 16 * Servlet implementation class Login 17 */ 18 @WebServlet("/Login") //注释 19 public class Login extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 22 /** 23 * @see HttpServlet#HttpServlet() 24 */ 25 public Login() { 26 super(); 27 // TODO Auto-generated constructor stub 28 } 29 30 /** 31 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 32 */ 33 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 // TODO Auto-generated method stub 35 36 } 37 /** 38 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 39 */ 40 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 42 //设置编码格式 43 request.setCharacterEncoding("utf-8"); 44 //获取表单信息 45 String username = request.getParameter("username"); 46 String password = request.getParameter("password"); 47 //输出用户表单信息,用于调试 48 System.out.println("username====>"+username); 49 System.out.println("password====>"+password); 50 51 //定义一个输出流对象 52 PrintWriter out = response.getWriter(); 53 //创建一个DAO对象 54 UserDAO UserDAO = DAOFactory.GetUserInstance(); 55 User user = new User(username,password); 56 boolean flag = UserDAO.FindLogin(user); 57 //如果用户存在,向服务器返回1 58 if(flag){ 59 System.out.println("用户存在"); 60 out.write("1"); 61 //如果用户不存在,向服务器返回0 62 }else{ 63 System.out.println("用户不存在"); 64 out.write("0"); 65 } 66 67 } 68 69 }
注意:这里没有在后台对数据进行安全性过滤,只是实现了简单的功能!
- 操作一遍:
- 运行unity3d,输入表单数据
![]()
- 登录成功跳转到玩家界面:
![]()
- 用户信息监听结果显示:
![]()






浙公网安备 33010602011771号