涉及到的知识点:

1.Struts2框架的搭建(包括Struts2的jSON插件)

2.Android前台访问Web采用HttpClient方式。

3.Android采用JSON的解析。

服务端主要包含一个Action,通过struts的web配置配置struts.xml驱动业务逻辑的执行,然后对于符合条件的登录,返回给客户端通过jsonobject包装的数据。

服务端代码:

  1. package com.easyway.json.android;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.apache.struts2.interceptor.ServletRequestAware;
  7. import org.apache.struts2.interceptor.ServletResponseAware;
  8. import com.opensymphony.xwork2.ActionSupport;
  9. /**   * 模拟登录,并返回json数据 @author xiangzhihong
  10. */
  11. public class LoginAction extends ActionSupport implements ServletRequestAware,
  12. ServletResponseAware {
  13. /** * */
  14. private static final long serialVersionUID = 1L;
  15. HttpServletRequest request;
  16. HttpServletResponse response;
  17. private String userName;
  18. private String password;
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. public String getUserName() {
  26. return userName;
  27. }
  28. public void setUserName(String userName) {
  29. this.userName = userName;
  30. }
  31. public void setServletRequest(HttpServletRequest request) {
  32. this.request = request;
  33. }
  34. public void setServletResponse(HttpServletResponse response) {
  35. this.response = response;
  36. }
  37. /**
  38. * 模拟用户登录的业务
  39. */
  40. public void login() {
  41. try {
  1. this.response.setContentType("text/json;charset=utf-8");
  2. this.response.setCharacterEncoding("UTF-8");
  3. //JSONObject json=new JSONObject();
  4. Map<String,String> <span style="color: #ff0000;">json</span>=new HashMap<String,String>();
  5. if ("admin".equals(userName)&&"123456".equals(password)) {
  6. json.put("message", "欢迎管理员登陆");
  7. } else if ((!"admin".equals(userName))&&"123456".equals(password)) {
  8. json.put("message", "欢迎"+userName+"登陆!");
  9. } else {
  10. json.put("message", "非法登陆信息!");
  11. }
  12. byte[] jsonBytes = json.toString().getBytes("utf-8");
  13. response.setContentLength(jsonBytes.length);
  14. response.getOutputStream().write(jsonBytes);
  15. response.getOutputStream().flush();
  16. response.getOutputStream().close();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

   接下来是客户端代码,用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[])
                    .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")){
                    ] ="登录成功";
                }else {
                    ] ="登录失败";
                }
            }
        });
    }
}

好了,就到这,有需要的需要体验的请到我的git账号下载测试程序。

服务端代码:https://github.com/xiangzhihong/login

客户端代码:https://github.com/xiangzhihong/loginAndroid

Android+struts2+json方式模拟手机登录功能的更多相关文章

  1. Android+struts2+JSON方式的手机开发(Login)

    在手机的后台服务无论是调用WebService还是Http请求,多数都是采用Android的HttpClient实现相关的调用实现.本文实现Android+Struts2+JSON方式实现为手机前台提 ...

  2. Struts2整合Hibernate3实现用户登录功能

    所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...

  3. Struts2的一个入门实例----登录功能

    一.搭建环境与测试 1.web.xml文件,配置核心Filter 1: <?xml version="1.0" encoding="UTF-8"?> ...

  4. chrome模拟手机功能

    在搭建好web側环境之后.能够使用chrome来模拟手机的功能 直接上图吧: 图1是直接模拟一个通用的界面 图2里面能够选择不同的手机型号,还是比較全的! 选择一个查看一下,和手机是一样的效果,非常赞 ...

  5. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  6. 设计基于HTML5的APP登录功能及安全调用接口的方式

    转自:http://blog.csdn.net/linlzk/article/details/45536065 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而 ...

  7. 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)

    登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...

  8. 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能

    现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...

  9. android使用smack实现简单登录功能

    android端采用xmpp协议实现即时通讯,在最开始的登录功能就遇到了不少障碍.首先在官网(https://www.igniterealtime.org/projects/openfire/)下载o ...

随机推荐

  1. Java基本语法-----java流程控制语句

    1顺序语句 语句:使用分号分隔的代码称作为一个语句. 注意:没有写任何代码只是一个分号的时候,也是一条语句,称作空语句. 顺序语句就是按照从上往下的顺序执行的语句. 2判断(if-else) 在我们找 ...

  2. Android开发 Jar mismatch! Fix your dependencies的问题

    有时候,当我们在导入Library的时候,会遇到Jar mismatch! Fix your dependencies这个错误.可能有如下原因: 1.两个项目的android-support-v4.j ...

  3. Dynamics CRM2015 Custom Code Validation Tool工具的使用

    工具下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=45535 下载后双击exe文件解压后里面会有个zip文件,将文件导入系 ...

  4. Cocos2D iOS之旅:如何写一个敲地鼠游戏(十一):完善游戏逻辑

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. C++之多态性与虚函数

    面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...

  6. R12: Improving Performance of General Ledger and Journal Import (Doc ID 858725.1 )

    In this Document   Purpose   Scope   Details   A) Database Init.ora Parameters   B) Concurrent Progr ...

  7. Swing——动作(Action)

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41258997 Action接口扩展于ActionListe ...

  8. linux 编译c程序与动态链接库

    linux 下编译c程序与动态链接库 1 动态库h文件和c文件 1.1 h 文件: kaflog4c.h /** * kaflog4c.h */ #include <stdio.h> #i ...

  9. 谈谈Ext JS的组件——布局的使用方法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回想到了使用Foxpro开发的时候,哪时候的界面布局就是这样,通过设置控件的左上角坐标(x,y)和宽度来进行的,因为 ...

  10. MinerUrl.java 解析页面后存储URL类

    MinerUrl.java 解析页面后存储URL类 package com.iteye.injavawetrust.miner; /** * 解析页面后存储URL类 * @author InJavaW ...