涉及到的知识点:
1.Struts2框架的搭建(包括Struts2的jSON插件)
2.Android前台访问Web采用HttpClient方式。
3.Android采用JSON的解析。
服务端主要包含一个Action,通过struts的web配置配置struts.xml驱动业务逻辑的执行,然后对于符合条件的登录,返回给客户端通过jsonobject包装的数据。
服务端代码:
- package com.easyway.json.android;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import org.apache.struts2.interceptor.ServletResponseAware;
- import com.opensymphony.xwork2.ActionSupport;
- /** * 模拟登录,并返回json数据 @author xiangzhihong
- */
- public class LoginAction extends ActionSupport implements ServletRequestAware,
- ServletResponseAware {
- /** * */
- private static final long serialVersionUID = 1L;
- HttpServletRequest request;
- HttpServletResponse response;
- private String userName;
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
- public void setServletResponse(HttpServletResponse response) {
- this.response = response;
- }
- /**
- * 模拟用户登录的业务
- */
- public void login() {
- try {
- this.response.setContentType("text/json;charset=utf-8");
- this.response.setCharacterEncoding("UTF-8");
- //JSONObject json=new JSONObject();
- Map<String,String> <span style="color: #ff0000;">json</span>=new HashMap<String,String>();
- if ("admin".equals(userName)&&"123456".equals(password)) {
- json.put("message", "欢迎管理员登陆");
- } else if ((!"admin".equals(userName))&&"123456".equals(password)) {
- json.put("message", "欢迎"+userName+"登陆!");
- } else {
- json.put("message", "非法登陆信息!");
- }
- byte[] jsonBytes = json.toString().getBytes("utf-8");
- response.setContentLength(jsonBytes.length);
- response.getOutputStream().write(jsonBytes);
- response.getOutputStream().flush();
- response.getOutputStream().close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
接下来是客户端代码,用AsyncHttpClient进行网络的请求,如果包含我返回的json字符串的标志,我认为访问成功
客户端代码:
package xzh.com.listviewhover.ui; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.StrictMode; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import xzh.com.listviewhover.R; import xzh.com.listviewhover.base.Constants; /** * Created by xiangzhihong on 2016/3/14 on 12:07. * 测试服务端的登录json */ public class LoginActivity extends AppCompatActivity { @InjectView(R.id.account) EditText account; @InjectView(R.id.pwd) EditText pwd; @InjectView(R.id.login) Button login; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { initProxy(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.inject(this); initView(); } private void initProxy() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); //设置虚拟机的策略 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); } private void initView() { } @OnClick(R.id.login) void loginClick(View v){ String userName=account.getText().toString(); String password=pwd.getText().toString(); doLogin(userName,password); } private void doLogin(String userName, String password) { final String[] result = {null}; String reqUrl=null; reqUrl= Constants.LOGIN_URL+"userName="+userName+"&password="+password; try { doHttp(result, reqUrl); AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("提示") .setMessage(result[0]) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startActivity(new Intent(LoginActivity.this,MainActivity.class)); } }).setNegativeButton("取消",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create().show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void doHttp(final String[] result, String reqUrl) { // HttpClient httpclient = new DefaultHttpClient(); // HttpGet request=new HttpGet(reqUrl); // request.addHeader("Accept","text/json"); // HttpResponse response =httpclient.execute(request); // HttpEntity entity=response.getEntity(); // String json = EntityUtils.toString(entity,"UTF-8"); // if(json!=null&&json.contains("message")){ //// JSONObject jsonObject=new JSONObject(json); //// result=jsonObject.get("message").toString(); // result="登录成功"; // }else { // result="登录失败请重新登录"; // } AsyncHttpClient client = new AsyncHttpClient(); client.get(this,reqUrl,new AsyncHttpResponseHandler(){ @Override public void onSuccess(String content) { super.onSuccess(content); if (content!=null&&content.contains("message")){ result[0] ="登录成功"; }else { result[0] ="登录失败"; } } }); } }好了,就到这,有需要的需要体验的请到我的git账号下载测试程序。
服务端代码:https://github.com/xiangzhihong/login
客户端代码:https://github.com/xiangzhihong/loginAndroid