Application web Java/J2ee avec Struts2, Spring3, Hibernate3

Ce tutoriel exige des connaissances dans le langage de programmation Java, et des connaissance en Mysql.

Dans ce tutoriel, je vais vous montrer comment réalisez une petite application web, en java/j2ee, avec les framworks, Struts2, Hibernate3 et Spring3 avec les annotations, avec une base de données Mysql.
Nous allons dans ce tutoriel travailler avec deux classes, une classe membre, et une classe publication, dans cet exemple je définit une clés étrangère dans la classe Publication, qui correspond à l’identifiant (membreId) de la classe membre, d’où j’assure un lien entre les deux classes. Lorsque je cherche l’ensemble des publications d’un membre, je les sélectionne grâce a la clef étrangère dans « Publication ».

Script de la Base de donnée et les tables

			-- phpMyAdmin SQL Dump
			-- version 4.0.4
			-- http://www.phpmyadmin.net
			--
			-- Client: localhost
			-- Généré le: Lun 05 Mai 2014 à 16:34
			-- Version du serveur: 5.6.12-log
			-- Version de PHP: 5.4.16

			SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
			SET time_zone = "+00:00";


			/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
			/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
			/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
			/*!40101 SET NAMES utf8 */;

			--
			-- Base de données: `w_db`
			--
			CREATE DATABASE IF NOT EXISTS `w_db` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
			USE `w_db`;

			--
			-- Structure de la table `membre`
			--

			CREATE TABLE IF NOT EXISTS `membre` (
			  `MEMBRE_ID` int(20) NOT NULL AUTO_INCREMENT,
			  `EMAIL` varchar(30) NOT NULL,
			  `MOTDEPASSE` varchar(30) NOT NULL,
			  `NOM` varchar(30) NOT NULL,
			  PRIMARY KEY (`MEMBRE_ID`)
			) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ;


			--
			-- Structure de la table `publication`
			--

			CREATE TABLE IF NOT EXISTS `publication` (
			  `PUB_ID` int(20) NOT NULL AUTO_INCREMENT,
			  `MEMBRE_ID` int(20) NOT NULL,
			  `STATUT` text NOT NULL,
			  PRIMARY KEY (`PUB_ID`),
			  KEY `MEMBRE_ID` (`MEMBRE_ID`),
			) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

			--
			-- Contraintes pour la table `publication`
			--
			ALTER TABLE `publication`
			  ADD CONSTRAINT `publication_ibfk_1` FOREIGN KEY (`MEMBRE_ID`) REFERENCES `membre` (`MEMBRE_ID`);

			/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
			/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
			/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
		
Commençons la programmation :

Attaquons la programmation

En première étape, nous allons définir les classes modèles, qui correspondent à nos tables dans la base de données (Membre et Publication), voici le code
La classe membre.java
Placer ce code dans une classe java, que vous créer avec le nom «membre », dans un package com.r2b.model (le code vous pouvez le télécharger à la fin de cette page).

Attention ! Vous devez donner les même nom que moi a vos package, si vous modifiez penser à modifier le fichier de configuration et toute les nom des packages

Je vous conseil de garder les même nom, une fois vous avez tout compris, vous pouvez faire des modification

désolé pour le retard le code est comme suit :
	package com.r2b.model;
	
	import java.util.HashSet;
	import java.util.Set;

	import javax.persistence.Column;
	import javax.persistence.Entity;
	import javax.persistence.FetchType;
	import javax.persistence.GeneratedValue;
	import javax.persistence.JoinColumn;
	import javax.persistence.JoinTable;
	import javax.persistence.ManyToMany;
	import javax.persistence.CascadeType;

	import static javax.persistence.GenerationType.IDENTITY;

	import javax.persistence.Id;
	import javax.persistence.Table;


	/**
	 * 
	 * @author BOUGHANI rafik
	 *
	 */
	@Entity
	@Table(name = "membre", catalog = "w_db")
	public class Membre implements java.io.Serializable {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private Integer membreId;
		private String email;
		private String motdepasse;
		private String nom;
		
		public Membre(String email, String motdepasse, String nom) {
			this.email = email;
			this.motdepasse = motdepasse;
			this.nom = nom;
		}

		@Id
		@GeneratedValue(strategy = IDENTITY)
		@Column(name = "MEMBRE_ID", unique = true, nullable = false)
		public Integer getMembreId() {
			return this.membreId;
		}

		public void setMembreId(Integer membreId) {
			this.membreId = membreId;
		}

		@Column(name = "EMAIL", nullable = false, length = 30)
		public String getEmail() {
			return this.email;
		}

		public void setEmail(String email) {
			this.email = email;
		}

		@Column(name = "MOTDEPASSE", nullable = false, length = 30)
		public String getMotdepasse() {
			return this.motdepasse;
		}

		public void setMotdepasse(String motdepasse) {
			this.motdepasse = motdepasse;
		}

		@Column(name = "NOM", nullable = false, length = 30)
		public String getNom() {
			return this.nom;
		}

		public void setNom(String nom) {
			this.nom = nom;
		}
	}
	
Brève explication :
@Entity : c’est annotation de javax.persistence.Entity, donc pensez bien à importer cette classe si vous écrivez votre code à la main, elle Indique que la classe est une entité.

Attention ! n’importez pas la classe org.hibernate.annotations.Entity, il faut importer celle de javax.persistence.Entity

@Table : Indique la table primaire de l'entité annotée. (Traduction de la documentation officielle d’oracle sur les annotations), elle indique le nom de la table dans la base de donnée et le nom de la base de donnée en question.
@Id : Indique la clé primaire de l'entité. Ainsi la clef primaire de la table.
Même remarque pour l’annotation de Table, veuillez importer import javax.persistence.Id; et non pas celle de Hibernate.
@GeneratedValue : Fournit pour la spécification des stratégies de génération pour les valeurs de clés primaires. Autrement éxpliqué cette annotation dit au système que ce qui va suivre est une clé primaire qui ne doit pas être dupliqué (souvent elle design auto-incrémente).
Même remarque pour l’annotation de Table, veuillez importer import javax.persistence.Id; et non pas celle de Hibernate.
@Column : Est utilisé pour spécifier une colonne mappée pour une propriété persistante ou d'un champ. Si aucune annotation de colonne n’est spécifiée, les valeurs par défaut sont appliquées.
Voila pour les annotations de cette classe, passons à la classe «Publication.java »
	package com.r2b.model;

	import javax.persistence.Column;
	import javax.persistence.Entity;
	import javax.persistence.FetchType;
	import javax.persistence.GeneratedValue;
	import static javax.persistence.GenerationType.IDENTITY;
	import javax.persistence.Id;
	import javax.persistence.JoinColumn;
	import javax.persistence.ManyToOne;
	import javax.persistence.OneToMany;
	import javax.persistence.Table;
	/**
	* 
	* @author BOUGHANI Rafik
	*
	*/
	@Entity
	@Table(name = "publication", catalog = "w_db")
	public class Publication implements java.io.Serializable {

	private static final long serialVersionUID = -1705454805336743599L;
	private Integer pubId;
	private Membre membre;
	private String statut;

	public Publication() {
	}

	public Publication (String statu) {
		this.statut = statu;
	}

	public Publication(Membre membre, String statut) {
		this.membre = membre;
		this.statut = statut;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "PUB_ID", unique = true, nullable = false)
	public Integer getPubId() {
		return this.pubId;
	}

	public void setPubId(Integer pubId) {
		this.pubId = pubId;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "MEMBRE_ID", nullable = true)
	public Membre getMembre() {
		return this.membre;
	}

	public void setMembre(Membre membre) {
		this.membre = membre;
	}

	@Column(name = "STATUT", nullable = false, length = 65535)
	public String getStatut() {
		return this.statut;
	}

	public void setStatut(String statut) {
		this.statut = statut;
	}
	}
	
Ici on remarque deux nouvelles annotations qui sont @ManyToOne et @JoinColumn, jetons un coup d’œil à la documentation officielle ici si vous êtes curieux.
@ManyToOne : Définit une association unique d'une valeur à une autre classe d'entité qui a une carinalité un ou plusieur / zéro ou plusieur.
@JoinColumn : Indique une colonne pour adhérer à une association de l'entité ou de la collection de l'élément. Mon explication, elle indique la colonne concernée comme référence pour les clés étrangères, une fois on insert dans la table Publication, pour la valeur du champ Membre, on lui insert la clef primaire de membre qui est MEMBRE_ID.

Maintenant créons un nouveau package avec le nom com.r2b.dao
Dans ce package nous allons déclarer deux classes et deux interfaces DAO pour interagir avec la base de donnée


l'interface MembreDAO.java
	package com.r2b.dao;

	import java.util.List;
	import com.r2b.model.Membre;
	/**
	* 
	* @author BOUGHANI Rafik
	*
	*/
	public interface MembreDAO {
		
		void saveUser(Membre user);  
		List getUserList();
		public Membre CurrentMembre(String name);
	}
	

la classe MembreDAOImpl.java
	package com.r2b.dao;

	import java.util.List;

	import org.hibernate.SessionFactory;
	import org.springframework.beans.factory.annotation.Autowired;
	import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
	import org.springframework.stereotype.Repository;

	import com.r2b.model.Membre;
	
	@Repository("membreDao")
	public class MembreDAOImp implements MembreDAO {

		 @Autowired
		 private SessionFactory sessionFactory;
		   
		 @Override
		 public void saveUser(Membre user) {
		  sessionFactory.getCurrentSession().saveOrUpdate(user);  
		 }  
		  
		@SuppressWarnings("unchecked")
		@Override
		public List getUserList() {  
			 return (List) sessionFactory.getCurrentSession().createCriteria(Membre.class).list();
		}
		 
		@Override
		public Membre CurrentMembre(String name) {		
			List ListeAbonne = (List) sessionFactory.getCurrentSession().createQuery("Select membreId from Membre where nom ='" + name+"'").list();
			Membre mbr = new Membre();
			
			return (Membre) sessionFactory.getCurrentSession().get(Membre.class,ListeAbonne.get(0));
		}
	}
	

l'interface PublicationDAO.java
	package com.r2b.dao;

	import java.util.List;
	import com.r2b.model.Publication;

	public interface PublicationDAO {
		
		void newPublication(Publication pub);  
		List getAllPublication();
		
	}
	

la classe PublicationDAOImpl.java
			package com.r2b.dao;

			import java.util.List;

			import org.hibernate.SessionFactory;
			import org.springframework.beans.factory.annotation.Autowired;
			import org.springframework.stereotype.Repository;

			import com.r2b.model.Membre;
			import com.r2b.model.Publication;

			@Repository("publicationDao")
			public class PublicationDAOImpl implements PublicationDAO {
				
				@Autowired
				private SessionFactory sessionFactory;

				@Override
				public void newPublication(Publication post) {
					
					sessionFactory.getCurrentSession().saveOrUpdate(post);
				}

				@SuppressWarnings("unchecked")
				@Override
				public List getAllPublication() {
					
					return ((List) sessionFactory.getCurrentSession().createCriteria(Publication.class).list());
				}
			}
		
Créer un nouveau package com.r2b.service
Dans ce package nous allons définir nos service, voici donc le code :

l'interface MembreService.java
			package com.r2b.service;

			import java.util.List;
			import com.r2b.model.Membre;

			public interface MembreService {
				
				void saveUser(Membre user);  
				List getUserList();
				public Membre CurrentMembre(String name);
			}
		

la classe MembreServiceImpl.java
		package com.r2b.service;

		import java.util.List;

		import org.springframework.beans.factory.annotation.Autowired;
		import org.springframework.stereotype.Service;
		import org.springframework.transaction.annotation.Propagation;
		import org.springframework.transaction.annotation.Transactional;

		import com.r2b.dao.MembreDAO;
		import com.r2b.model.Membre;

		@Service("membreService")
		@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
		public class MembreServiceImpl implements MembreService {

			 @Autowired  
			 private MembreDAO membreDao;
			 
			 @Override  
			 @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
			public void saveUser(Membre user) {
				
				 membreDao.saveUser(user);
				 
			}

			@Override
			public List getUserList() {
				
				return membreDao.getUserList();
			}

			@Override
			public Membre CurrentMembre(String name) {
				
				return membreDao.CurrentMembre(name);
			}
		}
		

l'interface PublicationService.java
		package com.r2b.service;

		import java.util.List;

		import com.r2b.model.Publication;

		public interface PublicationService {
			
			void newPublication(Publication pub);  
			List getAllPublication();
		}
		

la classe PublicationServiceImpl.java
		package com.r2b.service;

		import java.util.List;

		import org.springframework.beans.factory.annotation.Autowired;
		import org.springframework.stereotype.Service;
		import org.springframework.transaction.annotation.Propagation;
		import org.springframework.transaction.annotation.Transactional;

		import com.r2b.dao.PublicationDAO;
		import com.r2b.model.Membre;
		import com.r2b.model.Publication;

		@Service("publicationService")
		@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
		public class PublicationServiceImpl implements PublicationService {
			
			@Autowired
			private PublicationDAO publicationDao;
			

			@Override
			@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
			public void newPublication(Publication pub) {
				
				publicationDao.newPublication(pub);
			}

			@Override
			public List getAllPublication() {
				
				return publicationDao.getAllPublication();
			}
			
		}
		
créer un nouveau package com.r2b.bean, et placez les classe suivantes dedans
la classe MembreBean.java
		package com.r2b.bean;

		public class MembreBean {

			private Integer membreId;
			private String email;
			private String motdepasse;
			private String nom;
			
			public Integer getMembreId() {
				return membreId;
			}
			public void setMembreId(Integer membreId) {
				this.membreId = membreId;
			}
			public String getEmail() {
				return email;
			}
			public void setEmail(String email) {
				this.email = email;
			}
			
			public String getMotdepasse() {
				return motdepasse;
			}
			public void setMotdepasse(String motdepasse) {
				this.motdepasse = motdepasse;
			}
			
			public String getNom() {
				return nom;
			}
			public void setNom(String nom) {
				this.nom = nom;
			}
		}
		

la classe PublicationBean.java
		package com.r2b.bean;

		import com.r2b.model.Membre;

		public class PublicationBean {
			
			private Membre membre;
			private String statut;
			
			public Membre getMembre() {
				return membre;
			}
			public void setMembre(Membre membr) {
				this.membre = membr;
			}
			public String getStatut() {
				return statut;
			}
			public void setStatut(String statut) {
				this.statut = statut;
			}

		}
		
Créer un nouveau package com.r2b.action, pour gérer les actions de struts, et mettez dedans ces deux classe
la classe MembreAction.java
		package com.r2b.action;

		import java.util.List;
		import org.springframework.beans.factory.annotation.Autowired;
		import com.opensymphony.xwork2.ActionSupport;
		import com.opensymphony.xwork2.ModelDriven;
		import com.r2b.bean.MembreBean;
		import com.r2b.service.MembreService;
		import com.r2b.utiles.CommonUtility;

		/**
		 * 
		 * @author BOUGHANI Rafik
		 *
		 */
		public class MembreAction extends ActionSupport implements ModelDriven{

			private static final long serialVersionUID = 1L;
			
			@Autowired
			private MembreBean membreBean;
			@Autowired
			private MembreService membreService;
			private List membres;
			
			public String execute() {
				membreService.saveUser(CommonUtility.createModel(membreBean));
				membres = CommonUtility.createMembreBeanList(membreService.getUserList());
				return "membre";
			}
			
			public String addMembre() {
				membreService.saveUser(CommonUtility.createModel(membreBean));
				membres = CommonUtility.createMembreBeanList(membreService.getUserList());
				return "addMembre";
			}
			
			public String listMembre() {
				membres = CommonUtility.createMembreBeanList(membreService.getUserList());
				return "membres";
			}
			
			@Override
			public MembreBean getModel() {
				return membreBean;
			}
			
			public String membre() {
				return "membre";
			}

			public List getMembres() {
				return membres;
			}

			public void setMembres(List membres) {
				this.membres = membres;
			}
			
		}
		

la classe PublicationAction.java
	package com.r2b.action;

	import java.util.List;

	import org.springframework.beans.factory.annotation.Autowired;

	import com.opensymphony.xwork2.ActionSupport;
	import com.opensymphony.xwork2.ModelDriven;
	import com.r2b.bean.MembreBean;
	import com.r2b.bean.PublicationBean;
	import com.r2b.service.MembreService;
	import com.r2b.service.PublicationService;
	import com.r2b.utiles.CommonUtility;

	/**
	 * 
	 * @author Rafik BOUGHANI
	 *
	 */
	public class PublicationAction extends ActionSupport implements ModelDriven{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		@Autowired
		private PublicationBean publicationBean;
		@Autowired
		private MembreBean membreBean;
		@Autowired
		private MembreService membreService;
		@Autowired
		private PublicationService publicationService;
		private List publications;
			
		public String execute() {
			System.out.println();
			publicationService.newPublication(CommonUtility.createModelP(publicationBean, membreBean, membreService));
			publications = CommonUtility.createPublicationBeanList(publicationService.getAllPublication());
			return "pub";
		}
		
		public String listPub() {
			publications = CommonUtility.createPublicationBeanList(publicationService.getAllPublication());
			return "publ";
		}
		
		@Override
		public PublicationBean getModel(){
			
			return publicationBean;		
		}
		
		public String publication() {
			return "publication";
		}

		public List getPublications() {
			return publications;
		}

		public void setPublications(List publications) {
			this.publications = publications;
		}
	}
	
Maintenant créer un nouveau package avec le nom de com.r2b.utiles et mettez la classe suivante dedans :
la classe PublicationAction.java
	package com.r2b.utiles;

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

	import org.springframework.beans.factory.annotation.Autowired;

	import com.r2b.bean.MembreBean;
	import com.r2b.bean.PublicationBean;
	import com.r2b.model.Membre;
	import com.r2b.model.Publication;
	import com.r2b.service.MembreService;

	/**
	 * 
	 * @author Rafik BOUGHANI
	 *
	 */
	public class CommonUtility {
		
		public static Membre createModel(MembreBean membreBean) {
			Membre membre = new Membre();
			membre.setEmail(membreBean.getEmail());
			membre.setMotdepasse(membreBean.getMotdepasse());
			membre.setNom(membreBean.getNom());
			return membre;
		}
		
		public static List createMembreBeanList(List membres) {
			List beans = new ArrayList();
			MembreBean membreBean = null;
			for (Membre membre : membres) {
				membreBean = new MembreBean();
				membreBean.setEmail(membre.getEmail());
				membreBean.setMotdepasse(membre.getMotdepasse());
				membreBean.setNom(membre.getNom());
				beans.add(membreBean);
			}
			return beans;
		}
		
		public static Publication createModelP(PublicationBean publicationBean, MembreBean membrebean, MembreService mbr) {
			Publication publication = new Publication();
			mbr.CurrentMembre(membrebean.getNom());
			publication.setMembre(mbr.CurrentMembre(membrebean.getNom()));
			publication.setStatut(publicationBean.getStatut());
			return publication;
		}
		
		public static List createPublicationBeanList(List publications) {
			List beans = new ArrayList();
			PublicationBean publicationBean = null;
			for (Publication publication : publications) {
				publicationBean = new PublicationBean();
				publicationBean.setMembre(publication.getMembre());
				publicationBean.setStatut(publication.getStatut());
				beans.add(publicationBean);
			}
			return beans;
		}
		
		public static String convertArrayToCsv(String[] arr) {
			String csv = "";
			for (String value : arr) {
				csv += value + ",";
			}
			return csv;
		}

		public static String[] convertCsvToArr(String csv) {
			String[] values = csv.split(",");
			return values;
		}
	}
	
Voila pour les classes, maintenant attaquons les fichier de configuration XML
web.xml
	<?xml version="1.0" encoding="UTF-8"?>  
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
	  <display-name>Struts2Hibernate3Spring3Tile2Integration</display-name>
		
		<welcome-file-list>
			<welcome-file>inscription.jsp</welcome-file>
		</welcome-file-list>
		
		<listener>  
			<listener-class>  
				org.springframework.web.context.ContextLoaderListener  
			</listener-class>  
		</listener>
		  
		<filter>  
			<filter-name>struts2</filter-name>  
			<filter-class>
				org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
			</filter-class>  
		</filter>  
		<filter-mapping>  
			<filter-name>struts2</filter-name>  
			<url-pattern>/*</url-pattern>  
		</filter-mapping>
	</web-app>
	

applicationContext.xml
C’est le fichier de configuration de Spring, c’est ici qu’on assure l’intégration avec Strut et Hibernate
	<?xml version="1.0" encoding="UTF-8"?>  
	<beans xmlns="http://www.springframework.org/schema/beans"  
		   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
		   xmlns:context="http://www.springframework.org/schema/context"  
		   xmlns:tx="http://www.springframework.org/schema/tx"  
		   xsi:schemaLocation="  
							http://www.springframework.org/schema/beans  
							http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
							http://www.springframework.org/schema/context  
							http://www.springframework.org/schema/context/spring-context-3.0.xsd  
							http://www.springframework.org/schema/tx  
							http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
	   
	   
		<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">  
			<property name="driverClassName" value="${hibernate.driver}"></property>  
			<property name="url" value="${hibernate.url}"></property>  
			<property name="username" value="${hibernate.user}"></property>  
			<property name="password" value="${hibernate.password}"></property>
		</bean>
	 
		<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
			<property name="dataSource" ref="dataSource">  
			<property name="annotatedClasses">  
				<list>
					<value>com.r2b.model.Membre</value>
					<value>com.r2b.model.Commetaire</value>
					<value>com.r2b.model.Message</value>
					<value>com.r2b.model.Publication</value>
					<value>com.r2b.model.Invitation</value>  
				</list>
			</property>  
			<property name="hibernateProperties">
				<props> 	
					<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
					<prop key="hibernate.show_sql">true</prop>
					<prop key="hibernate.hbm2ddl.auto">update</prop>
				</props> 
			</property> 
		</bean>
	   
		<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="hibernateTransactionManager">  
			<property name="sessionFactory" ref="sessionFactory"></property>  
		</bean>
	  
		<context:component-scan base-package="com.r2b" />  
	   
		<context:property-placeholder location="classpath:hibernate.properties"/>  
		<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
		
		<bean id="membre" class="com.r2b.action.MembreAction" />
		<bean id="membreBean" class="com.r2b.bean.MembreBean" />
		<bean id="publication" class="com.r2b.action.PublicationAction" />
		<bean id="publicationBean" class="com.r2b.bean.PublicationBean" />

	</beans>
	

struts.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC  
		"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
		"http://struts.apache.org/dtds/struts-2.0.dtd">  
	   
	<struts>  
		<constant name="struts.enable.DynamicMethodInvocation" value="false" />  
		<constant name="struts.devMode" value="true" />  
		<constant name="struts.custom.i18n.resources" value="myapp" />  
	   
	 <<package name="membre" extends="struts-default" namespace="/">  
			  
			<action name="inscription" class="com.r2b.action.MembreAction" method="execute">  
				  <result name="membre">accueil.jsp</result>
			</action>
			
			<action name="newpub" class="com.r2b.action.PublicationAction" method="execute">  
				  <result name="pub">accueil.jsp</result>
			</action>
			
			<action name="listpub" class="com.r2b.action.PublicationAction" method="listPub">  
				  <result name="publ">accueil.jsp
			</action>
		  
		</package>  
	 </struts>
	

hibernate.cfg.xml
	<?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 name="hibernate">
			<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="hibernate.connection.url">jdbc:mysql://localhost/w_db</property>
			<property name="hibernate.connection.username">root</property>
			<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
		</session-factory>
	</hibernate-configuration>
	

hibernate.properties
	hibernate.driver=com.mysql.jdbc.Driver
	hibernate.url=jdbc:mysql://localhost/w_db
	hibernate.user=root
	hibernate.password=
	
Maintenant le code des pages jsp
inscription.jsp
	<%@ page pageEncoding="UTF-8" %>
	<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
	<%@ taglib prefix="s" uri="/struts-tags"%>
	<!DOCTYPE html>
	<html>
		<head>
			<meta charset="utf-8" />
			<title>Inscription</title>
			<link rel="stylesheet" href="style.css" />
		</head>
		<body>
			<div class="rowh">
				<span class="span6 offset2">
					<ul>
						<li><a href="http://www.craazybook.com">Craazybook</a></li>
						<li><a href="invitation.php"></a></li>
						<li></li>
						<li></li>
						<li></li>
					</ul>
					
					
				</span>
				<span class="span2 offset1"> 
					<span id="as_global_default_icon"><i class="icon-globe"></i></span>
					<input type="hidden" alt="Rechercher" placeholder="Rechercher" maxlength="100" size="20" id="global_search_field" autocomplete="off" name="query" class="text suggested as_global_search" data-type="mini">
					<input type="hidden" id="as_global_type" value="all">
				</span>
				<span class="span5 offset1 posit" style="margin-left: 30%">
					
					<ul>
						<li><a href="../membre/settings">Réglage</a></li>
						<li><a href="../membre/aide.php">Aide</a></li>
						<li><a href="../membre/deconnexion.php">Connexion</a> </li>
					</ul>
				</span>					
		</div>
		<div class="_formRegister corp">
			<form method="post" action="inscription">
				<fieldset>
					<legend>Inscription</legend>
					<p>Vous pouvez vous inscrire via ce formulaire.</p>
					<table>
						<tr>
							<td><label for="email">Adresse email <span class="requis">*</span></label></td>
							<td><input type="email" id="email" name="email" value="" size="20" maxlength="60" /></td>
						</tr>
						<tr>
							<td><label for="motdepasse">Mot de passe <span class="requis">*</span></label></td>
							<td><input type="password" id="motdepasse" name="motdepasse" value="" size="20" maxlength="20" /></td>
						</tr>
						<tr>		
							<td><label for="confirmation">Confirmation du mot de passe <span class="requis">*</span></label></td>
							<td><input type="password" id="confirmation" name="confirmation" value="" size="20" maxlength="20" /></td>
						</tr>
						<tr>
							<td><label for="nom">Nom d'utilisateur</label></td>
							<td><input type="text" id="nom" name="nom" value="" size="20" maxlength="20" /></td>
						</tr>
						<tr>
							<td></td>
							<td><input type="submit" value="Inscription" class="sansLabel" />
						</tr>
					</table>
				</fieldset>
			</form>
		 </div>
		</body>
	</html>
	

accueil.jsp
	<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
	<%@ taglib prefix="s" uri="/struts-tags"%>
	<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
	<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<link rel="stylesheet" href="style.css" />
		<title>Liste des publication</title>
	</head>
	<body class="accueil">
		<div class="rowh">
				<span class="span6 offset2">
					<ul>
						
					</ul>			
				</span>
				<span class="span2 offset1"> 
					<span id="as_global_default_icon"><i class="icon-globe"></i></span>
					<input type="text" alt="Rechercher" maxlength="100" size="20" id="global_search_field" name="query" class="text suggested as_global_search">
					<input type="hidden" id="as_global_type" value="all">
				</span>
				<span class="span5 offset1 posit">
					<ul>
						<li><a href="../membre/settings">Réglage</a></li>
						<li><a href="../membre/aide.php">Aide</a></li>
						<li><a href="../membre/deconnexion.php">Déconnexion</a></li>
					</ul>
				</span>					
		</div>
		<div class="menuGch">
			
		</div>
		<div class="menudrt">
			<div class="menhouiyelandayi">
				<p><b>Créer une annonce</b></p>
				<a href="publicite.php">j'annonce</a>
			</div>	
		</div>
			<div class="corp">
				<div class="art_post">
					<FORM method="POST" action="newpub">
						<input id="statut" class="acc_post_input" type="text" name="statut" />
						<INPUT type="submit" value="Submit">
					</form>
				</div>
				<s:if test="%{publications.isEmpty()}">
					</s:if>
					<s:else>
						<b>List of publications</b>
						<table border="1">
							<tr>
								<td><b>membre</b></td>
								<td><b>statut</b></td>
							</tr>
							<s:iterator value="publications">
								<tr>
									<td></td>
									<td></td>
								</tr>
							</s:iterator>
						</table>
					</s:else> 
				</div>
			<div id="atar" class="_ezin">

			</div>		
	</body>
	</html>
	

style.css
	body{
	  margin: 0 auto;
	  margin-top: 0px;
	  font-size: 14px;
	  font-family: Arial, 'Arial Unicode MS', Helvetica, Sans-Serif;
	  font-weight: normal;
	  font-style: normal;
	  position: relative;
	  width: 100%;
	  left: 0;
	  top: 0;
	  cursor: default;
	  overflow: hidden;
	}
	#corpus{
		width:100%;
		left:0;
	}
	.accueil{background: white;top:0;}
	.rowh{background: linear-gradient(to bottom, #5C8BBA 0%, #3869A0 100%) repeat scroll 0 0 transparent;border-bottom: 1px solid #34639A;position: fixed;
		z-index : 3;top: 0;width: 100%;height: 40px;}
	.span2 {
		width: 220px;
	}
	.span5 {
		width: 360px;
	}
	.span6 {
		width: 460px;
	}
	.span5 li{
		display: inline;
		float: left;
		margin-right: 15px;
		margin-top: 0px;
	}
	.span6 li{
		display: inline;
		float: left;
		margin-right: 15px;
		margin-top: 0px;
	}
	.span6 li a {
		color: #D7E6EF;
		display: inline;
		float: left;
		font-weight: normal;
	}
	.offset1 {
		margin-left: 40px;
	}
	#as_global_default_icon {
		color: #999999;
		font-size: 20px;
		left: 29px;
		position: relative;
		top: 2px;
	}
	#global_search_field {
		border: 1px solid #DDDDDD;
		font-size: 1.2em;
		height: 16px;
		outline: medium none;
		padding: 2px;
		width: 100px;
	}
	.offset2 {
		margin-left: 100px;
	}
	.posit{
		float: right;
	}
	.posit li a {
		color: #D7E6EF;
		display: inline;
		float: left;
		font-weight: normal;
	}
	.menuGch{	
		float:left;
		background: #FFFFFF;
		height:633px;
		width:15%;
		position: relative;
		overflow: hidden;
	}
	[class*="span"] {
		float: left;
		margin-left: 60px;
	}
	.menhouiyelandayi{
		float:left;
		
	}
	.menhouiyelandayi{
		
		margin-top:20px;
		z-index: auto !important;
	}
	.menudrt{
		float: right;
		width: 18.5%;
		height: 100%;
		background: white;
	}
	.corp{
	margin-left:205px;
	margin-right:251px;
	margin-top: 40px;
	height: 100%;
	background: white;
	}
	.art_post{
		margin-top:50px;
	}
	a.status:hover {
		text-decoration: none;
	}
	._ezin{
	height:30px;
	position: fixed;
	bottom: 0px;
	z-index: 5;
	left: 0;
	right: 0;
	background: #13699D;
	border-top: 2px solid #124D70;
	display: block;
	}
	._da{
		color:white;
	}
	.acc_post_input{
		width: 95%;
		height: 50px;
	}
	#brctrl_g{
		margin-top: 50px;
		float: left;
		width:24%;
		height:300px;
	}
	#compose_button {
	  border-collapse: separate;
	  -webkit-background-origin: border !important;
	  -moz-background-origin: border !important;
	  background-origin: border-box !important;
	  -svg-background: linear-gradient(top, rgba(26, 103, 145, 0.16) 0, rgba(45, 157, 217, 0.22) 30%, rgba(71, 169, 222, 0.27) 40%, rgba(84, 175, 225, 0.29) 50%, rgba(71, 169, 222, 0.27) 60%, rgba(45, 157, 217, 0.22) 70%, rgba(26, 103, 145, 0.16) 100%) no-repeat, url('../images/button.png'), linear-gradient(top, #1D75A5 0, #279AD8 30%, #38A2DC 40%, #40A6DD 50%, #38A2DC 60%, #279AD8 70%, #1D75A5 100%) no-repeat;
	  -webkit-border-radius: 6px;
	  -moz-border-radius: 6px;
	  border-radius: 6px;
	  padding: 0 7px;
	  margin: 0 auto;
	  height: 30px;
	  width: 80%; 
	  margin-left:10%;
	}
	.listo_g{
		font-size: 12px;
		margin: 0 0 15px !important;
		padding-left: 20px;
	}
	.listo_g ul {
		list-style-type: none;
	}
	.listo_g li a{
		text-decoration:none;
		display: block;
		padding: 8px;
		border: 0 none;
	}
	.listo_g li.active a {
		-moz-border-bottom-colors: none;
		-moz-border-left-colors: none;
		-moz-border-right-colors: none;
		-moz-border-top-colors: none;
		background-color: #FFFFFF;
		border-color: #D9D9D9 -moz-use-text-color #D9D9D9 #D9D9D9;
		border-image: none;
		border-style: solid none solid solid;
		border-width: 1px 0 1px 1px;
		color: #333333;
		cursor: default;
		font-weight: bold;
		margin: -2px 0 0;
	}
	.navigation{
		color: #3A579A;
		display: block;
		font-weight: 400;
		height: auto;
		padding: 4px 10px 5px;
		white-space: nowrap;
	}
	.navigation{
		background: none repeat scroll 0 0 #6D84B4;
		border-bottom: 1px solid #3B5998;
		border-top: 1px solid #3B5998;
		color: #FFFFFF;
		padding: 3px 10px 4px;
		text-decoration: none;
	}
	.entin{
		margin-top:80px;
		margin-left:30%;
		height: 500px;
		overflow:auto;
	}
	._photoPfl{
		height: 50px;
		width: 20%;
		border: 1px solid bold;
	}
	._formRegister{
		margin-top: 100px;	
	}
	
Voila tout pour le code, il nous reste juste à importer l'ensemble de jar de projet, voici donc une capture d'écran de l'ensemble de jars à importer