当前位置: 代码迷 >> Android >> android的前后台通讯
  详细解决方案

android的前后台通讯

热度:22   发布时间:2016-05-01 12:26:33.0
android的前后台通信

前台

这个小demo是使用手机登陆和后台的web站点通信

手机项目中的: activity_main.xml布局xml的配置

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/LinearLayout1"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world"        tools:context=".MainActivity" />     <EditText        android:id="@+id/name"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:inputType="text"        />      <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/pwd"        tools:context=".MainActivity" />    <EditText        android:id="@+id/pwd"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:inputType="text"        />      <Button        android:id="@+id/btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/btntext"        /></LinearLayout>

界面截图:

 

和后台通信的本质还是通过http协议来发送请求和接受请求的,所以要实现通信的效果,还需要有辅助的类来实现,可以不需要太明白这三个类的具体操作,知道如何使用就可以了

HttpHelper类:

package com.etc.help;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.apache.http.HttpResponse;import org.apache.http.ParseException;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.params.ClientPNames;import org.apache.http.client.params.CookiePolicy;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.protocol.BasicHttpContext;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils; public classHttpHelper {    DefaultHttpClienthttpClient = new DefaultHttpClient();    HttpContextlocalContext = new BasicHttpContext();    private boolean abort;    private String ret;    HttpResponseresponse = null;    HttpPosthttpPost = null;    public HttpHelper() {    }    public void clearCookies() {        httpClient.getCookieStore().clear();    }    public void abort() {        try {            if (httpClient != null) {                System.out.println("Abort.");                httpPost.abort();                abort = true;            }        }catch(Exception e) {            System.out.println("HTTPHelp : Abort Exception : " + e);        }    }    public String postPage(Stringurl, String data, boolean returnAddr) {        ret = null;        data=  data == null ?  "" : data;        httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,                CookiePolicy.RFC_2109);        httpPost = new HttpPost(url);        response = null;        StringEntitytmp = null;        httpPost.setHeader(                "User-Agent",                "Mozilla/5.0 (X11; U; Linux "                        +"i686; en-US; rv:1.8.1.6) Gecko/20061201Firefox/2.0.0.6 (Ubuntu-feisty)");        httpPost.setHeader(                "Accept",                "text/html,application/xml,"                        +"application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");        httpPost.setHeader("Content-Type","application/x-www-form-urlencoded");         try {            tmp= newStringEntity(data, "UTF-8");        }catch(UnsupportedEncodingException e) {            System.out                    .println("HTTPHelp : UnsupportedEncodingException : " + e);        }        httpPost.setEntity(tmp);        try {            response = httpClient.execute(httpPost, localContext);        }catch(ClientProtocolException e) {            System.out.println("HTTPHelp : ClientProtocolException : " + e);        }catch(IOException e) {            System.out.println("HTTPHelp : IOException : " + e);        }        try {            ret = EntityUtils.toString(response.getEntity());        }catch(ParseException e) {            e.printStackTrace();        }catch(IOException e) {            e.printStackTrace();        }        return ret;    } }

HttpTask类:

package com.etc.task;import com.etc.help.HttpHelper;import android.content.Context;import android.os.AsyncTask;public classHttpTask extendsAsyncTask<String, Void, Void> {    protected String response;   protectedHttpCallback callback;    private Context context;   private boolean interact ;   privateHttpHelper httpHelper= newHttpHelper();    public HttpTask(Contextcontext , booleaninteract){    super();    this.interact = interact;    this.context = context;    if(interact){        //this.dialog =  newProgressDialog(context);    }   }      publicHttpTask(Context context){    this(context,true);   }    @Override    protected VoiddoInBackground(String... params) {        if(params.length > 1){           response = httpHelper.postPage(params[0],params[1], true);           } else{           response = httpHelper.postPage(params[0], null, true);           }           return null;    }    // can use UI thread here   protected void onPostExecute(Voidunused) {       if(interact){       //dialog.dismiss();       }       if(callback != null){       callback.callback(response);       }         }    public voidsetCallback(HttpCallback callback) {        this.callback = callback;    }}

HttpCallback接口:

package com.etc.task;public interface HttpCallback {    void callback(Stringresponse);}

主Activity类: MainActivity类

package com.etc.login;import java.util.ArrayList;import java.util.List;import org.apache.http.NameValuePair;import org.apache.http.client.utils.URLEncodedUtils;import org.apache.http.message.BasicNameValuePair;import com.etc.task.HttpCallback;import com.etc.task.HttpTask;import com.example.login.R;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import entity.User; import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;//该类实现了OnClickListener类和HttpCallback(上面引入的接口)接口public classMainActivity extends Activity implements OnClickListener,HttpCallback {    EditTextname;  //保存用户名    EditTextpwd;   //保存密码    Buttonbtn;    StringserverUrl="/LoginTest/Login";    //获取请求后台的Servlet   @Override   public void onCreate(BundlesavedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取界面的各个元素        name=(EditText) findViewById(R.id.name);        pwd=(EditText) findViewById(R.id.pwd);        btn=(Button) findViewById(R.id.btn);        //获取strings.xml中的server的string的值,值为 Http://站点的ip:8080/        serverUrl=getResources().getString(R.string.server)+serverUrl;        btn.setOnClickListener(this);          }   //登陆的单击事件    @Override    public void onClick(View v) {        //参数值对        List<NameValuePair>params=newArrayList<NameValuePair>();        Stringnamestr=name.getText().toString();        Stringpwdstr=pwd.getText().toString();        params.add(new BasicNameValuePair("userName",namestr));        params.add(new BasicNameValuePair("userPwd",pwdstr));         //将List集合转为参数string        String data=URLEncodedUtils.format(params,"utf-8");        //HttpTask为上面引入的类        HttpTasktask=newHttpTask(this);        //条用回调函数        task.setCallback(this);        //执行请求的方法        task.execute(serverUrl,data);    }   //回调函数    /* (non-Javadoc) response是后台返回的结果     * @seecom.etc.task.HttpCallback#callback(java.lang.String)     */     @Override    public void callback(Stringresponse) {                //接收string         System.out.println("后台返回的结果:"+response);           Gson gson=new Gson();         //接收对象//         Useruser=gson.fromJson(response,User.class);//        System.out.println("name:"+user.getName()+"pwd:"+user.getPwd());         //接收对象集合         User[]users=gson.fromJson(response,User[].class);         for(User u:users)         {         System.out.println("name:"+u.getName()+",pwd:"+u.getPwd());         }       System.out.println("接收完成");    }}

实体类User就两个字段:

public class User{    private String name;    private String pwd;}

应为项目还使用到了Json 还需要在项目中引入几个jar包

gson-1.6.jar

json-lib-2.0-jdk13.jar

ksoap2-android-assembly-2.3-jar-with-dependencies.jar

要是前台能和后台通信,还需要在android的AndroidManifest.xml中设置用户权限添加

<uses-permissionandroid:name="android.permission.INTERNET"/>

有关上面引入的三个类和上面谈到的三个jar包的百度链接:http://pan.baidu.com/share/link?shareid=161981&uk=909074031

后台

Web项目中的Servlet类  Login类:

package servlet;import java.io.IOException;import java.util.ArrayList;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import commans.WebUtils;import entity.User;public class Login extends HttpServlet{    public void doGet(HttpServletRequest request, HttpServletResponseresponse)            throws ServletException, IOException    {            doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {          String userName=request.getParameter("userName");          String userPwd=request.getParameter("userPwd");          String new1=newString(userName.getBytes("8859_1"),"utf-8");          String new2=newString(userPwd.getBytes("8859_1"),"utf-8");          System.out.println("用户名:"+new1+",密码:"+new2);          //以字符串返回         //WebUtils.writeJson(response,"登入成功!用户名:"+userName+",密码:"+userPwd);                   //返回对象//          JsonObject jsonObject=new JsonObject();//         jsonObject.addProperty("name",userName);//          jsonObject.addProperty("pwd",userPwd);                  //          User user=new User();//          user.setName(userName);//          user.setPwd(userPwd);//          GsonBuilder bulid=newGsonBuilder();//          Gson gson=bulid.create();//          String result=gson.toJson(user);//          WebUtils.writeJson(response, result);                   //返回list集合//          JsonArray jsonArray=new JsonArray();//          for(int i=0;i<3;i++)//          {//             JsonObject json=new JsonObject();//             json.addProperty("name",userName+i);//             json.addProperty("pwd",userPwd+i);//             jsonArray.add(json);//          }                 ArrayList<User> list=newArrayList<User>();        for(int i=0;i<3;i++)        {             User u=new User(new1+i,new2+i);             list.add(u);        }        GsonBuilder bulid=new GsonBuilder();        Gson gson=bulid.create();        String result=gson.toJson(list);        WebUtils.writeJson(response,result);    }}

WebUtils类只是条用了Httpresponse返回了数据而已:

public class WebUtils{    //resonpse返回值    public static void writeJson(HttpServletResponse response,String result)    {    response.setContentType("application/json;charset=utf-8");    PrintWriterout;    try        {            out=response.getWriter();            out.write(result);            out.flush();            out.close();        }        catch (IOException e)        {            e.printStackTrace();        }       }}

因为在项目中也用到了Json所以也需要到上面谈到的几个包


  相关解决方案