Android开发一客户端与服务器交互(登陆功能)

学习来源:网易云课堂《Android Client与Service的数据交互》

这两天在学习客户端与服务器的交互,简单做了登陆功能。

#准备工作:

1, 搭建JavaEE开发环境,下载对应eclipse

2, 安装Tomcat

3, 安装tomcat eclipse插件,http://www.eclipsetotale.com/tomcatPlugin/


#直接开始:

1, 新建dynamic web project, 一路默认吧

2, 根据课程指导,将tomcat-->lib文件夹下的三个文件放到工程目录(WebContent-->lib)中:

* el-api.jar; jsp-api.jar; servlet-api.jar

3, src文件夹下,新建包和类,类LoginServlet4Android扩展HttpServlet

新建以后就会有,两个主要的实现方法==========================


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("---get---");
		this.doPost(request, response);
	}

	/**
	 *  URL?para1=value1 2=value2&...
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// 
		
		//
		request.setCharacterEncoding("UTF-8");
		
		//
		String loginName = request.getParameter("LoginName");
		String loginPassWord = request.getParameter("LoginPassWord");
		
		/**
		 * text/html
		 */
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8"); 
		PrintWriter out = null;
		/**
		 * Login logical judge
		 */
		DataOutputStream output = new DataOutputStream(response.getOutputStream());
		try{
			out = response.getWriter();
			if(loginName.equals("sun") && loginPassWord.equals("011"))
			{
				//right to client  response..
				output.writeUTF("server data: success!");
				output.writeInt(1);
			}
			else
			{
				//wrong
				output.writeUTF("server data: fail!");
				out.print("failed");
			}
		}
		finally
		{
			if(out != null)
				out.close();
			if(output != null)
				output.close();
		}
		
	}

服务器端的代码比较简单,主要在doPost中接收数据,并验证。后期希望能有一个数据库存放相应的数据。

------------------------------------------------------------------------------------------------------------------------------------------------------

Android端的实现:

package com.example.service;

import java.lang.ref.WeakReference;

import com.example.mapsun.LoginActivity;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;

public class LoginAsyncTask extends AsyncTask {

	boolean result = true;
	String g_loginName, g_loginPassword;
	private final WeakReference mActivity;
	private static ProgressDialog dialog;
	
	public LoginAsyncTask(LoginActivity activity, String loginName, String loginPassword)
	{
		g_loginName = loginName;
		g_loginPassword = loginPassword;
		mActivity = new WeakReference(activity);
	}
	
	@Override  
    protected void onPreExecute() {  
		if(null == dialog){
			dialog = new ProgressDialog(mActivity.get());
		}
		dialog.setTitle("please wait");
		dialog.setMessage("Logining...");
		dialog.setCancelable(false);
		dialog.show();
    }  
	



	@Override
	protected Object doInBackground(Object... arg0) {
		// TODO Auto-generated method stub
		UserService userServ  = new UserServiceImpl();
		try {
			result = userServ.userLogin(g_loginName, g_loginPassword);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	
	//
	protected void onPostExecute(Object result) {
        
        //获得服务器返回信息成功后
		String strMsg;
		if(result.equals(true))
		{
			strMsg = "success";
		}
		else
			strMsg = "failed";
		((LoginActivity)mActivity.get()).ShowTip(strMsg);
        //取消进度条
        dialog.cancel();
    }
}

这里实现了一个继承AsyncTask的类, 异步去发送服务器的请求,在构造函数中传递界面的一些参数,从而实现界面的一些变化。

这个类我之前的博客中也用来实现过异步加载显示图片的操作。挺好用的,其实底层页封装了Handler的一些操作。


好了,今天就粗略的贴一下这两天的实现代码,虽然Android手机还是不能访问电脑上的服务器,昨天还可以的。。


=======================补充:UserService的userLogin功能实现=============2014-12-10=============================

主要是接收服务器端的数据操作,代码如下:

package com.example.service;

public class UserServiceImpl implements UserService {

	private static final String TAG = "UserServiceImplement";
	
	@Override
	public boolean userLogin(String loginName, String loginPassword)
			throws Exception {
		// TODO Auto-generated method stub
		
		
		String result;
		HttpPost httpPost = new HttpPost(UriAPI.HTTPCustomer);
		
		//create params
		List params = new ArrayList();
		params.add(new BasicNameValuePair("LoginName", loginName));
		params.add(new BasicNameValuePair("LoginPassWord", loginPassword));
		
		try{
			//encode data
			httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
			HttpResponse httpResp = new DefaultHttpClient().execute(httpPost);
			//get response 
			if (httpResp.getStatusLine().getStatusCode()==200) {
                             byte[] data =new byte[2048];
                             data =EntityUtils.toByteArray((HttpEntity)httpResp.getEntity());
                             ByteArrayInputStream bais = new ByteArrayInputStream(data);
                             DataInputStream dis = new DataInputStream(bais);
                             result=new String(dis.readUTF());
                                  Log.i("service result:", result);
                             return true;
            }
			
		}catch(ClientProtocolException e){  
            e.printStackTrace();  
        }catch(UnsupportedEncodingException e){  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
		return false;
	}
	


	public class UriAPI{
		//
		public static final String HTTPCustomer = "http://192.168.0.56:8080/firstweb/login.do";
	}
}


总结:登陆功能主要熟悉了服务端的HttpServlet的操作,其中还学习了Java web相关的一些基础,和Android客户端HttpPost的实现,回顾了了AsyncTask类,以及一些Android基本的内容,算是这个项目的开始吧。

另外,上述代码中存在很多细节问题,先放一放,后面会专注在Android客户端上的功能实现,包括界面布局,拍照功能,GPS轨迹等。



















你可能感兴趣的:(Android开发)