涉及到的知识点:

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. 验证码程序Demo

    小伙伴都有这样的经历,册各种网站,总是输不对验证码,双十一那天狂买的小伙伴是不是对输入验证码有着不一样的感触呢,以前觉得验证码真是个麻烦鬼,一个不小心,一个眼拙,哎呦,没有输入正确,又是一阵子大眼瞪小 ...

  2. FFmpeg源代码结构图 - 解码

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  3. 为你的MacOS App添加开机自启动(Swift)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52104828 ...

  4. 【一天一道LeetCode】#257. Binary Tree Paths

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. C++中const加强

    demo // C语言中的const是一个冒牌货 int main() { // 好像a是一个常量 const int a = 10; int *p = NULL; p = (int *)&a ...

  6. 【一天一道LeetCode】#206. Reverse Linked List

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Reverse ...

  7. Java采用JDBC的方式连接Hive(SparkSQL)

    前两天,由于系统的架构设计的原因,想通过Java直接访问Hive数据库,对于我这个Java以及Hadoop平台的菜鸟来说,的确是困难重重,不过,还好是搞定了.感觉也不是很麻烦.这篇文章,作为一个感想记 ...

  8. Inventory Transactions Manager

    Overview Inventory Transaction Manager用于处理库存接口表(MTL_TRANSACTION_INTERFACE或者MTL_MATERIAL_TRANSACTIONS ...

  9. 精通CSS+DIV网页样式与布局--CSS段落效果

    在上一篇博文中,小编主要详细的介绍了CSS是如何控制文字的显示效果,随着需求的不断变更,那么我们如何对段落进行相关操作,以达到我们想要的效果呢,接下来,为了需要,小编继续来完善CSS对段落的控制的显示 ...

  10. 存储那些事儿(五):BTRFS文件系统之Btree结构详解

    Btree数据结构可以说是BTRFS文件系统的基础.它提供了一个通用的方式去存储不同的数据类型.它仅仅存储3个数据类型:key, item和block header. btrfs_header的定义如 ...