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