Android开发入门案例

初次接触安卓,做出来一个还能看的案例,类似小说阅读的APP,将源码记录一下

一、案例效果

1.登录界面

在这里插入图片描述

2.注册界面

在这里插入图片描述

3.用户信息显示界面

在这里插入图片描述

4.小说阅读界面

在这里插入图片描述

二、安卓代码

1.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mychat">
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activities.LoginActivity">
            <!--过滤器规定的是首先展示的Activity-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".activities.SuccessActivity"></activity>
        <activity android:name=".activities.RegisterActivity"></activity>
        <activity android:name=".activities.ReadingActivity"></activity>

    </application>

</manifest>
2. 布局
2.1activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:clickable="true"
    tools:context="com.example.mychat.activities.LoginActivity">

    <EditText
        android:id="@+id/et_login_uname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名:" />

    <EditText
        android:id="@+id/et_data_upass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码:"
        android:inputType="number"/>

    <TextView
        android:id="@+id/msg_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btn_login"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="loginPOST"
        android:background="@color/colorMine"
        android:text="点击登陆" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn_register"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorMine"
        android:onClick="doReg"
        android:text="点击注册" />
</LinearLayout>
2.2activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/et_data_uname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名:" />

    <EditText
        android:id="@+id/et_data_upass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码:"
        android:inputType="number"/>

    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入年龄:" />

    <EditText
        android:id="@+id/et_gender"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入性别:" />

    <EditText
        android:id="@+id/et_reading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入正在阅读的小说,使用封号隔开:" />

    <EditText
        android:id="@+id/et_favorite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入喜欢的小说类型" />

    <TextView
        android:id="@+id/msg_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <!--<Button
        android:id="@+id/btn_login"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="toLogin"
        android:background="@color/colorMine"
        android:text="去登陆页面" />-->

    <ImageView
        android:id="@+id/image01"
        android:layout_width="505dp"
        android:layout_height="206dp"
        android:layout_gravity="center"
        android:src="@mipmap/bbb" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn_register"
        android:layout_width="490dp"
        android:layout_height="31dp"
        android:layout_gravity="center"
        android:background="@color/colorMine"
        android:onClick="registerPOST"
        android:text="点击注册" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn_login"
        android:layout_width="491dp"
        android:layout_height="37dp"
        android:layout_gravity="center"
        android:background="@color/colorMine"
        android:onClick="toLogin"
        android:text="去登陆页面" />


</LinearLayout>
2.3activity_success.xml
<?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:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/wel"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="尊敬的用户,欢迎您回来,您的信息如下:"
        android:gravity="center"
        android:background="@color/colorMine2"/>

    <TextView
        android:id="@+id/user_name"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="姓名:朱有财"
        android:gravity="left"
        android:background="@color/colorMine"/>

    <TextView
        android:id="@+id/user_gender"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="性别:女"
        android:gravity="left"
        android:background="@color/colorMine"/>
    <TextView
        android:id="@+id/user_age"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="芳龄:18"
        android:gravity="left"
        android:background="@color/colorMine"/>

    <TextView
        android:id="@+id/user_interests"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="兴趣爱好:玄幻,科技,穿越,重生"
        android:gravity="left"
        android:background="@color/colorMine"/>

    <TextView
        android:id="@+id/user_read"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="已经阅读书籍: 甄嬛传,三体"
        android:gravity="left"
        android:background="@color/colorMine"/>

    <!--<ImageView
        android:id="@+id/image01"
        android:layout_width="505dp"
        android:layout_height="339dp"
        android:layout_gravity="left"
        android:src="@mipmap/bbb" />-->

    <TextView
        android:id="@+id/read"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:text="您最近在读的作品:"
        android:gravity="center"
        android:background="@color/colorMine3"/>

    <TextView
        android:id="@+id/reading1"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text=""
        android:gravity="center"
        android:clickable="true"
        android:background="@color/colorMine4"/>
    <TextView
        android:id="@+id/reading2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text=""
        android:gravity="center"
        android:clickable="true"
        android:background="@color/colorMine4"/>
    <TextView
        android:id="@+id/reading3"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text=""
        android:gravity="center"
        android:clickable="true"
        android:background="@color/colorMine4"/>

<!--
    <Button
        android:id="@+id/btn_query01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="queryStories"
        android:background="@color/colorMine4"
        android:text="" />

    <Button
        android:id="@+id/btn_query02"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="queryStories"
        android:background="@color/colorMine4"
        android:text="" />

    <Button
        android:id="@+id/btn_query03"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="queryStories"
        android:background="@color/colorMine4"
        android:text="" />

    <Button
        android:id="@+id/btn_query04"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="queryStories"
        android:background="@color/colorMine4"
        android:text="" />

    <Button
        android:id="@+id/btn_query05"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="queryStories"
        android:background="@color/colorMine4"
        android:text="" />-->
</LinearLayout>
2.4activity_reading.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/context_roll"
        android:layout_width="fill_parent"
        android:layout_height="720dp"
        android:background="@color/colorMine5"
        android:scrollbarStyle="outsideOverlay">

        <TextView
            android:id="@+id/context"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:textColor="@color/colorMine6"
            android:textSize="26sp"/>

    </ScrollView>



</LinearLayout>
3 Activities
3.1 LoginActivity
package com.example.mychat.activities;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mychat.R;
import com.example.mychat.utils.PostUtils;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class LoginActivity extends AppCompatActivity {

    String TAG = LoginActivity.class.getCanonicalName();
    private EditText et_login_uname;
    private EditText et_data_upass;
    private TextView msg_show;
    private Button btn_register;
    private HashMap<String, String> stringHashMap;
    private static final int COMPLETED=0;
    String msg_toShow="";

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg){
            if(msg.what==COMPLETED){
                msg_show.setText(msg_toShow);
            }
        }
    };


    //主UI线程
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        et_login_uname = (EditText) findViewById(R.id.et_login_uname);
        et_data_upass = (EditText) findViewById(R.id.et_data_upass);
        msg_show=(TextView)findViewById(R.id.msg_show);
        btn_register=(Button)findViewById(R.id.btn_register);
        stringHashMap = new HashMap<>();
    }

    public String username;

    public void loginPOST(View view) {
        username=et_login_uname.getText().toString();
        stringHashMap.put("username",username);
        stringHashMap.put("password", et_data_upass.getText().toString());
        new Thread(postRun).start();
    }



    /**
     * post请求线程
     */
    Runnable postRun = new Runnable() {
        PostUtils postUtils=new PostUtils();
        int flag;
        String msg;
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                String loginUrl="http://192.168.10.108:8080/MyChat/LoginServlet";
                String result=postUtils.requestPost(loginUrl,stringHashMap);
                JSONObject jsonObject =new JSONObject(result);
                flag=jsonObject.getInt("code");
                msg_toShow=jsonObject.getString("msg");
                if(flag!=1){
                    //TODO   登陆失败之后如何显示出JSON返回的数据?--全局变量;
                    // 将服务器返回数据展示在当前页面,如何将服务器返回的数据展示到跳转之后的页面呢?
                    //用户名或者密码错误,信息弹出在界面上,需要进行线程的处理
                    Message message=new Message();
                    message.what=COMPLETED;
                    handler.sendMessage(message);
                }else{
                    //TODO  如何正常登陆之后将信息显示到新打开的活动中
                    //正常登陆
                    Intent intent=new Intent(LoginActivity.this, SuccessActivity.class);
                    //在服务器查看当前用户的信息

                    //TODO 服务器需要将当前用户的姓名返回?还是在页面上获取?后者
                    String queryByUsernameUrl="http://192.168.10.108:8080/MyChat/QueryServlet";
                    HashMap stringHashMap=new HashMap<String,String>();
                    stringHashMap.put("queryByUsernameUrl",queryByUsernameUrl);
                    stringHashMap.put("username",username);
                    String user_info=postUtils.requestPost(queryByUsernameUrl,stringHashMap);


                    JSONObject jsonObject_userInfo = null;
                    jsonObject_userInfo = new JSONObject(user_info);
                    //TODO 写好后端之后根据返回的数据解析
                    flag=jsonObject_userInfo.getInt("code");
                    JSONObject jsonObject1 = jsonObject_userInfo.getJSONObject("data");
                            //.getJSONArray("data");
                    //String username=jsonObject1.getString("username");
                    String password=jsonObject1.optString("password");
                    String gender=jsonObject1.optString("gender");
                    String age=jsonObject1.optString("age");
                    String favorite=jsonObject1.optString("favorite");
                    String reading=jsonObject1.optString("reading");

                    //检查数据是否已经得到
                    System.out.println("当前用户的喜好是"+favorite);
                    //通过Bundle携带User数据到新的意图,数据的传输
                    Bundle bundle=new Bundle();
                    ArrayList<String> list=new ArrayList<String>();
                    list.add(username);
                    list.add(password);
                    list.add(gender);
                    list.add(age);
                    list.add(favorite);
                    list.add(reading);

                    bundle.putStringArrayList("user",list);
                    intent.putExtras(bundle);
                    startActivity(intent);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };

    //点击注册按钮的话,跳转到注册页面进行注册
    //TODO  为何一定要加上参数View,点击一次发出警告语句,点击第二次就报错并且结束程序
    public void doReg(View view){
        Intent intent=new Intent(this,RegisterActivity.class);
        startActivity(intent);
    }
}
3.2 RegisterActivity
package com.example.mychat.activities;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mychat.R;
import com.example.mychat.utils.PostUtils;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;


public class RegisterActivity extends AppCompatActivity {

    String TAG = RegisterActivity.class.getCanonicalName();
    private EditText et_data_uname,et_data_upass,et_gender,et_age,et_favorite,et_reading;
    private TextView msg_show;
    private HashMap<String, String> stringHashMap;

    private static final int COMPLETED=0;
    //设置全局变量用于接受返回的JSON信息
    String msg_toShow="";


    //能够跳转进来
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        et_data_uname = (EditText) findViewById(R.id.et_data_uname);
        et_data_upass = (EditText) findViewById(R.id.et_data_upass);
        et_age= (EditText) findViewById(R.id.et_age);
        et_gender = (EditText) findViewById(R.id.et_gender);
        et_favorite = (EditText) findViewById(R.id.et_favorite);
        et_reading = (EditText) findViewById(R.id.et_reading);
        msg_show=(TextView)findViewById(R.id.msg_show);
        stringHashMap = new HashMap<>();
    }


    public void registerPOST(View view) {
        stringHashMap.put("username", et_data_uname.getText().toString());
        stringHashMap.put("password", et_data_upass.getText().toString());
        stringHashMap.put("age", et_age.getText().toString());
        stringHashMap.put("gender", et_gender.getText().toString());
        stringHashMap.put("favorite", et_favorite.getText().toString());
        stringHashMap.put("reading", et_reading.getText().toString());
        new Thread(postRun).start();
    }

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg){
            if(msg.what==COMPLETED){
                msg_show.setText(msg_toShow);
            }
        }
    };



    /**
     * post请求线程
     */
    Runnable postRun = new Runnable() {
        PostUtils postUtils=new PostUtils();
        int flag;
        String msg;
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                //TODO --服务端需要转换成两个Servlet
                String registerUrl="http://192.168.10.108:8080/MyChat/RegisterServlet";
                String result=postUtils.requestPost(registerUrl,stringHashMap);
                JSONObject jsonObject = new JSONObject(result);
                flag=jsonObject.getInt("code");
                msg_toShow=jsonObject.getString("msg");
                if(flag!=1){
                    //显示错误信息:该用户名已经被注册
                    Message message=new Message();
                    message.what=COMPLETED;
                    handler.sendMessage(message);
                }else{
                    //显示已经成功注册,点击登陆按钮进行登陆、
                    Message message=new Message();
                    message.what=COMPLETED;
                    handler.sendMessage(message);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }


        }
    };

    //点击注册按钮的话,跳转到注册页面进行注册
    //TODO  为何一定要加上参数View
    public void toLogin(View view){
        Intent intent=new Intent(this,LoginActivity.class);
        startActivity(intent);
    }


}
3.3ReadingActivity
package com.example.mychat.activities;

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mychat.R;

public class ReadingActivity extends AppCompatActivity {

    TextView tv_context;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reading);
        Bundle bundle = this.getIntent().getExtras();
        String context = bundle.getString("context");

        tv_context = (TextView) findViewById(R.id.context);
        tv_context.setText(context);

    }
}
3.4 SuccessActivity
package com.example.mychat.activities;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mychat.R;
import com.example.mychat.utils.PostUtils;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class SuccessActivity extends AppCompatActivity implements View.OnClickListener {
    //声明页面的元素--两个TextView,一个ImageView
    TextView welText ,user_name,user_age,user_gender,user_interests;
    TextView reading1,reading2,reading3;
    //接受正在阅读的小说的名称
    String reading;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_success);

        //接受页面新数据
        Bundle bundle = this.getIntent().getExtras();
        ArrayList<String> user = bundle.getStringArrayList("user");
        String username=user.get(0);
        String password=user.get(1);
        String gender=user.get(2);
        String age=user.get(3);
        String favorite=user.get(4);
        String reading=user.get(5);
        String[] readings = reading.split(";");


        welText = (TextView) findViewById(R.id.wel);
        user_name = (TextView) findViewById(R.id.user_name);
        user_age=(TextView)findViewById(R.id.user_age);
        user_gender=(TextView)findViewById(R.id.user_gender);
        user_interests=(TextView)findViewById(R.id.user_interests);
        reading1 = (TextView) findViewById(R.id.reading1);
        reading2 = (TextView) findViewById(R.id.reading2);
        reading3 = (TextView) findViewById(R.id.reading3);
        reading1.setOnClickListener(this);
        reading2.setOnClickListener(this);
        reading3.setOnClickListener(this);
        //Button query02 = (Button) findViewById(R.id.btn_query02);
        //Button query03 = (Button) findViewById(R.id.btn_query03);
        //Button query01 = (Button) findViewById(R.id.btn_query01);
        //Button query04 = (Button) findViewById(R.id.btn_query04);

        //将从其他页面带过来的数据展示在当前页面上
        user_name.setText("用户名称: "+username);
        user_age.setText("用户年龄: "+age);
        user_gender.setText("用户性别: "+gender);
        user_interests.setText("喜爱的小说类型: "+favorite);
        reading1.setText(readings[0]);
        reading2.setText(readings[1]);
        reading3.setText(readings[2]);

    }

    final String queryByBooknameUrl = "http://192.168.10.108:8080/MyChat/reading";
    final HashMap stringHashMap = new HashMap<String, String>();
    //不同的TextView添加不同的点击事件
    @Override
    public void onClick(View view) {

        //这里写错了,路径是不能够写到参数当中的
        //stringHashMap.put("queryByUsernameUrl",queryByBooknameUrl);
        //追加参数
        switch (view.getId()) {
            case R.id.reading1:
                stringHashMap.put("reading", reading1.getText().toString());
                break;
            case R.id.reading2:
                stringHashMap.put("reading", reading2.getText().toString());
                break;
            case R.id.reading3:
                stringHashMap.put("reading", reading3.getText().toString());
                break;
        }
        new Thread(postRun).start();

    }
        //追加完参数之后结束发送请求
        Runnable postRun = new Runnable() {
            PostUtils postUtils=new PostUtils();
            String context = null;
            String bookName=null;
            @Override
            public void run() {
                String result = postUtils.requestPost(queryByBooknameUrl, stringHashMap);

                if (result == null) {
                    System.out.println("当前小说不能阅读");
                } else {
                    try {
                        JSONObject jsonObject = new JSONObject(result);
                        //TODO 写好后端之后根据返回的数据解析

                        JSONObject jsonObject_data = jsonObject.getJSONObject("data");
                        bookName=jsonObject_data.getString("bookName");
                        context=jsonObject_data.getString("context");
                        Intent intent=new Intent(SuccessActivity.this,ReadingActivity.class);
                        Bundle bundle=new Bundle();
                        bundle.putString("context",context);
                        intent.putExtras(bundle);
                        startActivity(intent);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

    }

三、后端代码(使用Idea开发)

需要加入gson和mysql连接的jar包

3.1 servlet
3.1.1 LoginDateServlet
package com.south.web;

import com.google.gson.Gson;
import com.south.domain.BaseBean;
import com.south.domain.UserBean;
import com.south.utils.DBUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LoginDateServlet extends HttpServlet {

	//登陆,失败为0,成功为1

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException {
		doPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println(new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss").format(new Date()));
		System.out.println("成功连接到安卓服务器");
		request.setCharacterEncoding("UTF-8");
		System.out.println("request--->"+request.getRequestURL()+"===="+request.getParameterMap().toString());
		String username = request.getParameter("username"); // 获取客户端传过来的参数
		String password = request.getParameter("password");
		response.setContentType("text/html;charset=utf-8");
		if (username == null || username.equals("") || password == null || password.equals("")) {
			System.out.println("用户名或密码为空");
			return;
		} // 请求数据库
		DBUtils dbUtils = new DBUtils();
		dbUtils.openConnect();
		// 打开数据库连接
		BaseBean data = new BaseBean(); // 基类对象,回传给客户端的json对象
		UserBean userBean = new UserBean(); // user的对象
		if (dbUtils.isExistInDB(username, password)) {
			// 判断账号是否存在
			data.setCode(1);
			data.setData(userBean);
			data.setMsg("登陆成功");
		} else if (!dbUtils.isExistInDB(username, password)) {
			// 注册成功
			data.setCode(0);
			data.setMsg("用户名或密码错误!!");
			System.out.println("用户名或密码错误");
		}
		Gson gson = new Gson();
		String json = gson.toJson(data);
		System.out.println("转换GSON成功,要传送给客户端的数据是"+json);
		// 将对象转化成json字符串
		try {
			response.getWriter().println(json);
			// 将json数据传给客户端
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			response.getWriter().close(); // 关闭这个流,不然会发生错误的
		}
		dbUtils.closeConnect(); // 关闭数据库连接}
	}
	

}
3.1.2 RegisterServlet
package com.south.web;

import com.google.gson.Gson;
import com.south.domain.BaseBean;
import com.south.domain.UserBean;
import com.south.utils.DBUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class RegisterServlet extends HttpServlet {
    //注册,失败为0,成功为1
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss").format(new Date()));
        System.out.println("成功连接到安卓服务器");
        request.setCharacterEncoding("UTF-8");
        System.out.println("request--->"+request.getRequestURL()+"===="+request.getParameterMap().toString());
        String username = request.getParameter("username"); // 获取客户端传过来的参数
        String password = request.getParameter("password");
        String age = request.getParameter("age");
        String gender = request.getParameter("gender");
        String favorite = request.getParameter("favorite");
        String reading = request.getParameter("reading");

        response.setContentType("text/html;charset=utf-8");

        //TODO   也应返回相应的数据
        if (username == null || username.equals("") || password == null || password.equals("")) {
            System.out.println("用户名或密码为空");
            return;
        } // 请求数据库
        DBUtils dbUtils = new DBUtils();
        dbUtils.openConnect();
        // 打开数据库连接
        BaseBean data = new BaseBean(); // 基类对象,回传给客户端的json对象
        UserBean userBean = new UserBean(); // user的对象
        if (dbUtils.isExistInDB(username, password)) {
            // 判断账号是否存在
            data.setCode(0);
            data.setData(userBean);
            data.setMsg("该账号已存在,请重新填写用户名称");
            System.out.println("账号已经存在!!");
        } else if (!dbUtils.insertDataToDB(username, password,age,gender,favorite,reading)) {
            // 注册成功
            data.setCode(0);
            data.setMsg("注册成功!!请点击登陆按钮进行登陆");
            System.out.println("注册成功,请点击登陆按钮进行登陆");
            ResultSet rs = dbUtils.getUser();
            int id = -1;
            //从数据库读取值,然后将数据封装成一个个实体类
            if (rs != null) {
                try {
                    while (rs.next()) {
                        if (rs.getString("user_name").equals(username)&& rs.getString("user_pwd").equals(password)) {
                            id = rs.getInt("user_id");
                        }
                    }
                    userBean.setId(id);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            userBean.setUsername(username);
            userBean.setPassword(password);
            userBean.setAge(age);
            userBean.setGender(gender);
            userBean.setReading(reading);
            userBean.setFavorite(favorite);
            data.setData(userBean);
        } else {
            // 注册不成功,这里错误没有细分,都归为数据库错误
            data.setCode(500);
            data.setData(userBean);
            data.setMsg("数据库错误");
        }
        Gson gson = new Gson();
        String json = gson.toJson(data);
        System.out.println("转换GSON成功,要传送给客户端的数据是"+json);
        // 将对象转化成json字符串
        try {
            response.getWriter().println(json);
            // 将json数据传给客户端
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.getWriter().close(); // 关闭这个流,不然会发生错误的
        }
        dbUtils.closeConnect(); // 关闭数据库连接}
    }
}
3.1.3 QueryServlet
package com.south.web;

import com.google.gson.Gson;
import com.south.domain.BaseBean;
import com.south.domain.UserBean;
import com.south.utils.DBUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class QueryServlet extends HttpServlet {
    //注册,失败为0,成功为1
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //TODO 打印当前时间
        System.out.println(new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss").format(new Date()));
        System.out.println("成功连接到安卓服务器");
        request.setCharacterEncoding("UTF-8");
        System.out.println("request--->"+request.getRequestURL()+"===="+request.getParameterMap().toString());
        String username = request.getParameter("username"); // 获取客户端传过来的参数
        response.setContentType("text/html;charset=utf-8");

        //TODO   也应返回相应的数据
        if (username == null || username.equals("")) {
            System.out.println("用户名为空");
            return;
        } // 请求数据库
        DBUtils dbUtils = new DBUtils();
        dbUtils.openConnect();
        // 打开数据库连接
        BaseBean data = new BaseBean(); // 基类对象,回传给客户端的json对象
        UserBean userBean = new UserBean(); // user的对象
        ResultSet rs=dbUtils.queryByUsername(username);

        //从数据库读取值,然后将数据封装成一个实体类--即我们姓名数据得到的用户数据
        if (rs != null) {
                while (true) {
                    try {
                        if (!rs.next()) break;
                        userBean.setUsername(rs.getString("user_name"));
                        userBean.setPassword(rs.getString("user_pwd"));
                        userBean.setGender(rs.getString("user_gender"));
                        userBean.setAge(rs.getString("user_age"));
                        userBean.setFavorite(rs.getString("user_favorite"));
                        userBean.setReading(rs.getString("user_reading"));

                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                    }
                }
            data.setData(userBean);

        Gson gson = new Gson();
        String json = gson.toJson(data);
        System.out.println("转换GSON成功,要传送给客户端的数据是"+json);
        // 将对象转化成json字符串
        try {
            response.getWriter().println(json);
            // 将json数据传给客户端
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.getWriter().close(); // 关闭这个流,不然会发生错误的
        }
        dbUtils.closeConnect(); // 关闭数据库连接}
    }
}
3.1.4 QueryReadingServlet
package com.south.web;

import com.google.gson.Gson;
import com.south.domain.BaseBean;
import com.south.domain.BookBean;
import com.south.domain.UserBean;
import com.south.utils.DBUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class QueryReadingServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //TODO 打印当前时间
        System.out.println(new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss").format(new Date()));
        System.out.println("成功连接到安卓服务器");
        request.setCharacterEncoding("UTF-8");
        System.out.println("request--->"+request.getRequestURL()+"===="+request.getParameterMap().toString());
        String reading = request.getParameter("reading"); // 获取客户端传过来的参数
        response.setContentType("text/html;charset=utf-8");

        BaseBean data=new BaseBean();
        BookBean bookBean = new BookBean();

        DBUtils dbUtils = new DBUtils();
        dbUtils.openConnect();
        // 打开数据库连接
        ResultSet rs=dbUtils.queryContextByName(reading);
        String bookName=null;
        String context=null;
        //从数据库读取值,然后将数据封装成一个book对应的实体类

        if (rs != null) {
            while (true) {
                try {
                    if (!rs.next()) break;
                    bookName=rs.getString("book_name");
                    context= rs.getString("context");
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        }

        //将返回结果分装成一个实体类然后使用Json进行转换
        bookBean.setContext(context);
        bookBean.setBookName(bookName);
        data.setCode(0);
        data.setMsg("请求小说内容成功");
        data.setData(bookBean);

        Gson gson = new Gson();
        String json = gson.toJson(data);
        System.out.println("转换GSON成功,要传送给客户端的数据是"+json);
        // 将对象转化成json字符串
        try {
            response.getWriter().println(json);
            // 将json数据传给客户端
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.getWriter().close(); // 关闭这个流,不然会发生错误的
        }
        dbUtils.closeConnect(); // 关闭数据库连接}
    }
}
3.2 utils
package com.south.utils;

import com.south.domain.UserBean;

import java.sql.*;

public class DBUtils {
	private Connection conn;
	private String url = "jdbc:mysql://127.0.0.1:3306/mychat"; // 指定连接数据库的URL
	private String user = "root"; // 指定连接数据库的用户名
	private String password = "root"; // 指定连接数据库的密码
	private Statement sta;
	private ResultSet rs; // 打开数据库连接


	public void openConnect() {
		try {
			// 加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);// 创建数据库连接
			if (conn != null) {
				System.out.println("数据库连接成功"); // 连接成功的提示信息
			}
		} catch (Exception e) {
			System.out.println("ERROR: " + e.getMessage());
		}
	}


	// 获得查询user表后的数据集
	public ResultSet getUser() {
		// 创建 statement对象
		try {
			sta = conn.createStatement(); // 执行SQL查询语句
			rs = sta.executeQuery("select * from user");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}


	// 判断数据库中是否存在某个用户名及其密码,注册和登录的时候判断
	public boolean isExistInDB(String username, String password) {
		boolean isFlag = false; // 创建 statement对象
		try {
			System.out.println("判断用户名密码");
			sta = conn.createStatement(); // 执行SQL查询语句
			rs = sta.executeQuery("select * from user");// 获得结果集
			if (rs != null) {
				while (rs.next()) { // 遍历结果集
					if (rs.getString("user_name").equals(username)) {
						if (rs.getString("user_pwd").equals(password)) {
							isFlag = true;
							break;
						}
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			isFlag = false;
		}
		return isFlag;


	}

	// 注册 将用户名和密码插入到数据库(id设置的是自增长的,因此不需要插入)
	public boolean insertDataToDB(String username, String password,String age,String gender,String favorite,String reading) {

		String sql = " insert into user (user_name,user_pwd,user_gender,user_age,user_favorite,user_reading)values (?,?,?,?,?,?)";
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1,username);
			ps.setString(2,password);
			ps.setString(3,age);
			ps.setString(4,gender);
			ps.setString(5,favorite);
			ps.setString(6,reading);
			// 执行SQL查询语句
			return ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	//根据用户名查询用户信息(以及规定用户名不能够重复)
	public ResultSet queryByUsername(String username){
		//使用预编译的方式进行查询
		//String sql="select * from user where user_name='"+username+"'";
		String sql="select * from user where user_name = ? ";
		try {
			PreparedStatement st = conn.prepareStatement(sql);
			st.setString(1,username);
			rs=st.executeQuery();
			return rs;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 关闭数据库连接
	public void closeConnect() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (sta != null) {
				sta.close();
			}
			if (conn != null) {
				conn.close();
			}
			System.out.println("关闭数据库连接成功");
		} catch (SQLException e) {
			System.out.println("Error: " + e.getMessage());
		}
	}


	public ResultSet queryContextByName(String bookName) {
		String sql="select * from book_reading where book_name = ? ";
		try {
			PreparedStatement st = conn.prepareStatement(sql);
			st.setString(1,bookName);
			rs=st.executeQuery();
			return rs;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}
3.3 beans
3.3.1BaseBean
package com.south.domain;

public class BaseBean {
	private int code;
	private String msg;
	private Object data;


	public int getCode() {
		return code;
	}


	public void setCode(int code) {
		this.code = code;
	}


	public String getMsg() {
		return msg;
	}


	public void setMsg(String msg) {
		this.msg = msg;
	}


	public Object getData() {
		return data;
	}


	public void setData(Object data) {
		this.data = data;
	}

}

3.3.2UserBean
package com.south.domain;

import java.io.Serializable;

public class UserBean implements Serializable {
	
	private int id;
	private String username;
	private String password;
	private String gender;
	private String age;
	private String favorite;
	private String reading;

	public String getReading() {
		return reading;
	}

	public void setReading(String reading) {
		this.reading = reading;
	}

	public UserBean(int id, String username, String password, String gender, String age, String favorite,String reading) {
		this.id = id;
		this.username = username;
		this.password = password;
		this.gender = gender;
		this.age = age;
		this.favorite = favorite;
		this.reading=reading;
	}

	public UserBean() {
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getFavorite() {
		return favorite;
	}

	public void setFavorite(String favorite) {
		this.favorite = favorite;
	}
}
3.3.3BookBean
package com.south.domain;

public class BookBean {
    private String bookName;
    private String context;

    public BookBean() {
    }

    public BookBean(String bookName, String context) {
        this.bookName = bookName;
        this.context = context;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }
}

总结

参考博客[https://www.jb51.net/article/86984.htm(https://www.jb51.net/article/86984.htm),第一次做安卓开发,前后端都要写,时间也比较短,很多地方没有优化,该判断的地方也没有判断,需要try,catch 的地方也没有继续做,好几处变量的声明与定义都没有规范,如果有小伙伴要运行代码的话主要注意注册界面由于没有判断所以需要输入三个书名,也就是有两个;;才能保证登陆的时候不会报错,因为没有做变量的优化

前端项目已经上传到百度云 链接:https://pan.baidu.com/s/1p_wXO5Uwqn1mluXIuJGWyw 提取码: 9cds,后端由于比较简单就不上传了

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android开发入门和实战源码是指用于学习Android开发的一些示例代码和实际项目代码。在学习Android开发的过程中,源码是非常重要的资源之一。通过阅读和分析源码,能够更好地理解Android框架和API,培养编程思路和设计模式。 对于初学者而言,进入Android开发领域前,需要学习Java编程语言的基础知识,并且掌握Android开发框架以及其相关工具。其中,参考一些较为成熟的开源学习项目及其源码,可以让初学者更好地入门Android开发。 而对于有一定开发经验的开发者而言,获取一些优秀的实战项目源码,可以帮助他们更好地了解Android应用开发中的最佳实践方法和开发技巧。同时,在使用源码时,也可以根据自己的需求和项目特点进行个性化的定制和修改。 总的来说,学习和使用Android开发入门和实战源码是一个不断积累、提高自己开发能力的过程。希望广大开发者可以善用这些资源,不断努力,打造更好的Android应用。 ### 回答2: Android开发入门和实战源码是一套非常优秀的学习材料,能够为初学者提供全面、系统的学习体验。该源码包含了多个项目和应用程序的完整代码,涉及了Android的基础开发、网络编程、图像处理、多媒体等多个方面,让开发者能够较为顺畅地进入Android开发的领域。 对于初学者来说,这套源码能够提供多个通俗易懂的案例,帮助他们快速掌握Android开发的核心思想和基础知识,熟悉开发环境,熟悉常用类库和API,从而顺利完成初步开发任务。 对于高级开发者来说,该源码提供了许多高级示例和代码实现,让他们能够更加深入了解Android的高级编程思路和技术,如图片缓存、网络请求、自定义视图等问题,加强开发技能和经验,提升开发能力和水平。 总之,Android开发入门和实战源码的作用是非常重要的,无论是学习者还是开发者都能够从中获得巨大的益处,扩展知识面,提高技术水平,缩短学习和开发时间。因此,学习者和开发者都应该加以利用,进一步提高自己的实践和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值