Android開発、クライアントはローカルサーバーに接続し、データはMysqlに保存されます

クライアントはローカルサーバーに接続し、データをMysqlに保存し、クライアントとサーバー間の相互作用を実現します。

このブログは少し白く書かれているので、すべてのコードとオープンソースフレームワークを新しい視点で説明します。間違いがあれば、訂正して一緒に進んでください。
このブログの目的:

  1. Androidクライアントとローカルサーバー間のデータ送受信を実現し、相互作用を実現します。
  2. ローカルサーバーとMysqlデータベース間の接続、およびデータストレージを実現します。

Xiaobaiの手順:1。AndroidSDKに
は独自のSQLiteデータベースがあり、多くのローカルデータをこの軽量データベースに直接保存できます。また、greenDaoなどの優れたオープンソースフレームワークも多数あります。ただし、スタンドアロン以外のAndroidアプリケーションでコアデータをローカルに保存することは不可能であり、クライアントがデータベースに直接接続することはさらに不可能です。通常、クライアントはサーバーを処理します。クライアントは要求を送信し、サーバーは要求に応答します。3方向のハンドシェイクの後、データの相互作用が開始されます。ほとんどのデータベース操作はサーバー接続によって完了します。
まるでレストランに行って食事をするようなもので、シェフが冷蔵庫から食べ物を取り出して加工し、提示します。このシナリオでは、あなたがクライアントであり、シェフがサーバーであり、冷蔵庫がデータベースです。
2.ローカルサーバーは、クライアントとサーバー、およびローカルエリアネットワーク下のクライアントとクライアント間の相互作用を実現できます。Alibaba Cloud、Tencent Cloud、Huawei Cloudなどのクラウドサーバーを使用している場合は、ここでサーバーをセットアップし、パブリックネットワークIPに従ってWANネットワークにアクセスできます(つまり、モバイルデータを開くと、全国各地でアプリケーションを使用できます)。Xiaobaiはまだクラウドサーバーの構築について学んでおり、できるだけ早くそれを楽しみにしています。私はクラウドサーバーであまりにも多くの落とし穴に遭遇し、泣きました。

テキスト:
準備ツール:
1。Myeclipse(ローカルサーバーまたはeclipse-eeの構築に使用)2。Tomcat
サーバー(数M、オンラインで入手可能)
3。jdk
4. mysqlデータベース(なぜOracleではないのですか?これは無料だからです)
5。Navicatデータベースのビジュアルディスプレイ(良いもの、白黒を表示するためにコマンドラインを使用する必要はありません)
6。AndroidStudioAndroid開発アイデア(これはナンセンスです、嚯嚯)
オープンソースライブラリを準備します:
1.Okhttp
2 .struts

ツールのインストール方法については、あまり言いません。インターネットには、strutsライブラリの使用に関する多くの情報があります。
ここに画像の説明を挿入
すべてのソフトウェアがインストールされたら、開始できます。
———————————————————————
クライアント(AndroidStudio):
1。ネットワーク権限を追加します。

 <uses-permission android:name="android.permission.INTERNET" />

2. xmlファイル、2 EditText、1ボタン、1Textview。
ここに画像の説明を挿入

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".LinktoServerActivity">
    <EditText
        android:layout_weight="2"
        android:id="@+id/usenameer"
        android:hint="账号"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <EditText
        android:layout_weight="2"
        android:id="@+id/passworder"
        android:hint="密码"
        android:inputType="numberPassword"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <Button
        android:layout_gravity="center"
        android:id="@+id/dengluButton"
        android:text="登录"
        android:layout_width="80dp"
        android:layout_height="50dp" />
    <TextView
        android:id="@+id/xianshi"
        android:textSize="25dp"
        android:text="吧唧吧唧"
        android:layout_weight="1"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <LinearLayout
        android:layout_weight="4"
        android:layout_width="match_parent"
        android:layout_height="0dp"></LinearLayout>
</LinearLayout>
  1. Activity.javaファイル
package com.ilikelxystill.fuxi;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.ilikelxystill.fuxi.constant_package.Constant_name;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttp;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class LinktoServerActivity extends AppCompatActivity {
    
    
    private EditText usenameer,passworder;
    private TextView xianshi;
    private Button dengluButton;
    private Constant_name constant_name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linkto_server);
        init();
        constant_name = new Constant_name();

        LinkServerer();
    }

    public void init(){
    
    
        usenameer =(EditText)findViewById(R.id.usenameer);
        passworder =(EditText)findViewById(R.id.passworder);
        xianshi = (TextView)findViewById(R.id.xianshi);
        dengluButton =(Button)findViewById(R.id.dengluButton);

    }

    //连接服务器
    public void LinkServerer(){
    
    
         dengluButton.setOnClickListener(new View.OnClickListener() {
    
    
             @Override
             public void onClick(View v) {
    
    

                 //获取输入的数据
                 String getusenameer = usenameer.getText().toString();
                 String getpassworder = passworder.getText().toString();

                //建立客户端
                 OkHttpClient okHttpClient = new OkHttpClient();
                 //实例化请求构造器
                 Request.Builder builder = new Request.Builder();
                 Log.i("haha",constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder);
                 //构造器使用get方式绑定 url
                 Request request = builder.get().url(constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder).build();
                 //建立Call
                 Call call = okHttpClient.newCall(request);

                  call.enqueue(new Callback() {
    
    
                     @Override
                     public void onFailure(Call call, IOException e) {
    
    
                           Log.i("baba","shibai!!!!!!!!!!!!");
                     }

                     @Override
                     public void onResponse(Call call, Response response) throws IOException {
    
    
                         final String StrGetFromServer = response.body().string();
                         xianshi.post(new Runnable() {
    
    
                             @Override
                             public void run() {
    
    
                                 xianshi.setText(StrGetFromServer);
                             }
                         });

                     }
                 });
                 usenameer.setText("");
                 passworder.setText("");


             }
         });



    }
}

新しいパッケージを作成します。4. constant_package
Constant_name.java
ここに画像の説明を挿入

package com.ilikelxystill.fuxi.constant_package;

public class Constant_name {
    
    
    //电脑的主机地址,以及端口号,一般是8080
    private   String UrlInMyCompter = "http://192.168.3.6:8888/";
    //服务器项目名
    private  String Projectname = "FuxiServer/";
    public String getUrlInMyCompter() {
    
    
        return UrlInMyCompter;
    }
    public String getProjectname() {
    
    
        return Projectname;
    }


}

——————————————————————————

Myeclipse

サーバープロジェクト名:FuxiServer
ここに画像の説明を挿入
struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">


<struts>
   
      <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
       <!-- 在浏览器敲路径名/denglu,会找到class这个类,的denglu方法 -->
      <action name="Login" class="com.ilikexy.UserAction" method="index"></action>
    </package>
</struts>

UserAction.java

package com.ilikexy;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
//新建一个类,继承 ActionSupport
public class UserAction extends ActionSupport{
    
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String usename;
    private String password;
    public String index() throws IOException, SQLException, Exception{
    
    
    	System.out.println("账号:"+getUsename()+"\n"+"密码:"+getPassword());
    	
    	 //返回给客户端的信息
    	
    	HttpServletResponse response = ServletActionContext.getResponse();
    	response.setContentType("text/html;charset=utf-8");
    	//转化为写入
    	PrintWriter  writer = response.getWriter();
    
    	//将其写入数据库,当账号和密码都不为空时
    	if((!getUsename().equals(""))&&(!getPassword().equals(""))){
    
    
    		
    		Class.forName("com.mysql.cj.jdbc.Driver");
    	   //原生的Sql语句,向表中插入usename,和 password
    		String sql = "insert into fuxiRegister values('"+getUsename()+"','"+getPassword()+"')";
    	  //连接数据库路径,数据库名为firstdatabase
    		String linktodatabase = "jdbc:mysql://localhost:3306/firstdatabase?useSSL=false&serverTimezone=UTC";
    	  //建立数据库的连接
			Connection con = DriverManager.getConnection(linktodatabase,"root","123456");
		  //执行sql语句
			PreparedStatement prt = con.prepareStatement(sql);
		    prt.execute();
		    //存入成功返回给客户端信息
		  //写入信息
	    	writer.write("login successful !!!!");
	    	
    		
    	}else{
    
    
    		//写入信息
        	writer.write("login Fail !!!!");
    		
    	}	
    	return null;
    }
    
    
	public String getUsename() {
    
    
		return usename;
	}
	public void setUsename(String usename) {
    
    
		this.usename = usename;
	}
	public String getPassword() {
    
    
		return password;
	}
	public void setPassword(String password) {
    
    
		this.password = password;
	}
       
}

Navicat
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
に問題、エラーがあります。修正してください、qq:2569658002

おすすめ

転載: blog.csdn.net/qq_41904106/article/details/108392969