简单登录注册页面(初学者),可以和后台交互
客户端:
客户端实现了简单的登录、注册功能、还可保存输入的用户名和密码。使用的POST请求实现和后台服务端的交互。不多说,上代码:
客户端布局文件(activity_main.xml):
<EditText
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="78dp"
android:ems="10"
android:inputType="textPersonName"
android:hint="用户名" />
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/id"
android:layout_below="@+id/id"
android:layout_marginTop="28dp"
android:ems="10"
android:inputType="textPassword"
android:hint="密码"/>
<CheckBox
android:id="@+id/check"
android:text="记住用户名和密码"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/password"
android:layout_alignLeft="@+id/password"/>
<Button
android:id="@+id/register"
android:text="注册"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/password"
android:layout_alignLeft="@+id/password"/>
<Button
android:id="@+id/login"
android:text="登录"
android:layout_marginTop="40dp"
android:layout_below="@id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/password"/>
MainActivity.java:
public class MainActivity extends Activity implements OnClickListener{
private EditText id;
private EditText password;
private Button login;
private Button register;
private CheckBox cb;
private String username;
private String pwd;
private SharedPreferences sp;
private String result;
private int RequestCode = 1;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
id = (EditText) findViewById(R.id.id);
password = (EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);
//register.setOnClickListener(this);
login.setOnClickListener(this);
register = (Button) findViewById(R.id.register);
register.setOnClickListener(this);
cb = (CheckBox) findViewById(R.id.check);
sp = getSharedPreferences("config", 0);
//将数据显示到UI控件
//把config.xml文件中的数据取出来显示到EditText控件中
//如果没找到key键对应的值,会返回第二个默认的值
String username = sp.getString("username", "");
String password = sp.getString("password", "");
id.setText(username);
this.password.setText(password);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1&&resultCode==2){
id.setText(data.getStringExtra("id"));
password.setText(data.getStringExtra("password"));
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login:
username = id.getText().toString().trim();
pwd = password.getText().toString().trim();
if(cb.isChecked()){//判断是否勾选
// //使用sharePreferences区保存数据 拿到sp实例
// //参数: name生成xml文件
// //mode 模式
//
// //获取sp的编辑器
Editor editor=sp.edit();
// //存储用户输入的数据
editor.putString("username", username);
editor.putString("password", pwd);
// //提交editor
editor.commit();
}
if(TextUtils.isEmpty(username)||TextUtils.isEmpty(pwd)){
Toast.makeText(getApplicationContext(), "账号或密码不能为空", 1).show();
}else{
new Thread(){
public void run(){
try {
//设置路径
//设置路径
String path="http://192.168.227.1:8080/MyWebsite/androidlogin.do?id="+username+"&password="+pwd+"";
//创建URL对象
URL url=new URL(path);
//创建一个HttpURLConnection对象
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
//设置请求方法
conn.setRequestMethod("POST");
//设置请求超时时间
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//Post方式不能设置缓存,需要手动设置
conn.setUseCaches(false);
//设置我们的请求数据
String data="id="+username+"&password="+pwd;
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//使用的是表单请求类型
conn.setRequestProperty("Content-Length", data.length()+"");
conn.setDoOutput(true);
conn.getOutputStream().write(data.getBytes());
// //连接
// conn.connect();
// //获取一个输出流
// OutputStream out=conn.getOutputStream();
// out.write(data.getBytes());
//获取服务器返回的状态吗
int code=conn.getResponseCode();
if(code==200){
//获取服务器返回的输入流对象
InputStream in= conn.getInputStream();
result = StringTools.readStream(in);
//更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
if(result.equals("success"))
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "登录成功", 1).show();
else{
Toast.makeText(getApplicationContext(), "登录失败", 1).show();
}
}
});
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
break;
case R.id.register:
//跳转到登录页面
Intent intent=new Intent(this,RegisterActivity.class);
startActivityForResult(intent,RequestCode);
break;
default:
break;
}
}
}
注册页面布局文件(register.xml):
<EditText
android:id="@+id/id_edit"
android:hint="用户名"
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password_edit"
android:hint="密码"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password_edit_1"
android:hint="确认密码"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/email_edit"
android:hint="邮箱"
android:layout_below="@+id/password_edit_1"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/register_do"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click1"
android:text="注册" />
注册页面逻辑(RegisterActivity.java):
public class RegisterActivity extends Activity implements OnClickListener{
private Button register;
private EditText id;
private EditText pwd_1;
private EditText pwd_2;
private EditText email;
private String result;
private String username;
private String pwd1;
private String e_mail;
private String pwd2;
private int ResultCode=2;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
register = (Button) findViewById(R.id.register_do);
register.setOnClickListener(this);
id = (EditText) findViewById(R.id.id_edit);
pwd_1 = (EditText) findViewById(R.id.password_edit);
pwd_2 = (EditText) findViewById(R.id.password_edit_1);
email = (EditText) findViewById(R.id.email_edit);
}
@Override
public void onClick(final View v) {
new Thread(){public void run() {
switch (v.getId()) {
case R.id.register_do:
username = id.getText().toString().trim();
e_mail = email.getText().toString().trim();
pwd1 = pwd_1.getText().toString().trim();
pwd2 = pwd_2.getText().toString().trim();
if(!pwd1.equals(pwd2)){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "两次输入密码不一致,请重新输入!", 1).show();
}
});
}else {
try {
//设置路径
String path="http://192.168.227.1:8080/MyWebsite/androidregister.do?id="+username+"&password="+ pwd1+"&email="+e_mail+"";
//创建URL对象
URL url=new URL(path);
//创建一个HttpURLconnection对象
HttpURLConnection conn =(HttpURLConnection) url.openConnection();
//设置请求方法
conn.setRequestMethod("POST");
//设置请求超时时间
conn.setReadTimeout(5000);
//conn.setConnectTimeout(5000);
//Post方式不能设置缓存,需要手动设置
//conn.setUseCaches(false);
//准备要发送的数据
String data ="id="+URLEncoder.encode(username,"utf-8")+"&password"+URLEncoder.encode(pwd1,"utf-8")+"&email"+URLEncoder.encode(e_mail,"utf-8");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//使用的是表单请求类型
conn.setRequestProperty("Content-Length", data.length()+"");
conn.setDoOutput(true);
//连接
// conn.connect();
//获得返回的状态码
conn.getOutputStream().write(data.getBytes());
int code=conn.getResponseCode();
if(code==200){
//获得一个文件的输入流
InputStream inputStream= conn.getInputStream();
result = StringTools.readStream(inputStream);
//更新UI
showToast(result);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
default:
break;
}
};}.start();
}
public void showToast(final String content){
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if(result.equals("success")){
Toast.makeText(getApplicationContext(), "注册成功", 1).show();
Intent intent=new Intent();
intent.putExtra("id", username);
intent.putExtra("password", pwd1);
setResult(ResultCode, intent);
finish();
}
}
});
}
}
工具类:将客户端发送的流数据转化为字符串(StringTools):
public static String readStream(InputStream in)throws Exception{
//将传进来的流信息转换为字符串
//创建1字节输出流对象
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
//定义读取长度
int len=0;
//定义缓存区
byte buffer[]=new byte[2014];
//按照缓存区大小循环读取
while((len=in.read(buffer))!=-1){
outputStream.write(buffer, 0, len);
}
in.close();
outputStream.close();
//将字符串数据返回
String content=new String(outputStream.toByteArray());
return content;
}
}
以上是客户端的所有内容,包含所有的页面和对应的逻辑。
服务端的内容:不具体贴出所有的代码,给予简单的介绍:
开发工具:Eclipse2018
数据库:MySQL数据库(数据库的创建,请跟具代码具体创建)
具体服务端代码:点击以下链接下载
服务端代码提取密码:lncl