您的位置:首页 > 移动开发 > Android开发

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

2015-10-29 10:22 615 查看
实现了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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".LoginActivity">

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/loginregister"
android:textColor="#D10B0B"
android:textSize="30dp" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/username" />

<EditText
android:id="@+id/etusername"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text" />
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/password" />

<EditText
android:id="@+id/etpassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text" />
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/login" />

<Button
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/register" />
</LinearLayout>

</LinearLayout>


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<User> list = new ArrayList<User>();
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<String>() {
@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类的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- dtd指定格式 -->
<!DOCTYPE hibernate-mapping PUBLIC
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>

<hibernate-mapping  package="com.zsp.domain">

<class name="User" table="user">
<id name="userid" column="userid" type="java.lang.Integer">   <!-- id元素用于指定主键属性 -->
<generator class="increment"></generator>   <!-- 该元素用于指定主键值生成策略hilo native increment sequence uuid -->
</id>

<!-- 其他属性配置 -->
<property name="username" type="java.lang.String">
<column name="username" not-null="false"/>
</property>

<property name="userpwd" type="java.lang.String">
<column name="userpwd" not-null="false"/>
</property>

</class>

</hibernate-mapping>


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);
}


2.2.2 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<User> 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数据库的操作工具

<pre name="code" class="java">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<Session> threadLocal = new ThreadLocal<Session>();

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;
}

}



2.4 servlet包
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. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}

/**
* The doGet method of the servlet. <br>
*
* 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. <br>
*
* 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. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}

}


2.5 Hibernate的配置hibernate.cfg.xml

这里必需引入c3p0连接池,不然在服务器上添加一条数据,客户端是无法访问,必需重启服务器才能访问得到

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.url">jdbc:mysql:///lesson</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">20</property>  <!--在连接池中所有数据库连接的最大数目-->
<property name="hibernate.c3p0.min_size">5</property>  <!--在连接池中可用数据库连接的最小数目-->
<property name="automaticTestTable">Test</property>
<property name="hibernate.c3p0.max_statements">100</property>  <!--可以被缓存的PreparedStatement的最大数目-->
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="c3p0.testConnectionOnCheckout">true</property>
<property name="c3p0.idleConnectionTestPeriod">18000</property>
<property name="c3p0.maxIdleTime">25000</property>

<mapping resource="com/zsp/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>


三、结果



源码地址点击打开链接,大家可以自己下载查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: