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
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 :
Au niveau du serveur avant d'envoyer les données au client, ils le met sous format JSON.
{
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 :
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 :
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 :
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
*/
{
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
}
String username=request.getParameter("login");
String password=request.getParameter("password");
User user= new User(username, password);
System.out.println(user.toString());
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.
package com.sidibe.blog.android.model;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* @author JBromo
*
*/
public class User {
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 {
connect.setOnClickListener(new View.OnClickListener() {
}
});
}
try{
receiver.sendMessage(msg);
}catch (Exception e){
Message msg = Message.obtain();
msg.arg1 = CONNECTION_EXCEPTION;
msg.obj = e;
e.printStackTrace();
receiver.sendMessage(msg);
}
}
}.start();
}
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;
}
}
}