基于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.  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类:
  •  1 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 }
    View Code

    DAO包下的User接口:

  •  1 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 }
    View Code

    DAO.Impl包下的User接口实现类:

  •  1 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 }
    View Code

    proxy包下的User代理类:

  •  1 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 }
    View Code

    DAO工厂类,用于生产各个DAO类:

  •  1 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 }
    View Code

    mysql包下的数据库连接类:

  •  1 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 }
    View Code

    services包下的接口:

  •  1 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 }
    View Code

     

    注意:这里没有在后台对数据进行安全性过滤,只是实现了简单的功能!

  • 操作一遍:
  • 运行unity3d,输入表单数据
  • 登录成功跳转到玩家界面:
  • 用户信息监听结果显示:

posted on 2018-01-19 17:29  sunhongyi  阅读(173)  评论(0)    收藏  举报

导航