本文和大家一起了解了一下android客户端与服务端是怎样交互的,具体内容如下
1.后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。
servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径
我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便android客户端访问
helloWorld com.zhongzhong.wap.action.HelloServlet import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.zhongzhong.wap.bean.UserBean; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/html); PrintWriter out = resp.getWriter(); Boolean flag = false; String userName = req.getParameter(un); String password = req.getParameter(pw); if(userName.equals(htp)&&password.equals(123)) { flag = true; } else flag = false; System.out.println(userName:+userName+ password:+password); out.print(flag); out.flush(); out.close(); } } helloWorld /queryOrder
2.然后我是在安卓的ADT上创建一个安卓项目,建立两个Activity,分别作为登录界面和登录成功界面。
3.HTTP的访问公共类,用于处理GET和POST请求。
package com.example.logindemo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NamevaluePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNamevaluePair;
import org.apache.http.util.EntityUtils;
import android.content.Entity;
import android.util.Log;
public class HttpUtil {
// 创建HttpClient对象
public static HttpClient httpClient = new DefaultHttpClient();
public static final String base_URL = http://192.168.3.14:8090/HelloWord/;
public static String getRequest(String url) throws Exception {
// 创建HttpGet对象。
HttpGet get = new HttpGet(url);
// 发送GET请求
HttpResponse httpResponse = httpClient.execute(get);
// 如果服务器成功地返回响应
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 获取服务器响应字符串
String result = EntityUtils.toString(httpResponse.getEntity());
return result;
} else {
Log.d(服务器响应代码, (new Integer(httpResponse.getStatusLine()
.getStatusCode())).toString());
return null;
}
}
public static String postRequest(String url, Map rawParams)
throws Exception {
// 创建HttpPost对象。
HttpPost post = new HttpPost(url);
// 如果传递参数个数比较多的话可以对传递的参数进行封装
List params = new ArrayList();
for (String key : rawParams.keySet()) {
// 封装请求参数
params.add(new BasicNamevaluePair(key, rawParams.get(key)));
}
// 设置请求参数
post.setEntity(new UrlEncodedFormEntity(params, UTF-8));
// 发送POST请求
HttpResponse httpResponse = httpClient.execute(post);
// 如果服务器成功地返回响应
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 获取服务器响应字符串
String result = EntityUtils.toString(httpResponse.getEntity());
return result;
}
return null;
}
}
4.IntentService服务,用于在后台以队列方式处理耗时操作。
package com.example.logindemo;
import java.util.HashMap;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class ConnectService extends IntentService {
private static final String ACTION_RECV_MSG = com.example.logindemo.action.RECEIVE_MESSAGE;
public ConnectService() {
super(TestIntentService);
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
Boolean flag = false;
//通过intent获取主线程传来的用户名和密码字符串
String username = intent.getStringExtra(username);
String password = intent.getStringExtra(password);
flag = doLogin(username, password);
Log.d(登录结果, flag.toString());
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(ACTION_RECV_MSG);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(result, flag.toString());
sendBroadcast(broadcastIntent);
}
// 定义发送请求的方法
private Boolean doLogin(String username, String password)
{
String strFlag = ;
// 使用Map封装请求参数
HashMap map = new HashMap();
map.put(un, username);
map.put(pw, password);
// 定义发送请求的URL
String url = HttpUtil.base_URL + queryOrder?un= + username + &pw= + password; //GET方式
// String url = HttpUtil.base_URL + LoginServlet; //POST方式
Log.d(url, url);
Log.d(username, username);
Log.d(password, password);
try {
// 发送请求
strFlag = HttpUtil.postRequest(url, map); //POST方式
// strFlag = HttpUtil.getRequest(url); //GET方式
Log.d(服务器返回值, strFlag);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(strFlag.trim().equals(true)){
return true;
}else{
return false;
}
}
}
5.在AndroidManifest.xml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。
6.登陆界面处理,注意
按钮监听事件中,使用Intent将要传递的值传给service。接收广播类中,同样使用Intent将要传递的值传给下一个Activity。在onCreate()中,动态注册接收广播类的实例receiver。在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。
package com.example.logindemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String ACTION_RECV_MSG = com.example.logindemo.action.RECEIVE_MESSAGE;
private Button loginBtn;
private EditText et_username;
private EditText et_password;
private String userName;
private String passWord;
private MessageReceiver receiver ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//动态注册receiver
IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
}
private void initView() {
// TODO Auto-generated method stub
et_username = (EditText)findViewById(R.id.et_user);
et_password =( EditText)findViewById(R.id.et_psw);
loginBtn = (Button)findViewById(R.id.btn_login);
loginBtn.setonClickListener(new onClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(matchLoginMsg())
{
// 如果校验成功
Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);
msgIntent.putExtra(username, et_username.getText().toString().trim());
msgIntent.putExtra(password, et_password.getText().toString().trim());
startService(msgIntent);
}
}
});
}
protected boolean matchLoginMsg() {
// TODO Auto-generated method stub
userName = et_username.getText().toString().trim();
passWord = et_password.getText().toString().trim();
if(userName.equals())
{
Toast.makeText(MainActivity.this, 账号不能为空,Toast.LENGTH_SHORT).show();
return false;
}
if(passWord.equals())
{
Toast.makeText(MainActivity.this, 密码不能为空,Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
//接收广播类
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(result);
Log.i(MessageReceiver, message);
// 如果登录成功
if (message.equals(true)){
// 启动Main Activity
Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);
startActivity(nextIntent);
// 结束该Activity
finish();
//注销广播接收器
context.unregisterReceiver(this);
}else{
Toast.makeText(MainActivity.this, 用户名或密码错误,请重新输入!,Toast.LENGTH_SHORT).show();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。



