Android 客户端与服务器交互,登录案例

3,074 阅读3分钟
原文链接: lib.csdn.net
实现了Android客户端与服务器的交互,客户端采用Android Studio开发,Web服务器采用MyEclipse开发,数据库使用MySQL,采用Hibernate框架开发

1、Android客户端采用开发工具为Android Studio,用到的jar包com.alibaba:fastjson:1.2.7

.jar、com.squareup.okhttp:okhttp:2.5.0.jar、com.squareup.okio:okio:1.6.0.jar,客户端采用OkHttp与服务器进行交互,详见

2、Web服务器采用MyEclipse,用到的jar包,主要是Hibernate的jar

一 Android客户端 1.1 布局文件activity_main.xml


    

    


        


        
    

    

        

        
    

    

        

        
    


1.2 主界面 LoginActivity.java 在LoginActivity.java中,实现与服务器间的交互主要采用OKHttp架包,这个架包封装了各种与服务器的交互,详见点击打开链接
package com.zsp.applogin.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.squareup.okhttp.Request;
import com.zsp.applogin.Json.WriteJson;
import com.zsp.applogin.R;
import com.zsp.applogin.Util.OkHttpClientManager;
import com.zsp.applogin.domain.User;

import java.util.ArrayList;
import java.util.List;


public class LoginActivity extends AppCompatActivity {


    Button login;
    Button register;
    EditText etusername;
    EditText etpassword;
    String username;
    String password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        init();
        register.setOnClickListener(new RegisterOnclick());
        login.setOnClickListener(new LoginOnclick());
    }

    private void init() {
        etusername = (EditText) findViewById(R.id.etusername);
        etpassword = (EditText) findViewById(R.id.etpassword);
        login = (Button) findViewById(R.id.login);
        register = (Button) findViewById(R.id.register);
    }

    private class RegisterOnclick implements View.OnClickListener {
        public void onClick(View v) {
        }
    }

    private class LoginOnclick implements View.OnClickListener {
        public void onClick(View arg0) {
            username = etusername.getText().toString().trim();
            if (username == null || username.length() <= 0) {
                etusername.requestFocus();
                etusername.setError("对不起,用户名不能为空");
                return;
            } else {
                username = etusername.getText().toString().trim();
            }
            password = etpassword.getText().toString().trim();
            if (password == null || password.length() <= 0) {
                etpassword.requestFocus();
                etpassword.setError("对不起,密码不能为空");
                return;
            } else {
                password = etpassword.getText().toString().trim();
            }

            User user = new User(username, password);
            //构造一个user对象
            List list = new ArrayList();
            list.add(user);
            WriteJson writeJson = new WriteJson();
            //将user对象写出json形式字符串
            String jsonString = writeJson.getJsonData(list);
            String url = "http://192.168.1.186:8080/LoginTest/servlet/Login";

            OkHttpClientManager.postAsyn(url, new OkHttpClientManager.ResultCallback() {
                @Override
                public void onError(Request request, Exception e) {
                    e.printStackTrace();
                }


                @Override
                public void onResponse(String u) {
                    Toast.makeText(LoginActivity.this, u, Toast.LENGTH_SHORT).show();
                }
            }, new OkHttpClientManager.Param("username", username), new OkHttpClientManager.Param("password", password));
        }
    }
}
二、Web服务器 服务器中采用Hibernate架构,

2.1 Domain包

2.1.1 User.hbm.xml Pojo类的配置文件



        
        
    
           
           
                           
         
        
        
        
        
         
        
        
        
                     
         
      
       
2.1.2 User.java  Pojo类 (Pojo类必需进行序列化(Serializable))
package com.zsp.domain;
import java.io.Serializable;

public class User implements Serializable {
/**
* @Fields serialVersionUID : TODO
*/
private static final long serialVersionUID = 1L;
private int userid;
private String username;
private String userpwd;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
} 
}
2.2 Service包

主要分成两层,分别是接口类和继承接口的类

2.2.1UserServiceInter.java接口类
package com.zsp.service.inter;

import com.zsp.domain.User;

public interface UserServiceInter {

public User checkUser(User user); 
}
UserServiceImp.java继承接口的类
package com.zsp.service.imp;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.hibernate.Query;
import com.zsp.domain.User;
import com.zsp.service.inter.UserServiceInter;
import com.zsp.util.HibernateUtil;

public class UserServiceImp implements UserServiceInter {

public User checkUser(User user) {
List list = null;
String hql = "from User where username = ? and userpwd = ?";
String[] parameters = {user.getUsername(),user.getUserpwd()};
list = HibernateUtil.hqlQuery(hql, parameters);
if(list.size()==0){
return null;
}else{
return list.get(0);
} 
}
}
2.3 Util包主要是Hibernate对MySQL数据库的操作工具
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	private static SessionFactory sessionFactory = null;
	//使用线程局部模式
	private static ThreadLocal threadLocal = new ThreadLocal();
	
	private HibernateUtil(){};
	
	static {
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
	
	//获取全新的session
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	
	//获取和线程关联的session
	public static Session getCurrentSession(){
		Session session= threadLocal.get();
		//判断是否得到
		if(session==null){
			session = sessionFactory.openSession();
			//把session对象设置到threadLocal,
			threadLocal.set(session);
		}
		return session;
	}
	
	
	public static void closeCurrentSession(){
		
		Session s=getCurrentSession();
		
		if(s!=null&& s.isOpen() ){
			s.close();
			threadLocal.set(null);
		}
	}
	
	//提供一个统一的查询方法 hql 形式 from 类  where 条件=? ..
	public static List hqlQuery(String hql,String [] parameters){
		
		Session session= null;
		List list = null;
		
		try {
			session = openSession();
			Query query = session.createQuery(hql);
			//判断是否有参数要绑定
			if(parameters !=null && parameters.length>0){
				for (int i = 0; i < parameters.length; i++) {
					query.setString(i, parameters[i]);
				}
			}
			list = query.list();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		} finally{
			if(session != null && session.isOpen()){
				session.close();
			}
		}				
		return list;					
	}
	

}
Login.java主要是响应从Android客户端发送过来的指令,并回应  
package com.zsp.servlet;

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 com.zsp.domain.User;
import com.zsp.service.imp.UserServiceImp;
import com.zsp.service.inter.UserServiceInter;

public class Login extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public Login() {
		super();
	}

	/**
	 * Destruction of the servlet. 
*/ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out=response.getWriter(); String username=request.getParameter("username"); String password=request.getParameter("password"); User user = new User(); user.setUsername(username); user.setUserpwd(password); UserServiceInter userServiceInter = new UserServiceImp(); user = userServiceInter.checkUser(user); System.out.println(username+" "+password); if(user != null){ out.write("success"); }else{ out.write("failure"); } out.flush(); out.close(); } /** * Initialization of the servlet.
* * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }
2.5 Hibernate的配置hibernate.cfg.xml     这里必需引入c3p0连接池,不然在服务器上添加一条数据,客户端是无法访问,必需重启服务器才能访问得到


        



com.mysql.jdbc.Driver

root
123456
jdbc:mysql:///lesson

org.hibernate.dialect.MySQLDialect

update
true

    org.hibernate.connection.C3P0ConnectionProvider
    20  
    5  
    Test
    100  
    120
    1
    true
    18000
    25000

     


三、结果