服务端

(一)DBManager 数据库管理

负责连接数据库和封装三个方法,1、获取数据库信息 2、根据sql语句查询 3、根据sql语句更新

public class DBManager {

    public final static String TABLE_NAME="android_user";

    public final static String USERNAME="username";
    public final static String PASSWORD="password";
    public Statement getStatement() {
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc");
            connection = (Connection) DriverManager.getConnection("jdbc:sqlserver://localhost:1433;useUnicode=true;databaseName=mybatis", "sa", "12345678");
            statement = connection.createStatement();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return statement;
    }
    public ArrayList<HashMap<String,Object>> getDatabaseInfo()
    {
        ArrayList<HashMap<String,Object>> lists=new ArrayList<>();
        HashMap<String,Object> map=null;
        String sql = " select * from  " + TABLE_NAME;
        Statement statement = getStatement();
        ResultSet resultSet=null;
        try {
            resultSet=statement.executeQuery(sql);
            if(resultSet.next())
            {
                map=new HashMap<>();
                map.put(USERNAME,resultSet.getString(DBManager.USERNAME));
                map.put(PASSWORD,resultSet.getString(DBManager.PASSWORD));
                lists.add(map);
            }
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return lists;
    }
    //查询返回结果集
    public ResultSet query(String sql) {
        ResultSet resultSet = null;
        Statement statement = getStatement();
        System.out.println("stmt = " + statement);
        try {
            resultSet = statement.executeQuery(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resultSet;
    }
    //更新返回更新条数
    public int update(String sql) {
        Statement statement = getStatement();
        int result = 0;
        try {
            result = statement.executeUpdate(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }
}

(二)LoginHandler登录处理

继承HttpServlet,根据客户端传来的username,password判断,然后把四种情况的result(Json格式)通过output.writeUTF(result);返回给客户端

public class LoginHandler extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        resp.setContentType("text/html; charset=UTF-8");

        DataOutputStream output=new DataOutputStream(resp.getOutputStream());

        String userName=req.getParameter("username");
        String password=req.getParameter("password");

        String result=doLogin(userName,password);
        System.out.println("result = " + result);
        output.writeUTF(result);

    }

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    public void destroy() {
        super.destroy();
    }

    private String doLogin(String userName, String password) {
        /*
         * login_result:
         * -1:登陆失败,未知错误!
         * 0: 登陆成功!
         * 1:登陆失败,用户名或密码错误!
         * 2:登陆失败,用户名不存在!
         * */
        HashMap<String,Object> map=new HashMap<>();
        String sql="select * from"+ DBManager.TABLE_NAME+" where "+DBManager.USERNAME+" = "+"'"+userName+"'";
        DBManager dbManager=new DBManager();
        ResultSet result=dbManager.query(sql);
        try{
            result.next();
            String pwd=result.getString(DBManager.PASSWORD);
            if (!password.equals(pwd))
            {
                map.put("login_result",-1);
            }else
            {
                map.put("login_result",0);
                map.put(DBManager.USERNAME,result.getString(DBManager.USERNAME));
                map.put(DBManager.PASSWORD,result.getString(DBManager.PASSWORD));
            }

        }catch (SQLException e)
        {
            e.printStackTrace();
            map.put("login_result",2);
        }
        return (new Gson()).toJson(map);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

(三)NewUser 注册

public class NewUser extends HttpServlet{


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        Content-Type
         用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
         CharacterEncoding
         作用是设置对客户端请求进行重新编码的编码

         也就是说一个是设置读,一个是设置取
         */
        resp.setContentType("text/html;charset=UTF-8");
        //DataOutputStream将负责建立到中间人的连接 ,获取响应输出流对象,然后在里面写东西
        DataOutputStream output=new DataOutputStream(resp.getOutputStream());
       //根据请求获取单个用户信息
        HashMap<String,Object> map=getParamsFromRequest(req);
        //判断是否存在该用户
        String result=HandleNewUser(map);
        output.writeUTF(result);
    }

    private String HandleNewUser(HashMap<String, Object> map) {
        /*
         *   result_code:
         * 0 用户名不存在,可以正常注册
         * 1  用户名已存在
         * 2 数据库操作异常
         * */
        //result存放三种情况的标记
        HashMap<String,Object> result=new HashMap<>();
        String userName= (String) map.get(DBManager.USERNAME);
        if(isUsernameExisted(userName))
        {
            result.put("result_code", 1);
        }else {
            DBManager dbManager=new DBManager();
            String password= (String) map.get(DBManager.PASSWORD);
            String sql = "Insert into " + DBManager.TABLE_NAME + " values ("
                    + "'" + userName + "',"
                    + "'" + password +  "')";

            System.out.println("sql = " + sql);
            int executeResult = dbManager.update(sql);
            if(executeResult == 0) {
                result.put("result_code", 2);
            } else {
                result.put("result_code", 0);
            }
        }
        //Gson将java对象转换为JSON
        return (new Gson()).toJson(result);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }


   //根据请求获取单个用户信息
    HashMap<String,Object> getParamsFromRequest(HttpServletRequest request)
    {
        HashMap<String,Object> map=new HashMap<>();
        map.put(DBManager.USERNAME,request.getParameter(DBManager.USERNAME));
        map.put(DBManager.PASSWORD,request.getParameter(DBManager.PASSWORD));
        return map;
    }
    boolean isUsernameExisted(String username)
    {
        Boolean isExisted=true;
        DBManager dbManager=new DBManager();
        String sql="select * from "+DBManager.TABLE_NAME+" where "
                +DBManager.USERNAME+" = "+"'"+username+"'";
        ResultSet resultSet= dbManager.query(sql);
        try {
            resultSet.next();
            String user=resultSet.getString("1");
            isExisted=true;

        }catch (SQLException e)
        {
            isExisted=false;
            e.printStackTrace();

        }
        return isExisted;
    }
}

android客户端

(一)LoginActivity

public class LoginActivity extends Activity implements OnClickListener {
    private EditText loginUsername;
    private EditText loginPassword;
    private Button loginButton;
    private Button createButton;

    private ProgressDialog loginProgress;

    public static final int MSG_LOGIN_RESULT = 0;


    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case MSG_LOGIN_RESULT:
                loginProgress.dismiss();
                JSONObject json = (JSONObject) msg.obj;
                handleLoginResult(json);
                break;
            }
        };
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        initViews();
    }
    private void initViews() {
        loginUsername = (EditText)findViewById(R.id.login_username);
        loginPassword = (EditText)findViewById(R.id.login_password);
        loginButton   = (Button)findViewById(R.id.login);
        createButton  = (Button)findViewById(R.id.create_count);

        loginButton.setOnClickListener(this);
        createButton.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.login:
            handleLogin();
            break;
        case R.id.create_count:
            handleCreateCount();
            break;
        default:
            break;  
        }

    }
    private void handleLogin() {
        String username = loginUsername.getText().toString();
        String password = loginPassword.getText().toString();
        login(username, password);
    }
    private void login(final String username, final String password) {
        loginProgress = new ProgressDialog(this);
        loginProgress.setCancelable(false);
        loginProgress.setCanceledOnTouchOutside(false);
        loginProgress.show(this, null, "登录中...");

        //创建子线程用于网络连接
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("First app", "start network!");
                HttpClient client = new DefaultHttpClient();
                 创建一个HttpPost对象,传入目标的网络地址
                HttpPost httpPost = new HttpPost("http://192.168.1.116:8080/AndroidWeb/servlet/LoginHandler");
                /*
                 * 通过一个NameValuePair集合来存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity中
                 */
                List<NameValuePair> params = new ArrayList<NameValuePair>(); 
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));

                HttpResponse httpResponse = null;
                try {
                    //调用HttpPost的setEntity()方法将构建好的UrlEncodedFormEntity传入
                    httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                    //调用HttpClient的execute()方法,并将HttpPost对象传入
                    //执行execute()方法之后会返回一个HttpResponse对象,服务器所返回的所有信息就保护在HttpResponse里面
                    httpResponse = client.execute(httpPost);
                    //先取出服务器返回的状态码,如果等于200就说明请求和响应都成功了
                    if(httpResponse.getStatusLine().getStatusCode() == 200) {
                        Log.d("First app", "network OK!");
                        HttpEntity entity = httpResponse.getEntity();
                        把实体内容转成字符串
                        String entityString = EntityUtils.toString(entity);
                        String jsonString = entityString.substring(entityString.indexOf("{"));
                        Log.d("First app", "entity = " + jsonString);
                        // 转成json
                        JSONObject json = new JSONObject(jsonString);
                        sendMessage(MSG_LOGIN_RESULT, json);
                        Log.d("First app", "json = " + json);
                    }
                } catch (UnsupportedEncodingException e) {
                    Log.d("yanghongbing", "UnsupportedEncodingException");
                    e.printStackTrace();
                } catch (ClientProtocolException e) {
                    Log.d("yanghongbing", "ClientProtocolException");
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.d("yanghongbing", "IOException");
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (JSONException e) {
                    Log.d("yanghongbing", "IOException");
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

    }
    private void handleCreateCount() {
        Intent intent = new Intent(this, CreateUserActivity.class);
        startActivity(intent);
        finish();
    }

    private void handleLoginResult(JSONObject json){
        /*
         * 
         * */
        int resultCode = -1;
        try {
            resultCode = json.getInt("result_code");
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        switch(resultCode) {
        case 0:
            onLoginSuccess(json);
            break;
        case 1:
            Toast.makeText(this, "登陆失败,用户名或密码错误!", Toast.LENGTH_SHORT).show();
            break;
        case 2:
            Toast.makeText(this, "用户名不存在", Toast.LENGTH_SHORT).show();
            break;
        case -1:
        default:
            Toast.makeText(this, "登陆失败!未知错误", Toast.LENGTH_SHORT).show();
            break;
        }
    }

    private void onLoginSuccess(JSONObject json) {
        Intent intent = new Intent(this, UserInfoActivity.class);

        try {
            intent.putExtra("username", json.getString("username"));
            intent.putExtra("gender", json.getString("gender"));
            intent.putExtra("age", json.getInt("age"));
            intent.putExtra("phone", json.getString("phone"));
            intent.putExtra("email", json.getString("email"));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        startActivity(intent);
        finish();
    }
    private void sendMessage(int what, Object obj) {
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        mHandler.sendMessage(msg);
    }
}

(二)CreateUserActivity

public class  extends Activity implements OnClickListener {

    public static final String CREATE_ACCOUNT_URL = "http://192.168.1.116:8080/AndroidWeb/servlet/NewUser";
    public static final int MSG_CREATE_RESULT = 1;

    private EditText eUsername;
    private EditText ePwd1;
    private EditText ePwd2;


    private Button btnSubmit;
    private Button btnReset;

    ProgressDialog progress;


    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case MSG_CREATE_RESULT:
                progress.dismiss();
                JSONObject json = (JSONObject) msg.obj;
                hanleCreateAccountResult(json);
                break;
            }
        }   
    };

    private void hanleCreateAccountResult(JSONObject json) {
        /*
         *   *   result_code: 
         * 0  注册成功
         * 1  用户名已存在
         * 2 数据库操作异常
         * */
        int result;
        try {
            result = json.getInt("result_code");
        } catch (JSONException e) {
            Toast.makeText(this, "没有获取到网络的响应!", Toast.LENGTH_LONG).show();
            e.printStackTrace();
            return;
        }

        if(result == 1) {
            Toast.makeText(this, "用户名已存在", Toast.LENGTH_LONG).show();
            return;
        }

        if(result == 2) {
            Toast.makeText(this, " 数据库操作异常", Toast.LENGTH_LONG).show();
            return;
        }

        if(result == 0) {
            Toast.makeText(this, "注册成功", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(this, LoginActivity.class);
            startActivity(intent);
            finish();
            return;
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_user_activity);

        initViews();
    }

    private void initViews() {
        eUsername = (EditText)findViewById(R.id.new_username);
        ePwd1 = (EditText)findViewById(R.id.new_password_1);
        ePwd2 = (EditText)findViewById(R.id.new_password_2);

        btnSubmit = (Button)findViewById(R.id.new_btn_submit);
        btnReset = (Button)findViewById(R.id.new_btn_reset);
        btnSubmit.setOnClickListener(this);
        btnReset.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.new_btn_submit:
            handleCreateAccount();
            break;
        case R.id.new_btn_reset:
            handleReset();
            break;
        }

    }

    private void handleCreateAccount() {
        boolean isUsernameValid = checkUsername();
        if(!isUsernameValid) {
            Toast.makeText(this, "用户名不正确,请重新输入", Toast.LENGTH_LONG).show();
            return;
        }

        int pwdResult = checkPassword();
        if(pwdResult == 1) {
            Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_LONG).show();
            return;
        } 
        if (pwdResult == 2) {
            Toast.makeText(this, "密码不能为空", Toast.LENGTH_LONG).show();
            return;
        }


        createAccount();
    }

    private void createAccount() {
        progress = new ProgressDialog(this);
        progress.setCancelable(false);
        progress.setCanceledOnTouchOutside(false);
//      progress.show(this, null, "注册中...");
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("First app", "Start Network!");
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(CREATE_ACCOUNT_URL);
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("username", eUsername.getText().toString()));
                params.add(new BasicNameValuePair("password", ePwd1.getText().toString()));

                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    if(httpResponse.getStatusLine().getStatusCode() == 200) {
                        Log.d("First app", "Network OK!");
                        HttpEntity entity = httpResponse.getEntity();
                        String entityStr = EntityUtils.toString(entity);
                        String jsonStr = entityStr.substring(entityStr.indexOf("{"));
                        JSONObject json = new JSONObject(jsonStr);
                        sendMessage(MSG_CREATE_RESULT, json);

                    }
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

    }

    private boolean checkUsername() {
        String username = eUsername.getText().toString();
        if(TextUtils.isEmpty(username)) {
            return false;
        }
        return true;
    }

    private int checkPassword() {
        /*
         * return value:
         * 0 password valid
         * 1 password not equal 2 inputs
         * 2 password empty
         * */
        String pwd1 = ePwd1.getText().toString();
        String pwd2 = ePwd2.getText().toString();
        if(!pwd1.equals(pwd2)) {
            return 1;
        } else if(TextUtils.isEmpty(pwd1)) {
            return 2;
        } else {
            return 0;
        }
    }

    private void handleReset() {
        eUsername.setText("");
        ePwd1.setText("");
        ePwd2.setText("");

    }

    private void sendMessage(int what, Object obj) {
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        mHandler.sendMessage(msg);
    }

}

(三)UserInfoActivity

显示用户信息,登录成功加入的界面

public class UserInfoActivity extends Activity {
    private TextView tvUsername;
    private TextView tvPassword;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_info_activity);
        initViews();
        Intent intent = getIntent();
        displayUserInfo(intent);
    }

    private void initViews() {
        tvUsername = (TextView) findViewById(R.id.usr_info_username);
        tvPassword   = (TextView) findViewById(R.id.usr_info_password);

    }

    private void displayUserInfo(Intent intent) {
        String username = intent.getStringExtra("username");
        String password   = intent.getStringExtra("password");


        tvUsername.setText(username);
        tvPassword.setText(password);

    }

}