- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">学习来源:网易云课堂《Android Client与Service的数据交互》</span>
这两天在学习客户端与服务器的交互,简单做了登陆功能。
#准备工作:
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<Object, Object, Object> {
- boolean result = true;
- String g_loginName, g_loginPassword;
- private final WeakReference<Activity> mActivity;
- private static ProgressDialog dialog;
- public LoginAsyncTask(LoginActivity activity, String loginName, String loginPassword)
- {
- g_loginName = loginName;
- g_loginPassword = loginPassword;
- mActivity = new WeakReference<Activity>(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<NameValuePair> params = new ArrayList<NameValuePair>();
- 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轨迹等。