300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android实现注册登录头像上传等功能常规开发(Android端 服务器端开发实例)

Android实现注册登录头像上传等功能常规开发(Android端 服务器端开发实例)

时间:2018-12-04 06:53:58

相关推荐

Android实现注册登录头像上传等功能常规开发(Android端 服务器端开发实例)

Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

标签:注册登录Android开发servlet -04-18 20:34 454人阅读 评论(1) 收藏 举报分类:

版权声明:本文为博主原创文章,未经博主允许。

目录(?)[+]

时隔半年再次敲动键盘,发现时间过得真心快。原本自己该干的事情被琐碎事情给耽搁了,现在想想该重新振奋起来好好努力。闲话到此,今天给大家带来的教程是常规化也是常见的登录注册上传头像等操作,本篇也是从项目中挑出部分,项目是真实测试的,完全能实现如上操作,所以各位不用担心,由于时间原因,就不连接服务器测试了,本篇文章也只是演示下过程。包括了客户端和服务器的部分程序,当然了该篇博客仅限学习,下面进入正文。下面是项目的注册登录部分在模拟器上的演示:

在开始讲解咱们的项目之前咱们先整理下思路。在学习本篇文章前请了解并学习下列相关知识:

okhttp网络请求库最新版本的使用方法(建议去github下载相应的okhttp工具类)Mysql数据库进行数据存储servlet相关知识(请参考超详细servlet+jdbc+html+css实现后台管理登陆)Base64图片编码Tomcat服务器实现虚拟映射路径设置(在本篇文章中将图片保存在服务器的虚拟映射路径中)

注意:本篇文章可能不能完全把代码完全注释讲解,所以敬请大家有点耐心。

客户端:

编写注册界面的xml布局文件 实现注册界面的逻辑实现编写登录界面的XML布局文件实现登录界面的逻辑实现 首先我们看到客户端的整体的结构图:

注册界面布局:wyt_register.xml

[html]view plain copy<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="/apk/res/android" xmlns:app="/apk/res-auto" android:id="@+id/register" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f5f5f5" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <com.mero.wyt_register.widget.CustomTitleBar android:layout_width="match_parent" android:layout_height="80dp" app:text="用户注册" app:background_color="@color/mediumturquoise" /> <LinearLayout android:layout_width="match_parent" android:layout_height="150dp" android:orientation="vertical" android:background="@color/mediumturquoise"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img_upload_img" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerHorizontal="true" android:src="@drawable/menu_item_theme"/> <TextView android:id="@+id/tx_upload_img" android:layout_below="@id/img_upload_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上传头像" android:layout_centerHorizontal="true" android:textSize="15sp" android:gravity="fill_vertical" android:textColor="#fff"/> </RelativeLayout> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical" android:background="#FFF"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <ImageView android:id="@+id/img_register_account" android:layout_width="32dp" android:layout_height="32dp" android:src="@drawable/account" android:layout_marginLeft="10dp" android:layout_gravity="center_vertical"/> <EditText android:id="@+id/edt_register_account" android:layout_width="match_parent" android:layout_height="50dp" android:hint="账号" android:textColorHighlight="#77000000" android:textColor="#000000" android:maxLines="1" android:background="@null" android:gravity="center_vertical" android:paddingLeft="15dp" android:textSize="15sp" android:textColorHint="#77000000" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="#f5f5f5"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="#FFF" android:baselineAligned="false"> <ImageView android:id="@+id/img_register_pwd" android:layout_width="32dp" android:layout_height="32dp" android:layout_marginLeft="10dp" android:src="@drawable/pwd" android:layout_gravity="center_vertical"/> <EditText android:id="@+id/edt_register_pwd" android:layout_width="match_parent" android:layout_height="match_parent" android:hint="密码" android:inputType="textPassword" android:maxLines="1" android:textSize="15sp" android:textColorHighlight="#77000000" android:textColor="#000000" android:background="@null" android:paddingLeft="15sp" android:textColorHint="#77000000" android:layout_weight="1"/> </LinearLayout> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="20dp"> <com.mero.wyt_register.widget.RoundButton android:id="@+id/btn_to_register" android:layout_width="300dp" android:layout_height="50dp" android:text="注册" android:textColor="#FFF" android:textStyle="bold" android:textSize="15sp" android:gravity="center" android:layout_centerInParent="true" app:btnCornerRadius="10dp" app:btnSolidColor="@color/mediumturquoise" app:btnPressedRatio="1.5" /> </RelativeLayout> </LinearLayout>

效果如下:

登录界面布局wyt_login.xml:

[html]view plain copy<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="/apk/res/android" xmlns:app="/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f5f5f5" > <com.mero.wyt_register.widget.CustomTitleBar android:layout_width="match_parent" android:layout_height="80dp" app:text="用户登录" app:background_color="@color/mediumturquoise" /> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical" android:background="#FFF"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <ImageView android:id="@+id/img_login_account" android:layout_width="32dp" android:layout_height="32dp" android:src="@drawable/account" android:layout_marginLeft="10dp" android:layout_gravity="center_vertical"/> <EditText android:id="@+id/edt_login_account" android:layout_width="match_parent" android:layout_height="50dp" android:hint="账号" android:textColorHighlight="#77000000" android:textColor="#000000" android:maxLines="1" android:background="@null" android:gravity="center_vertical" android:paddingLeft="15dp" android:textSize="15sp" android:textColorHint="#77000000" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="#f5f5f5"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="#FFF" android:baselineAligned="false"> <ImageView android:id="@+id/img_login_pwd" android:layout_width="32dp" android:layout_height="32dp" android:layout_marginLeft="10dp" android:src="@drawable/pwd" android:layout_gravity="center_vertical"/> <EditText android:id="@+id/edt_login_pwd" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textPassword" android:hint="密码" android:maxLines="1" android:textSize="15sp" android:textColorHighlight="#77000000" android:textColor="#000000" android:background="@null" android:paddingLeft="15sp" android:textColorHint="#77000000" android:layout_weight="1"/> </LinearLayout> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="20dp"> <com.mero.wyt_register.widget.RoundButton android:id="@+id/btn_login_click_to_login" android:layout_width="300dp" android:layout_height="50dp" android:text="立即登录" android:textColor="@color/white" android:textSize="15sp" android:gravity="center" android:layout_centerInParent="true" app:btnCornerRadius="10dp" app:btnSolidColor="@color/mediumturquoise" app:btnPressedRatio="1.5" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp"> <TextView android:id="@+id/tx_login_click_to_register" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:text="点击注册" android:textColor="#33aa44" android:textSize="15sp" android:textStyle="bold" android:paddingRight="25dp" android:paddingTop="25dp" /> </RelativeLayout> </LinearLayout>

登录界面效果如下:

接下来是我们的注册界面的逻辑代码:

RegisterAty.java

[java]view plain copypackagecom.mero.wyt_register.activity; importandroid.app.ProgressDialog; importandroid.content.Intent; importandroid.database.Cursor; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; .Uri; importandroid.os.Handler; importandroid.os.Message; importandroid.provider.MediaStore; importandroid.text.TextUtils; importandroid.view.Gravity; importandroid.view.View; importandroid.view.animation.AnimationSet; importandroid.view.animation.TranslateAnimation; importandroid.widget.EditText; importandroid.widget.ImageView; importandroid.widget.Toast; importcom.mero.wyt_register.Base.BaseSwipeBackLayout; importcom.mero.wyt_register.Config; importcom.mero.wyt_register.R; importcom..RegisterAction; importcom.mero.wyt_register.utils.AppUtils; importcom.mero.wyt_register.utils.Base64Utils; importcom.mero.wyt_register.utils.SDCardUtils; importcom.mero.wyt_register.widget.RoundButton; importcom.mero.wyt_register.widget.SelectPicPopupWindow; /** *Createdbychenleion/11/17. */ publicclassRegisterAtyextendsBaseSwipeBackLayoutimplementsView.OnClickListener{ privateImageViewimg_upload; privateEditTextedt_account=null; privateEditTextedt_pwd=null; privateRoundButtonbtn_register=null; privatestaticfinalintRESULT_OPEN_IMAGE=1; privateBitmapbitmap;//存放裁剪后的头像 privateStringfileName;//头像名称 privateStringpicturePath;//头像路径 privateProgressDialogpd;//进度条 privatestaticfinalintDISMISS=1000;//进度条消失 privateSelectPicPopupWindowselectPicPopupWindow; @Override publicvoidinitView(){ img_upload=(ImageView)findViewById(R.id.img_upload_img); edt_account=(EditText)findViewById(R.id.edt_register_account); edt_pwd=(EditText)findViewById(R.id.edt_register_pwd); img_upload.setOnClickListener(this); btn_register=(RoundButton)findViewById(R.id.btn_to_register); btn_register.setOnClickListener(this); } @Override publicvoidinitData(){ } privatefinalHandlerhandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ if(msg.what==DISMISS){ pd.dismiss(); } } }; @Override publicintgetLayoutResourceId(){ returnR.layout.wyt_register; } @Override publicintgetDialogIcon(){ return0; } @Override publicintsetStatusBarColor(){ return0; } privatestaticfinalintCAMERA_REQUEST_CODE=1;//拍照返回码 privatestaticfinalintGALLERY_REQUEST_CODE=2;//相册返回码 @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); //如果是拍照返回 if(requestCode==CAMERA_REQUEST_CODE&&resultCode==RESULT_OK&&data!=null){ Uriuri=data.getData(); if(uri!=null){ Cursorcursor=this.getContentResolver().query(uri,null,null,null,null); if(cursor.moveToFirst()){ picturePath=cursor.getString(cursor.getColumnIndex("_data")); fileName=getBitmapName(picturePath); bitmap=AppUtils.toRoundBitmap(BitmapFactory.decodeFile(picturePath)); //进行裁剪 img_upload.setImageBitmap(bitmap); } }else{ Toast.makeText(this,"保存照片失败",Toast.LENGTH_SHORT).show(); return; } } //如果是相册返回 if(requestCode==GALLERY_REQUEST_CODE&&resultCode==RESULT_OK&&null!=data){ UriselectedImage=data.getData(); String[]filePathColumn={MediaStore.Images.Media.DATA}; Cursorcursor=getContentResolver().query(selectedImage, filePathColumn,null,null,null); cursor.moveToFirst(); intcolumnIndex=cursor.getColumnIndex(filePathColumn[0]); picturePath=cursor.getString(columnIndex); fileName=getBitmapName(picturePath); cursor.close(); //裁剪为圆形头像 if(SDCardUtils.isSDCardEnable()){ bitmap=AppUtils.toRoundBitmap(BitmapFactory.decodeFile(picturePath)); img_upload.setImageBitmap(bitmap);//设置到图片 }else{ return; } }else{ return; } } //获取图片的名称 publicStringgetBitmapName(StringpicPath){ StringbitmapName=""; String[]s=picPath.split("/"); bitmapName=s[s.length-1]; returnbitmapName; } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.img_upload_img: //判断是否从相册或者调用相机实现 selectPicPopupWindow=newSelectPicPopupWindow(RegisterAty.this,newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ selectPicPopupWindow.dismiss(); switch(v.getId()){ caseR.id.btn_select_camera: //从相机拍照 Intenti=newIntent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(i,1); break; caseR.id.btn_select_pic_photo_lib: //从图库选择照片 Intentii=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(ii,RESULT_OPEN_IMAGE); break; } } }); Viewview=RegisterAty.this.findViewById(R.id.register); selectPicPopupWindow.showAtLocation(view,Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL,0,0); AnimationSetanimationSet=newAnimationSet(true); TranslateAnimationtranslateAnimation=newTranslateAnimation(1,0,1,0); translateAnimation.setDuration(1000); animationSet.addAnimation(translateAnimation); view.startAnimation(translateAnimation); break; caseR.id.btn_to_register: //点击的是注册按钮 finalStringwyt_account=edt_account.getText().toString();//获取账号 finalStringwyt_pwd=edt_pwd.getText().toString();//获取密码 if(TextUtils.isEmpty(wyt_account)){ Toast.makeText(RegisterAty.this,"账号不能为空",Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(wyt_pwd)){ Toast.makeText(RegisterAty.this,"密码不能为空",Toast.LENGTH_SHORT).show(); return; } if(wyt_account.length()>20){ Toast.makeText(RegisterAty.this,"您输入的账号过长",Toast.LENGTH_SHORT).show(); return; } if(wyt_pwd.length()>20){ Toast.makeText(RegisterAty.this,"您输入的密码过长",Toast.LENGTH_SHORT).show(); return; } pd=ProgressDialog.show(this,"温馨提示","正在注册...",false,true); if(null!=bitmap){ //截取图片后缀 Stringbase64img=Base64Utils.bitmaptoString(bitmap); //进行用户注册 newRegisterAction(Config.URL,Config.KEY_REGISTER,wyt_account,wyt_pwd,base64img,newRegisterAction.ISuccessCallback(){ @Override publicvoidonSuccess(Stringresponse,intid){ pd.setMessage("注册成功"); handler.sendEmptyMessageDelayed(DISMISS,1000); showActivity(RegisterAty.this,LoginAty.class); } },newRegisterAction.IFailCallback(){ @Override publicvoidonFail(StringfailMsg){ pd.setMessage("注册失败"+failMsg); handler.sendEmptyMessageDelayed(DISMISS,1000); } }); } break; default: break; } } privateStringgetPicType(StringpicName){ String[]s=picName.split("."); //数组长度 returns[s.length-1]; } }

然后对注册界面的网络请求进行封装:

RegisterAction.java

[java]view plain copypackagecom.; importandroid.util.Log; importcom.mero.wyt_register.Config; importcom.zhy.http.okhttp.OkHttpUtils; importcom.zhy.http.okhttp.callback.StringCallback; importorg.json.JSONException; importorg.json.JSONObject; importjava.io.File; importjava.util.HashMap; importjava.util.Map; importokhttp3.Call; importstaticandroid.R.attr.action; importstaticcom.google.android.gms.internal.zzs.TAG; importstaticcom.mero.wyt_register.R.drawable.account; importstaticcom.zhy.http.okhttp.OkHttpUtils.post; /** *Createdbychenleion/11/17. */ publicclassRegisterAction{ /* *注册 **/ publicRegisterAction(Stringurl,Stringaction,Stringaccount,Stringpwd,StringpicBase64,finalISuccessCallbacksuccessCallback,finalIFailCallbackfailCallback){ OkHttpUtils .post() .url(url) .addParams(Config.KEY_ACTION,action) .addParams(Config.KEY_ACCOUNT,account) .addParams(Config.KEY_PWD,pwd) .addParams(Config.KEY_USER_ICON,picBase64) .build() .execute(newStringCallback(){ @Override publicvoidonError(Callcall,Exceptione,intid){ if(null!=failCallback){ Log.e(TAG,"注册失败"+e.getMessage()); failCallback.onFail(e.getMessage()); } } @Override publicvoidonResponse(Stringresponse,intid){ try{ JSONObjectjsonObject=newJSONObject(response); intstatus=jsonObject.getInt(Config.KEY_STATUS); interrCode=jsonObject.getInt(Config.KEY_ERR_CODE); if(status==1){ successCallback.onSuccess(response,id); }elseif(status==0){ failCallback.onFail(response); } }catch(JSONExceptione){ e.printStackTrace(); } } }); } publicinterfaceISuccessCallback{ voidonSuccess(Stringresponse,intid); }; publicinterfaceIFailCallback{ voidonFail(StringerrCause); } }

接下来上登录界面逻辑代码:

LoginAty.java

[java]view plain copypackagecom.mero.wyt_register.activity; importandroid.app.ProgressDialog; importandroid.content.Context; importandroid.content.SharedPreferences; importandroid.graphics.Bitmap; importandroid.os.Handler; importandroid.os.Message; importandroid.text.TextUtils; importandroid.util.Log; importandroid.view.View; importandroid.widget.EditText; importandroid.widget.TextView; importandroid.widget.Toast; importcom.mero.wyt_register.Base.BaseSwipeBackLayout; importcom.mero.wyt_register.Config; importcom.mero.wyt_register.MyApplication; importcom.mero.wyt_register.R; importcom.mero.wyt_register.bean.User; importcom.mero.wyt_register.db.DbHelper; importcom..LoginAction; importcom.mero.wyt_register.utils.Base64Utils; importcom.mero.wyt_register.widget.RoundButton; /** *Createdbychenleion/11/16. */ publicclassLoginAtyextendsBaseSwipeBackLayoutimplementsView.OnClickListener{ privatestaticfinalStringTAG="LoginAty"; privateEditTextedt_account=null; privateEditTextedt_pwd=null; privateRoundButtonbtn_login_click_to_login; privateTextViewtx_register; privateProgressDialogpd;//进度条 privatestaticfinalintDISMISS=0; privateUseruser;@Override publicvoidinitData(){ } @Override publicvoidinitView(){ edt_account=(EditText)findViewById(R.id.edt_login_account); edt_pwd=(EditText)findViewById(R.id.edt_login_pwd); tx_register=(TextView)findViewById(R.id.tx_login_click_to_register); btn_login_click_to_login=(RoundButton)findViewById(R.id.btn_login_click_to_login); btn_login_click_to_login.setOnClickListener(this); tx_register.setOnClickListener(this); } privatefinalHandlerhandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ if(msg.what==DISMISS){ pd.dismiss(); } } }; @Override publicintgetLayoutResourceId(){ returnR.layout.wyt_login; } @Override publicintgetDialogIcon(){ return0; } @Override publicintsetStatusBarColor(){ return0; } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.btn_login_click_to_login: //点击的是登录按钮 finalStringwyt_account=edt_account.getText().toString();//获取账号 finalStringwyt_pwd=edt_pwd.getText().toString();//获取密码 if(TextUtils.isEmpty(wyt_account)){ Toast.makeText(LoginAty.this,"账号不能为空",Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(wyt_pwd)){ Toast.makeText(LoginAty.this,"密码不能为空",Toast.LENGTH_SHORT).show(); return; } if(wyt_account.length()>20){ Toast.makeText(LoginAty.this,"您输入的账号过长",Toast.LENGTH_SHORT).show(); return; } if(wyt_pwd.length()>20){ Toast.makeText(LoginAty.this,"您输入的密码过长",Toast.LENGTH_SHORT).show(); return; } Stringtoken=Config.getTokenFromPreferences(this); Log.e(TAG,"token的值"+token); //显示进度对话框 pd=ProgressDialog.show(this,"温馨提示","正在登录",false,true); newLoginAction(Config.URL,Config.KEY_LOGIN,wyt_account,wyt_pwd,"",newLoginAction.ISuccessCallback(){ @Override publicvoidonSuccess(Strings,Stringtoken){ pd.setMessage("登录成功"); //把token保存起来 SharedPreferencessharedPreferences=MyApplication.getMyApplication().getSharedPreferences(Config.ID,Context.MODE_PRIVATE); SharedPreferences.Editoreditor=sharedPreferences.edit(); editor.putString(Config.KEY_TOKEN,token); mit(); //获取头像 Bitmapbitmap=Base64Utils.stringtoBitmap(s); user=newUser(); user.setWyt_account(wyt_account); user.setWyt_pwd(wyt_pwd); user.setUser_icon(bitmap); //保存该用户到数据库中 newDbHelper(LoginAty.this).insert(user,"user_wyt","person"); pd.dismiss(); showActivity(LoginAty.this,MainActivity.class); } },newLoginAction.IFailCallback(){ @Override publicvoidonFail(Strings){ pd.setMessage("登录失败"); handler.sendEmptyMessageDelayed(DISMISS,1000); } }); //} break; caseR.id.tx_login_click_to_register: showActivity(LoginAty.this,RegisterAty.class); break; } } @Override protectedvoidonDestroy(){ super.onDestroy(); } }

下面是登录网络逻辑的封装代码:

LoginAction.java

[java]view plain copypackagecom.; importandroid.graphics.Bitmap; importandroid.text.TextUtils; importandroid.util.Log; importcom.mero.wyt_register.Config; importcom.mero.wyt_register.utils.Base64Utils; importcom.zhy.http.okhttp.OkHttpUtils; importcom.zhy.http.okhttp.callback.StringCallback; importorg.json.JSONException; importorg.json.JSONObject; importokhttp3.Call; /** *Creaedbychenleion/11/15. */ publicclassLoginAction{ privatestaticfinalStringTAG="loginService"; //登录账号密码 publicLoginAction(Stringurl,Stringaction,Stringaccount,Stringpwd,Stringtoken,finalISuccessCallbacksuccessCallback,finalIFailCallbackfailCallback){ OkHttpUtils.post() .url(url) .addParams(Config.KEY_ACTION,action) .addParams(Config.KEY_ACCOUNT,account) .addParams(Config.KEY_PWD,pwd) .addParams(Config.KEY_TOKEN,token) .build().execute(newStringCallback(){ @Override publicvoidonError(Callcall,Exceptione,intid){ if(failCallback!=null){ failCallback.onFail(e.getMessage()); } } @Override publicvoidonResponse(Stringresponse,intid){ try{ JSONObjectjsonObject=newJSONObject(response); intstatus=jsonObject.getInt("status"); StringiconStrBase64=jsonObject.getString("user_icon"); Stringtoken=jsonObject.getString("token"); if(status==1){ if(null!=successCallback){ successCallback.onSuccess(iconStrBase64,token); } }elseif(status==0){ if(null!=failCallback){ failCallback.onFail(response); } } }catch(JSONExceptione){ e.printStackTrace(); } } }); } publicinterfaceISuccessCallback{ voidonSuccess(Strings,Stringtoken); } publicinterfaceIFailCallback{ voidonFail(Strings); } }

服务器端:

通过servlet实现对Action的处理,本实例仅采用了唯一的一个OnlyServlet。如果对servlet的使用不太会的话建议看下我的这篇关于servlet处理网页客户端的请求。本篇文章中不再累赘。首先我们来看看服务器的简单结构。服务器端仅仅对注册和登录,头像保存部分。

先上最关键的核心处理部分,本文中的登录注册等Action都在该servlet中处理。

OnlyServlet.java

[java]view plain copypackagecom.wyt_register; importjava.io.IOException; importjava.io.PrintWriter; importjava.sql.ResultSet; importjava.sql.SQLException; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.json.JSONException; importorg.json.JSONStringer; importcom.wyt_register.db.UserDao; importcom.wyt_register.md5Tool.Base64Utils; importcom.wyt_register.md5Tool.Md5Utils; /** *ServletimplementationclassOnlyServlet */ @WebServlet("/OnlyServlet") publicclassOnlyServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; /** *@seeHttpServlet#HttpServlet() */ publicOnlyServlet(){ super(); //TODOAuto-generatedconstructorstub } /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub Stringaction=null;//根据请求的行为进行相应的操作 if((action=request.getParameter(Config.KEY_ACTION))!=null){ switch(action){ //如果是注册 caseConfig.KEY_REGISTER: System.out.println("正在请求注册"); //用户注册的账号 Stringaccount_register=request.getParameter(Config.KEY_USER_ACCOUNT); System.out.println(account_register); //用户注册的密码 Stringpwd_register=request.getParameter(Config.KEY_USER_PWD); System.out.println(pwd_register); //用户上传的头像 Stringicon=request.getParameter(Config.KEY_USER_ICON); if((null!=account_register)&&(null!=pwd_register)&&(null!=icon)){ //开启注册事务 //把唯一的账号名的md5值作为图片的名字 StringBuildersb0=newStringBuilder(""); //保存到数据库中的头像图片路径 sb0.append("/image/").append(Md5Utils.encode(account_register)).append(".png"); Stringicon_addr=sb0.toString(); System.out.println("头像图片地址:"+icon_addr); StringBuildersb1=newStringBuilder(""); //写入到本地的头像图片路径 sb1.append(Config.ADDR_ICON).append(Md5Utils.encode(account_register)).append(".png"); Stringlocal_icon_addr=sb1.toString(); System.out.println("保存到本地的地址"+local_icon_addr); PrintWriterwriter=response.getWriter(); //查询用户是否已经注册过 try{ ResultSetset=UserDao.query(account_register); //没注册过,需要注册 if(!set.next()){ //保存上传的头像至本地 booleanisSuccessToSaveImageToLocal=Base64Utils.getPicFormatBASE64(icon,local_icon_addr); if(isSuccessToSaveImageToLocal){ //头像上传成功后然后再插入账号密码到数据库 booleanisSuccessToRegister=UserDao.insert(newObject[]{Config.KEY_ID,Config.KEY_USER_ACCOUNT,Config.KEY_USER_PWD,Config.KEY_USER_ICON_ADDR},newObject[]{null,account_register,pwd_register,icon_addr}); if(isSuccessToRegister){ //注册成功 writer.print("{\"status\":1,\"errCode\":0x00000000}"); }else{ //注册失败 writer.print("{\"status\":0,\"errCode\":0x00000001}"); } } }else{ //注册过了 writer.print("{\"status\":0,\"errCode\":0x00000010}"); } }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } break; //如果是登录 caseConfig.KEY_LOGIN: PrintWriterwriter=response.getWriter(); //用户登录的账号 Stringaccount_login=request.getParameter(Config.KEY_USER_ACCOUNT); System.out.println("账号:"+account_login); //用户登录的密码 Stringpwd_login=request.getParameter(Config.KEY_USER_PWD); System.out.println("密码"+pwd_login); //用户登录的token Stringtoken=request.getParameter(Config.KEY_TOKEN); System.out.println("token的值是"+token); //如果用户采用账号密码登录 if((!account_login.equals(""))&&(!pwd_login.equals(""))&&token.equals("")){ //查询数据库,是否存在 try{ System.out.println("正在查询数据库"); ResultSetrs=UserDao.query(account_login); //如果该账号存在于数据库 if(rs.next()){ //获取该用户的密码 Stringpwd=rs.getString(3); System.out.println("pwd:"+pwd); Stringicon_usr_addr=rs.getString(4); System.out.println(icon_usr_addr); if(pwd_login.equals(pwd)){ //登录成功 //获取头像地址 Strings[]=rs.getString(4).split("/"); Stringusr_exact_addr="F:/webapps/Images/"+s[s.length-1]; System.out.println(usr_exact_addr); //得到base64字符串 Stringbase64img=Base64Utils.imageToBase64(usr_exact_addr); try{ Strings1=newJSONStringer().object() .key("status") .value(1) .key("errCode") .value("0x0") .key("user_icon") .value(base64img) .endObject() .toString(); writer.print(s1); }catch(JSONExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }else{ //登录失败 try{ Strings2=newJSONStringer().object() .key("status") .value(0) .key("errCode") .value("0x00000100") .endObject() .toString(); writer.print(s2); }catch(JSONExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }else{ //该账户不存在 try{ Strings3=newJSONStringer().object() .key("status") .value(0) .key("errCode") .value("0x00000011") .endObject() .toString(); writer.println(s3);; }catch(JSONExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } //如果用户采用token登录 if(token!=null){ } break; } } } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub doGet(request,response); } }

下面是在上面的servlet封装的关于数据库Dao的逻辑处理部分:

BaseDao.java

[java]view plain copypackagecom.wyt_register.db; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.sql.Statement; publicabstractclassBaseDao{ publicstaticjava.sql.Connectionconn; staticjava.sql.Statementstatement; BaseDao(){ conn=DbUtils.getConnection();//打开数据连接 try{ statement=conn.createStatement(); initStatement(statement); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } /** *该方法用于得到实例化Statement接口对象 *@paramstatement */ publicabstractvoidinitStatement(Statementstatement); /** *用于插入数据 *@paramb1键名 *@paramb2键值 *@throwsSQLException */ publicbooleaninsert(StringtableName,Object[]b1,Object[]b2){ StringBuildersb=newStringBuilder(); sb.append("INSERTINTO").append("`").append(tableName).append("`").append("("); for(Objectob:b1){ sb.append((String)ob).append(","); } sb.deleteCharAt(sb.length()-1); sb.append(")").append("").append("values").append("("); for(Objectob:b2){ if(obinstanceofInteger){ sb.append((Integer)ob).append(","); } if(obinstanceofjava.lang.String){ sb.append("'").append((String)ob).append("'").append(","); } if(obinstanceofjava.lang.Float){ sb.append((Float)ob).append(","); } if(obinstanceofjava.lang.Double){ sb.append((Double)ob).append(","); } if(ob==null){ sb.append("null").append(","); } } sb.deleteCharAt(sb.length()-1); sb.append(")"); System.out.println(sb.toString()); Stringsql=sb.toString(); introw; try{ row=statement.executeUpdate(sql); if(row>0){ //插入成功 returntrue; } DbUtils.closeConnection(conn); DbUtils.closeStatement(statement); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnfalse; } /** *该方法用来查询数据库某表中的某一字段值 *@paramtableName表名 *@paramcolumn字段 *@paramstringToQuery查询的参数 */ publicResultSetqueryExcute(StringtableName,Stringcolumn,StringstringToQuery){ Stringsql; ResultSetset=null; StringBuildersb=newStringBuilder(); sb.append("SELECT*FROM").append("`").append(tableName).append("`").append("").append("where").append(column).append("=") .append("'").append(stringToQuery).append("'"); sql=sb.toString(); try{ set=statement.executeQuery(sql); if(null==set){ returnnull; } }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnset; } }

UserDao.java

[java]view plain copypackagecom.wyt_register.db; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.sql.Statement; importcom.wyt_register.Config; publicclassUserDaoextendsBaseDao{ publicStatementstatement; publicUserDao(){ //TODOAuto-generatedconstructorstub System.out.println("正在执行RegisterDao"); } @Override publicvoidinitStatement(Statementstatement){ //TODOAuto-generatedmethodstub this.statement=statement; } publicstaticbooleaninsert(Object[]b1,Object[]b2)throwsSQLException{ returnnewUserDao().insert(com.wyt_register.Config.USER_TABLE,b1,b2); } publicstaticResultSetquery(Stringaccount)throwsSQLException{ ResultSetset=newUserDao().queryExcute(com.wyt_register.Config.USER_TABLE,Config.KEY_USER_ACCOUNT,account); returnset; } }<spanstyle="color:#ff0000;"> </span>

servlet配置文件:web.xml

[html]view plain copy<?xmlversion="1.0"encoding="UTF-8"?> <web-appxmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0"> <display-name>py02</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>OnlyServlet</servlet-name> <servlet-class>com.wyt_register.OnlyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OnlyServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

其他几个文件我就不一一放上来了,具体的我在这里打包服务器的代码。服务器端代码下载:有什么问题可以加我QQ790710371或者发送问题至邮箱790710371@。 服务器端代码下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。