android客户端和servlet服务端的简单登录实现
16lz
2021-01-23
本文实现了一个android客户端输入用户名和密码登录跳转到其他android客户端界面的简单demo,主要是熟悉android客户端的网络编程,服务端的编程,数据库的操作。
1、android客户端
主界面如下所示:
对应的布局文件:
activity_main.xml
上述布局对应的Java代码:
package com.yqq.loginclient;import com.yqq.loginclient.utils.LoginUtils;import android.app.Activity;import android.content.Intent;import android.os.AsyncTask;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {private EditText mUserName;private EditText mPassword;private Button mLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUserName=(EditText) findViewById(R.id.et_user_name); mPassword=(EditText) findViewById(R.id.et_user_password); mLogin=(Button) findViewById(R.id.btn_sure); mLogin.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(TextUtils.isEmpty(mUserName.getText().toString().trim())||TextUtils.isEmpty(mPassword.getText().toString().trim())){Toast.makeText(MainActivity.this, "数据不能为空!!!", 300).show();}else{new AsyncTask() {String result1=null;@Overrideprotected Void doInBackground(Void... params) {//必须开启子线程访问网络//提交数据到服务器result1=LoginUtils.connect("172.22.122.1", mUserName.getText().toString().trim(), mPassword.getText().toString().trim());return null;}@Overrideprotected void onPostExecute(Void result) {if(result1==null){return ;}if(result1.equals("welldone")){startActivity(new Intent(MainActivity.this,MyTestActivity.class));finish();}else{Toast.makeText(MainActivity.this,result1,300).show();}super.onPostExecute(result);}}.execute();}}}); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
对应的布局文件my_test_activity_layout.xml
<?xml version="1.0" encoding="utf-8"?>
上述布局对应的Java代码:
package com.yqq.loginclient;import android.app.Activity;import android.os.Bundle;public class MyTestActivity extends Activity {public MyTestActivity() {// TODO Auto-generated constructor stub}@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.my_test_activity_layout);}}
联网访问服务器的工具类:
package com.yqq.loginclient.utils;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * 连接服务器 * * @author yqq_coder * */public class LoginUtils {public LoginUtils() {// TODO Auto-generated constructor stub}/** * http://10.1.17.208:8080/LoginService/LoginServlet?userName=Lihua&passWord=123456 * http://localhost:8080/?userName=Lihua&passWord=123456 * @param ip 服务器IP * @param userName GET方式传递参数用户名 * @param passWord 密码 * @return */public static String connect(String ip, String userName, String passWord) {String str = "http://" + ip+ ":8080/LoginService/LoginServlet?userName="+userName+"&passWord="+passWord;URL url=null;InputStream inputStream = null;HttpURLConnection connection = null;StringBuffer sb = null;// 线程安全try {url = new URL(str);//获得URL对象try {connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(3000);connection.setRequestMethod("GET");//GET方式提交参数connection.setDoOutput(true);//设置可以向服务器读写connection.setDoInput(true);//请求成功if (connection.getResponseCode() == 200) {inputStream = connection.getInputStream();Reader reader = new InputStreamReader(inputStream, "UTF-8");//打包成字符流BufferedReader bufferedReader = new BufferedReader(reader);String str1 = null;sb = new StringBuffer();while ((str1 = bufferedReader.readLine()) != null) {sb.append(str1);}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (MalformedURLException e) {e.printStackTrace();//关闭流很重要} finally {if (inputStream != null) {try {inputStream.close();inputStream = null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (connection != null) {connection.disconnect();connection = null;}}if (sb != null) {return new String(sb);}return "服务器异常!";}}
客户端demo下载地址:http://download.csdn.net/detail/u014600432/8187637
2、servlet服务端
2.1开启MySQL数据库。
方式一、利用命令行操作数据库
(1)命令行执行 create database logininfo;创建logininfo数据库。
(2)创建数据表
(3)插入数据
中文不成功,要改变编码方式。
(4)查询结果
(5)其他
方式二、写Java代码用JDBC框架操作数据库
类似数据库操作代码如下:
import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class DbUtis {private static Connection conn;public static JSONArray getData(String name) throws SQLException {List infos = new ArrayList();JSONArray array = new JSONArray();GpsInfo info = null;JSONObject jsonObject = null;PreparedStatement pstmt =null;ResultSet rs = null;// 连接数据库try {Class.forName("com.mysql.jdbc.Driver");// 链接数据库conn = DriverManager.getConnection("jdbc:mysql://192.168.253.1:3306/test", "root", "admin");// Statement stmt =(Statement) conn.prepareStatement("");String sql="select name,longitude,latitude from gpsinfos where name=?";pstmt= conn.prepareStatement(sql);pstmt.setString(1, name);rs = pstmt.executeQuery();// 从结果集里取值//System.out.println(rs.getRow());while (rs.next()) {// info=new GpsInfo();// info.setLatitude(rs.getString(0));//纬度// info.setLongitude(rs.getString(1));// infos.add(info);// info=null;jsonObject = new JSONObject();try {jsonObject.put("name", rs.getString("name"));jsonObject.put("longitude", rs.getString("longitude"));jsonObject.put("latitude", rs.getString("latitude"));array.put(jsonObject);jsonObject=null;} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();} }} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (rs != null) {rs.close();rs = null;}if(pstmt!=null){pstmt.close();pstmt = null;}if (conn != null) {conn.close();conn = null;}}return array;}public static void insertGpsInfos(GpsInfo info) throws SQLException{PreparedStatement pstmt = null; // 数据库表达式 ResultSet rs = null; // 结果集 try { /*加载驱动*/ //192.168.173.1 Class.forName("com.mysql.jdbc.Driver"); /*连接到数据库*/ conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", "admin"); String sql = "insert into gpsinfos (name,longitude,latitude) values (?,?,?)"; /* 获取表达式*/ pstmt = conn.prepareStatement(sql); pstmt.setString(1,info.getName()); pstmt.setString(2, info.getLongitude()); pstmt.setString(3, info.getLatitude()); /* 插入数据*/ pstmt.execute(); /* 执行SQL*/ rs = pstmt.executeQuery("select * from gpsinfos"); /* 查看里面的数据*/ while (rs.next()) { System.out.println("姓名=" + rs.getString("name")); System.out.println("经度=" + rs.getString("longitude")); System.out.println("纬度=" + rs.getString("latitude")); } } catch (SQLException ex) { ex.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(rs!=null){ rs.close(); } if(pstmt!=null){pstmt.close();pstmt = null;} if(conn!=null){ conn.close(); } } }public static void createTable() throws SQLException{try {//Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.173.1:3306/test","root","admin");String sql = "CREATE TABLE gpsinfos (id int primary key auto_increment, name varchar(64) not null, longitude varchar(256) not null , latitude varchar(256) not null );";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.executeUpdate();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[]args) throws SQLException{/*try {createTable();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}*///insertGpsInfos(new GpsInfo("小强","5225.1111111","5333333.888222"));System.out.println(DbUtis.getData("Lihua"));}}
本文的数据库操作类如下:
package com.yqq.loginservice.DButis;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.transaction.Synchronization;//JDBC框架完成数据库查询public class TestDbUtils {// 表示定义数据库的用户名private final String USERNAME = "root";// 定义数据库的密码private final String PASSWORD = "admin";// 定义数据库的驱动信息private final static String DRIVER = "com.mysql.jdbc.Driver";//定义数据库连接private static Connection mConnection;//定义访问数据库的地址private final String URL = "jdbc:mysql://172.22.122.1:3306/logininfo";// 定义sql语句的执行对象可以防止输入注入private PreparedStatement pstmt;// 定义查询返回的结果集合private ResultSet resultSet;//静态快加载驱动static{try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static TestDbUtils mTestDbUtils;public static synchronized TestDbUtils getSington(){if(mTestDbUtils==null){mTestDbUtils=new TestDbUtils();}return mTestDbUtils;}public List
2.2servlet子类
package com.yqq.loginservice;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import java.util.Map;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.yqq.loginservice.DButis.TestDbUtils;public class LoginServlet extends HttpServlet {private TestDbUtils mTestDbUtils;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//设置编码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("utf-8");PrintWriter out=resp.getWriter();//获得客户端提交的参数String uesrName=req.getParameter("userName");String password=req.getParameter("passWord");System.out.print("提交的参数:"+uesrName+password);if(checkLogin(uesrName, password)){out.write("welldone");System.out.print("返回的数据:"+"welldone"+"登录成功");}else{out.write("登录失败该用户不存在!请先注册!");System.out.print("返回的数据:"+"登录失败该用户不存在!请先注册!");}out.flush();}/** * 查询数据库检查是否有该参数存在 * @param userName用户名 * @param password密码 * @return */private boolean checkLogin(String userName,String password){List> results=new ArrayList>();//获得数据库操作实例mTestDbUtils=TestDbUtils.getSington();results=mTestDbUtils.getCheckUserInfo();System.out.println(results.toString());for(Map map:results){if(map.get("userName").equals(userName)&&map.get("passWord").equals(password)){return true;}}return false;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req,resp);}@Overrideprotected void service(HttpServletRequest arg0, HttpServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(arg0, arg1);}@Overridepublic void destroy() {// TODO Auto-generated method stubsuper.destroy();}@Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);}}
该类必须进行配置:
用http协议访问的时候:http://ip+web工程名+servlet子类。
http://10.1.17.208:8080/LoginService/LoginServlet?userName=Lihua&passWord=123456
demo下载地址:http://download.csdn.net/detail/u014600432/8187651
更多相关文章
- android SQLite数据库存储数据
- Android 数据库简单操作
- android客户端向服务端传汉字乱码问题
- SSH服务器与Android通信(2)--Android客户端接收数据
- 在Android中创建和使用数据库
- HNU_团队项目_Android和数据库对接出现问题总结
- Android中数据存储——SQLite数据库存储数据
- android客户端控制树莓派GPIO点亮LED灯