前台
这个小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所以也需要到上面谈到的几个包