Vous êtes sur la page 1sur 11

Android : Connection à une base distante.

Telechargement du code : Download


Source
et tester le resultat dans cette application
World Attraction Place
Discover more Android apps

Ce present tutorial se presente en trois partie comme l'architecture 3-tiers presenté dans la figure
suivante:
Pour mener à cet tutorial nous avons fait appel à la

base de donnée mysql, a un serveur web et au client mobile.


Dans mysql j'ai crée une base de donné nommé dblogin dans la quelle se trouve une table nommé
usertable definie par deux champs ( username, userpassword) tous varchar(45).

Principe de l'application
Le client lance la requette au server :
http://10.0.2.2:8080/SidibeServer/LoginUser avec les parametres de connection ( username, et
password).
Le serveur qui capture ces informations et envoie une requete a la base donnée et recupere les
informations qui correspond à la requete( Relation 2 et 3). par la syntaxe suivante :

< String username=request.getParameter("login"); String


password=request.getParameter("password");
User user= new User(username, password);

Au niveau du serveur avant d'envoyer les données au client, ils le met sous format JSON.

Parsing sous format Json:


Notre object User est definie par son username et password, alors nous allons utiliser la librairy
json.jar pour le mettre sous ce format:

public static void userToJson(User user, JSONWriter jsonWriter) throws JSONException

{
jsonWriter.object();
jsonWriter.key("loginStatus").value("yes");
jsonWriter.key("username").value(user.username);
jsonWriter.key("userpassword").value(user.userpassword);
jsonWriter.endObject();

Les données à envoyer au client android sont maintenant sous format json. Le client recupere le flux
sous sous format Json et le parse pour construire notre object User s'il n'est pas null. comme montre
le bout de code suivante :

public static User userConnect(User user) throws Exception


{

URL url = new URL(Accueil.URL_SERVER + "LoginUser?login="


+user.username+"&password="+user.userpassword);
System.out.println(url.toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection.getResponseCode() /100 != 2) {
throw new IOException("Response not OK Version" + connection.getResponseCode());
}

InputStreamReader in= new InputStreamReader(connection.getInputStream());


BufferedReader reader= new BufferedReader(in);
StringBuffer sbf= new StringBuffer();
String line= null;
while((line=reader.readLine())!=null){
sbf.append(line);
}

JSONObject jsonObject = new JSONObject(sbf.toString());

if(jsonObject.getString("loginStatus").equals("yes")) return new User(jsonObject);


return null;

Dans ce bout de code nous avons construit un User à partir de JsonObject definie dans la class User
comme le montre le code constructeur suivant :

public User(JSONObject jsonObject) throws Exception {


// Nous testons d'abord si l'utilisateur existe, s'il existe dans le flux retourner nous le construisons
ceci pour eviter le NullPointerException.
if(jsonObject.get("loginStatus").equals("yes"))
{
this.username=jsonObject.getString("username");
this.userpassword= jsonObject.getString("userpassword");
}
Animation:
Beaucoup de developpeur ont l'habitutde d'afficher une boite de dialog lorsque le mot de passe ou le
login sont incorrect.
Contrairement à eux, pour que l'application puisse herité le comportement de son developpeur, j'ai
trouvé une idée genial que meme quelqu'un qui ne sait pas lire pourra le comprendre.
L'idée c'est opiner le EditText quand le mot de passe ou login sont incorrect. En entrant un mot de
passe incorrect, vous verrez le editText dire non en opinant en faisant l'air d'un homme qui dit non.
Pour cela nous avons crée une animation qui sera appliqué à notre EditText :
Le fichier s'appelle editanim.xml
}

Database :
Voici tout simplement le schemat de notre base de donnée representé dans la figure suivante :

Et dans cette table nous avons inserer quelque donnée de test qui sont :

Avec une simple requete nous recuperons les donnée dans la dblogin simplement.

Server :

Notre server d'applicatio web est Tomcat.


Nous avons crée un model Une classe User avec les attributs (username et userpassword)
Cette classe sert simplement à avoir la forme d'une model.
La classe ModelToJsonFormat : Cette classe est utilisé simplement pour parser les object en
json. Il ne contient qu'une methode statique. J'ai prefere le separer simplement pour l'ethique
du code.

Voici son contenu :


package com.sidibe.blog.android.help.tool;

import org.json.JSONException;
import org.json.JSONWriter;

import com.sidibe.blog.android.help.server.model.User;

/**
* Containt only an static method.
* @author JBromo
*
*/
public class ModelToJsonFormat {

/**
* This method take an object user and parset it with JsonWriter
* @param user : User to parse an json format
* @param jsonWriter : Writer to use for parsins
* @throws JSONException
*/

public static void userToJson(User user, JSONWriter jsonWriter) throws JSONException

{
jsonWriter.object();
jsonWriter.key("loginStatus").value("yes");
jsonWriter.key("username").value(user.username);
jsonWriter.key("userpassword").value(user.userpassword);
jsonWriter.endObject();

}
La classe LoginUser : Cette classe realise toute les transaction et c'est la seule classe util et
necessaire.

package com.sidibe.blog.android.help.server.service;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONException;
import org.json.JSONWriter;

import com.sidibe.blog.android.help.server.model.User;
import com.sidibe.blog.android.help.tool.ModelToJsonFormat;
import com.sidibe.blog.android.help.tool.ShareData;

/**
*
* @author JBromo
*
*/
public class LoginUser extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LoginUser() {
super();
// TODO Auto-generated constructor stub
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws


ServletException, IOException {

String username=request.getParameter("login");
String password=request.getParameter("password");
User user= new User(username, password);

System.out.println(user.toString());

JSONWriter writer = new JSONWriter(response.getWriter());


try {
User usr=this.testUserLogin(user);
//Check is user is null. Because if user is name.
if(usr==null)
{
// If user is null we send and string to let know user is null
writer.object();
writer.key("loginStatus").value("no");
writer.endObject();
}
else
{
// Else user is not null parse it

// Transforme a model user to parson object


ModelToJsonFormat.userToJson(user, writer);
}
} catch (Exception e) {

e.printStackTrace();
}

/**
* Get an Instance SQL connection
* @return Object Connection
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws SQLException
*/
private Connection getConnect() throws InstantiationException, IllegalAccessException,
ClassNotFoundException, SQLException
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
return DriverManager.getConnection("jdbc:mysql://"+ShareData.address+"/"+ShareData.DBLOGIN,
ShareData.DBNAME, ShareData.DBPASSWORD);
}

/**
* Verifie the user parameter if its correct
* @param user : User to checik
* @return the user checket
* @throws Exception
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws SQLException
*/
private User testUserLogin(User user) throws Exception, IllegalAccessException,
ClassNotFoundException, SQLException
{

// The table name is : usertable and it has two columm : username and userpassword
User usr= null;
String requestSQL="select *from usertable where username='"+user.username+"' and
userpassword='"+user.userpassword+"'";
Connection connection= getConnect();
Statement statement =connection.createStatement();
ResultSet resultSet= statement.executeQuery(requestSQL);

while(resultSet.next())
{
// the get User parameter in the database
usr= new User(resultSet.getString("username"), resultSet.getString("userpassword"));
}
return usr;
}

L'application client :
Dans l'application client, en plus des maquillage necessaires,( layout, manifest, anim, et autre),
il y'a simplement un model User dont le constructeur prend un object json et se construit avec
elle.

Voici cette classe :

package com.sidibe.blog.android.model;

import org.json.JSONException;
import org.json.JSONObject;

/**
*
* @author JBromo
*
*/
public class User {

public String username;


public String userpassword;

public User(String username, String userpassword) {


super();
this.username = username;
this.userpassword = userpassword;
}

public User(JSONObject jsonObject) throws Exception {

if(jsonObject.get("loginStatus").equals("yes"))
{
this.username=jsonObject.getString("username");
this.userpassword= jsonObject.getString("userpassword");
}

}
Le client :
L'activity principale faite avec les handler et les thread pour faire la connection est definie dans
la classe Accueil. Cette classe qui s'etend de Activity est en principe l'interface qui permet la
connection.

package com.sidibe.blog.android.home;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.EditText;

import com.sidibe.blog.android.model.User;
public class Accueil extends Activity {

public static final String URL_SERVER="http://10.0.2.2:8080/SidibeServer/";

public static final int SUCCES=1;


public static final int ECHEC=-1;
public static final int CONNECTION_EXCEPTION=0;
public User user;
EditText mail;
EditText password;
public Animation errorAnimation=null;

public ProgressDialog connectionloading;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.interface1);
connectionloading= new ProgressDialog(this);
connectionloading.setCancelable(true);

final UserLoaderHandler userLoaderHandler= new UserLoaderHandler(this);


mail= (EditText)findViewById(R.id.edit_mail);
password=(EditText)findViewById(R.id.edit_password);
Button connect=(Button)findViewById(R.id.bt_connect);
errorAnimation=AnimationUtils.loadAnimation(this, R.anim.editextanim);

connect.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

final User userx= new User(mail.getText().toString(),password.getText().toString());


connectionloading=ProgressDialog.show(v.getContext(), "Waiting Connection", "Connection");
Accueil.testUserConnection(userx, userLoaderHandler);

}
});
}

public static User userConnect(User user) throws Exception


{

URL url = new URL(Accueil.URL_SERVER + "LoginUser?login="


+user.username+"&password="+user.userpassword);
System.out.println(url.toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection.getResponseCode() /100 != 2) {
throw new IOException("Response not OK Version" + connection.getResponseCode());
}

InputStreamReader in= new InputStreamReader(connection.getInputStream());


BufferedReader reader= new BufferedReader(in);
StringBuffer sbf= new StringBuffer();
String line= null;
while((line=reader.readLine())!=null){
sbf.append(line);
}

JSONObject jsonObject = new JSONObject(sbf.toString());

if(jsonObject.getString("loginStatus").equals("yes")) return new User(jsonObject);


return null;

public static void testUserConnection(final User user,final Handler receiver) {


new Thread() {
public void run() {

try{

User users= Accueil.userConnect(user);


Message msg = Message.obtain();
if(users!=null)
{
msg.arg1=Accueil.SUCCES;
msg.obj=users;
}
else
{
msg.arg1=Accueil.ECHEC;

receiver.sendMessage(msg);
}catch (Exception e){
Message msg = Message.obtain();
msg.arg1 = CONNECTION_EXCEPTION;
msg.obj = e;
e.printStackTrace();
receiver.sendMessage(msg);
}
}
}.start();
}

private class UserLoaderHandler extends Handler {

private Context parent;


public UserLoaderHandler(Context parent) {
super();
this.parent = parent;
}
public void handleMessage(Message msg) {

connectionloading.dismiss();

switch (msg.arg1) {
case Accueil.SUCCES :
user = (User) msg.obj;

break;
case Accueil.ECHEC :
mail.startAnimation(errorAnimation);
password.startAnimation(errorAnimation);

break;
case Accueil.CONNECTION_EXCEPTION :
Exception e = (Exception) msg.obj;
e.printStackTrace();
Builder builder = new AlertDialog.Builder(parent);
builder.setTitle("Echec de connection ");
builder.setMessage("Netword connection problem");
builder.show();
break;
}
}
}

Vous aimerez peut-être aussi