PhalconPHP – installation

( Debian 7.5/apache2/php5.4.4 )

Pour plus d’info sur ce framework -> site officiel.

J’imagine que vous avez déjà, au hasard 😉 , un serveur web (apache2)/php5/MySQL, mais, comme indiqué sur le site phalcon.com,

Vérifier  si les paquets suivant sont bien installés:

apt-get install php5-dev php5-mysql gcc libpcre3-dev

Placez vous où vous voulez et récupérez les sources de PhalconPhp:

  • Si vous avez GIT:
git clone --depth=1 git://github.com/phalcon/cphalcon.git
  • Si vous n’avez pas GIT, récupérez les sources ici:

https://github.com/phalcon/cphalcon

Assurez vous que le paquet make est présent:

apt-get install make

Placez vous dans le dossier build/ de phalcon, puis lancez l’installation:

cd cphalcon/build
./install

Si l’installation se termine par:

Thanks for compiling Phalcon!
Build succeed: Please restart your web server to complete the installation

, on peut continuer.

A ce stade, vous devez avoir le fichier phalcon.so dans le répertoire des extensions php:

ls $(php-config --extension-dir)

Prise en compte de l’extension phalcon.so:

  • Solution 1 :

via le répertoire des fichiers ini additionnels:

Pour le trouver:

php5 -i | grep "additional .ini files"

Copier le fichier /unit-tests/ci/phalcon.ini dans le répertoire des extensions php, par exemple:

cp [PhalconFolder]/unit-tests/ci/phalcon.ini /etc/php5/cli/conf.d/phalcon.ini
  • Solution 2 :

via votre fichier php.ini:

Pour le(s) trouver:

php5 -i | grep "Loaded Configuration"

ou

php -i | grep php.ini

Ajouter la ligne suivante:

extension=phalcon.so

 

Puis redémarrez le serveur web:

service apache2 reload

Vérifier si la nouvelle extension est bien prise en compte par PHP:

php5 -i | grep phalcon

Si vous avez une erreur de ce type:

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20100525/phalcon.so’ – /usr/lib/php5/20100525/phalcon.so: undefined symbol: php_pdo_get_dbh_ce in Unknown on line 0

L’extension pdo doit être chargée avant celle de phalcon.

  • Solution 1:

Renommer les fichiers .ini (du répertoires des fichiers ini additionnels ) car ils sont chargés en fonction de leur nom:

ex: 10-pdo.ini, 20-mysqli.ini, 20-mysql.ini, 20-pdo_mysql.ini, 50-phalcon.ini

  • Solution 2:

Réorganiser le chargement des extensions dans votre fichier php.ini.

 Il n’y a plus qu’à vérifier si tout ça fonctionne bien en récupérant l’appli tutorial:

Placez vous dans votre dossier de développement web,

git clone --depth=1 git://github.com/phalcon/tutorial.git

et visez [appiTutorialFolder]/public/index.php

Là, si on a un joli:

Hello!

Sign Up Here!

, c’est que tout va bien…

On est content mais comme on est des supers développeurs, on installe phalcon-devtools:

Cela permettra de générer des squelettes pour les futures appli, d’avoir l’auto-complétion dans votre IDE etc…

git clone git://github.com/phalcon/phalcon-devtools.git
cd phalcon-devtools-master/
. ./phalcon.sh

Done. DevTools installed

Tapez la commande « phalcon »:

phalcon

Si une liste de commandes s’affiche:

Phalcon DevTools (1.3.2)

Available commands:
commands (alias of: list, enumerate)
controller (alias of: create-controller)
model (alias of: create-model)
all-models (alias of: create-all-models)
project (alias of: create-project)
scaffold
migration
webtools

, vous avez tout ce qu’il faut pour commencer à développer vos appli Phalcon !

 

 

 

 

Liste ordonnée

Logique permettant de déplacer un objet d’une liste à n’importe quelle position, tout en gardant la cohérence des positions (pas de place vide dans la liste).

Pour cet exemple, on utilise une liste d’utilisateurs stockés dans une base de données MySQL, mais la logique reste la même quel que soit le container.

Cet article est en fichier .pdf: Liste ordonnée.pdf

Logique très simple à comprendre, alors  bonne lecture !

 

 

JSF 2 Premier projet

 
Mise en place des bases d'un projet JSF 2 sur Eclipse.
 
JSF est un framework de développement d'application web.
 
Pré-requis :
 
 
 
 
Création du projet:
 
 
Eclipse:
 
Créer un nouveau projet Web Dynamique "JSF2-test01"
Sélectionner: Tomcat 7
JavaServer Faces v2.0 Projet
Cochez Generate web.xml
 
Téléchargez la librairie Apache Myfaces JSF
 
 
 
Et importez les librairies JSTL par le bouton « Manage libraries »
 
 
On obtient le projet suivant:
 
 
 
 
Les bases du projet sont en place, passons à la suite : JSF 2 Les formulaires (en construction…)

Struts 2 Les thèmes personnalisés

 
 
Création d'un thème personnalisé.
 
 
Cet article reprend le projet de l'article Struts 2 Les formulaires validate() : struts2-test01.war (1)
 
 
 
 
Modification de la librairie struts2-core-xx.jar:
 
Faites une copie de la librairie struts2-core-xx.jar.
Dézipez la.
 
Les thèmes sont dans le dossier template/ .
Faites une copie du dossier xhtml/ et renommez le monTheme/
 
Le thème xhtml donne, pour un formulaire, le rendu suivant:
[<label>] [<input>]
et
[<message d'erreur>]
[<label>] [<input>]
 
 
Nous allons y apporter quelques modifications pour avoir un rendu de ce type:
[<label>] [<input>]

et
[<label>] [<input>] [<message d'erreur>]
 
 
Remplacez les fichiers suivant du dossier monTheme/ :
 
Re-ziper le tout, et écrasez la librairie du projet par notre nouvelle archive struts2-core-xx.jar.
 
 
 
Utilisons notre nouveau thème:
 
Welcome.jsp:
 
Ajoutez la ligne suivante entre les balises <head></head>:
<s:head theme="monTheme" />

 
Ajoutez l'attribut "theme" dans le formulaire:
<s:form action="Register" method="post" theme="monTheme">

 
 
 
Résultat:
 
 
 
 
 
———————————————-
 
(1)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01
 

Struts 2 Les thèmes


Influence des thèmes sur les balises Struts.

 
 
Si vous avez suivi la série des articles Struts 2 – les formulaires , vous avez pu remarquer que nous ne nous sommes pas occupé de l'apparence visuelle de notre formulaire.
Nous nous sommes contenté de l'apparence que Struts a généré.
Dans le code des pages .jsp, lorsqu'on utilise les balises struts ( <s:xxx ), l'apparence future de cette balise est défini par l'attribut "theme".
Struts dispose de 3 thèmes de bases: simple, xhtml et css_xhtml.
A défaut d'avoir renseigné la balise theme, Struts utilise le thème "xhtml".
 
Exemple avec ce code :
<s:form action="Register" method="post" theme="xhtml">
<s:textfield label="Votre email" name="user.email" size="30"/>
<s:submit value="Inscription" align="center"/>
</s:form>
 
 
Struts génère le code html suivant :
<form id="Register" name="Register" action="/struts2-test01/pages/Register.action;jsessionid=xxxxxxxxxx" method="post">
<table class="wwFormTable">
<tr>
<td class="tdLabel">
<label for="Register_user_email" class="label">Votre email:</label>
</td>
<td>
<input type="text" name="user.email" size="30" value="" id="Register_user_email"/>
</td>
</tr>
<tr>
<td colspan="2">
<div align="center"><input type="submit" id="Register_0" value="Inscription"/></div>
</td>
</tr>
</table>
</form>
 
 
L'intéret des thèmes est donc la simplification du code tout en permettant une personnalisation de la mise en forme.
 
Pour que le style css du thème soit pris en compte, il faut ajouter dans la page .jsp, entre les balises head:
<s:head theme="xhtml" />

 
 
 
Précision:
 
On peut changer le thème par défaut:
  • Dans WebContent/classes/ , créer un fichier vide struts.properties
En s'inspirant du contenu de struts-default.properties inclu dans la librairie struts2-core-2.2.1.1.jar (utilisée pour notre projet) , on peut changer les entrées suivantes:
 
struts.properties:
### Standard UI theme
### Change this to reflect which path should be used for JSP control tag templates by default
struts.ui.theme=xhtml
struts.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl
 
 
On peut aussi définir l'utilisation d'un thème par défaut pour une page donnée, en ajoutant dans cette page .jsp, le code suivant:
<s:set name="theme" value="'simple'" scope="page" />

 
 
On trouve les thèmes Struts dans la librairies struts2-core-xx.jar , dans le dossier template/.
 
Information:
Struts utilise le moteur FreeMarker pour générer le code html des thèmes: http://freemarker.sourceforge.net/
 
 
Dans l'article suivant Struts 2 Les thèmes personnalisés , nous allons créer notre propre thème a fin que le formulaire est une apparence unique ! 😉
 

Struts 2 Les formulaires validate()

 
 
Validation du formulaire en utilisant la méthode validate() de l'action.

 
 
 
Dans l'article précédent nous avons vu la validation en utilisant le fichier -validation.xml.
Une autre méthode consiste à implémenter le méthode validate() de l'action du formulaire.
 
Ces 2 méthodes peuvent être complémentaires.
 
Par exemple nous allons fixer la longueur du mot de passe à 4 caractères minimun.
 
 
Ajouter les entrées suivantes dans les fichiers properties:
 
package_fr.properties :
invalid.mdp=${getText('register.mdp')} est trop court.

 
package_en.properties :
invalid.mdp=${getText('register.mdp')} is too short.

 
 
 
 
Implémenter la méthode validate()
 
RegisterAction.java :
public void validate(){
if (user.getMdp().length()>0 && user.getMdp().length()<4 ) {
addFieldError("user.mdp", getText("invalid.mdp"));
}
}
 
 
 
 
Dans la série des article Struts 2 – les thèmes, nous verrons comment personnaliser l'affichage du formulaire et de ses messages d'erreur.
 
 
———————————————-
 
(1)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01
 

Struts 2 Les formulaires validation.xml

 
Validation des données entrées dans un formulaire en utilisant le fichier -validation.xml.
 
 
Dans ce billet, on reprend le projet de Struts 2 – les formulaires (part 1): struts2-test01.war (1)
 
Après avoir créée notre formulaire, nous allons vérifier les données entrées par l'utilisateur pour s'assurer qu'elles ont bien le format demandé.
 
 
Commençons par implémenter les futurs messages d'erreur dans les fichers properties:
 
package_fr.properties :
ajouter les entrées suivantes:
isrequired=est requis.
required.email=${getText('register.email')} ${getText('isrequired')}
required.nom=${getText('register.nom')} ${getText('isrequired')}
required.mdp=${getText('register.mdp')} ${getText('isrequired')}
required.age=${getText('register.age')} ${getText('isrequired')}
 
invalid.email=${getText('register.email')} n''est pas valide
invalid.age=${getText('register.age')} doit être compris entre ${min} et ${max}.
 
 
package_en.properties :
ajouter les entrées suivantes:
isrequired=is required.
required.email=${getText('register.email')} ${getText('isrequired')}
required.nom=${getText('register.nom')} ${getText('isrequired')}
required.mdp=${getText('register.mdp')} ${getText('isrequired')}
required.age=${getText('register.age')} ${getText('isrequired')}
 
invalid.email=${getText('register.email')} is not valid.
invalid.age=${getText('register.age')} must be between ${min} and ${max}.
 
 
 
Validation:
 
Pour défaut, Struts nous offre une méthode de validation par l'intermédiaire d'un fichier "-validation.xml".
 
Le nom de ce fichier doit avoir la forme suivante:
[nom de la classe action]-validation.xml
ou
[nom de la classe action]-[nom de l'action]-validation.xml
 
Dans notre projet, la classe action associée au formulaire d'enregistrement est RegisterAction.java.
 
Dans le package fr.tuto.beanAction, créer le fichier RegisterAction-validation.xml
 
Edit:
si vous avez l'erreur suivante sur le fichier RegisterAction-Validation.xml :
"Referenced file contains errors (http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd)"
remplacez l'adresse du .dtd par :
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"
 
RegisterAction-validation.xml
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.email">
<field-validator type="requiredstring">
<message key="required.email"/>
</field-validator>
<field-validator type="email">
<message key="invalid.email"/>
</field-validator>
</field>
<field name="user.nom">
<field-validator type="requiredstring">
<message key="required.nom"/>
</field-validator>
</field>
<field name="user.mdp">
<field-validator type="requiredstring">
<message key="required.mdp"/>
</field-validator>
</field>
<field name="user.age">
<field-validator type="required">
<message key="required.age"/>
</field-validator>
<field-validator type="int">
<param name="min">18</param>
<param name="max">99</param>
<message key="invalid.age"/>
</field-validator>
</field>
</validators>
 
 
Ici, chaque champs du formulaire est vérifié.
Les types sont prédéfinis par Struts:
  • "requiredstring", n'autorise pas un champs vide.
  • "email", le champs doit avoir la forme d'un email.
  • "required", champs requis pour les données autre que de type String
  • "int", permet de valider la donnée dans un intervale.
 
 
 
Résultat:
 
 
 
 
Précision sur les messages d'erreur:
 
Dans Welcome.jsp, à la suite du formulaire, ajoutez le code suivant:
Cela permet d'afficher le message d'erreur d'une des valeurs du formulaire.
<s:fielderror >
<s:param>user.email</s:param>
</s:fielderror>
 
Si on ne précise pas de paramètre, cela affiche tous les messages d'erreur:
<s:fielderror />

 
 
 
Dans l'article Struts 2 Les formulaires validate() , nous verrons une autre façon de valider notre formulaire.
 
 
———————————————-
 
(1)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01

Struts 2 Les formulaires

Création d'un formulaire avec Struts 2.
 

Impossible de parler d'application web sans aborder les formulaire.

On reprend notre projet de l'article Struts 2 – internationalisation : struts2-test01.war (1)

 
Nous allons créer un formulaire d'inscription qui demande:
  • un email
  • un nom
  • un mot de passe
  • un age
 
 
Commençons par ajouter le texte affiché dans notre formulaire en utilisant les fichiers properties:
 
package_fr.properties :
On ajoute les entrées suivantes:
register.email=Votre email
register.nom=Votre nom
register.mdp=Votre mot de passe
register.age=Votre age
register.btn=Inscription
Bonjour=Bonjour
 
package_en.properties :
On ajoute les entrées suivantes:
register.email=Your email
register.nom=Your name
register.mdp=Your password
register.age=Your age
register.btn=Registration
Bonjour=Hello
 
 
 
Créer une classe User qui représente l'internaute et qui sera donc destinée à stocker les données entrées dans le formulaire:
 
  • créer un package fr.tuto.bean
  • y créer la classe User.java
 
User.java :
package fr.tuto.bean;
 
public class User{
private static final long serialVersionUID = 1L;
String email;
String nom;
String mdp;
Integer age;
 
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getMdp() {
return mdp;
}
public void setMdp(String mdp) {
this.mdp = mdp;
}
public Integer getAge() {
return age;
}
/*
public void setAge(Integer age) {
this.age = age;
}*/
//Modifiez le setter setAge.
//Cela est nécessaire car le formulaire renvoie uniquement des données de type String
public void setAge(String age){
try{
this.age = Integer.parseInt(age);
}catch(Exception e){
System.out.println(this.getClass().toString() + e);
}
}
 
}
 
 
 
Créer l'action qui sera appelée par le formulaire et qui fait le "relais" entre le formulaire et le classe User.
 
  • créer un package fr.tuto.beanAction
  • y créer la classe RegisterAction.java
 
RegisterAction.java :
package fr.tuto.beanAction;
 
import com.opensymphony.xwork2.ActionSupport;
import fr.tuto.bean.User;
 
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
 
private User user;
 
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String inscription(){
System.out.println(this.getClass() + " inscription()");
return SUCCESS;
}
}
 
 
 
On implémente la nouvelle action qui sera appelée par le formulaire:
 
struts.xml :
(entre les balises <package></package> )
<action name="Register" class="fr.tuto.beanAction.RegisterAction" method="inscription">
<result name="success">success_register.jsp</result>
<result name="input">Welcome.jsp</result>
</action>
success: les données ont été validées
input:il manque des données ou elles ne sont pas toutes correctes
 
 
 
Ajouter le code du formulaire:
 
Welcome.jsp :
<s:form action="Register" method="post">
<s:textfield label="%{getText('register.email')}" name="user.email" size="30"/>
<s:textfield label="%{getText('register.nom')}" name="user.nom" size="30"/>
<s:password label="%{getText('register.mdp')}" name="user.mdp" size="30"/>
<s:textfield label="%{getText('register.age')}" name="user.age" size="2"/>
<s:submit value="%{getText('register.btn')}" align="center"/>
</s:form>
 
 
 
Dans WebContent/pages , créer le fichier success_register.jsp
 
Ce fichier sert à afficher une réponse en cas de succès de l'envoi du formulaire.
<%@ page language="java" contentType="text/html; charset=UTF-8" 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>
<title><s:text name="Welcome.title"></s:text></title>
</head>
<body>
<s:text name="Bonjour" /><s:property value="user.nom" />
</body>
</html>
 
 
A cette étape, le projet est le suivant:

 
Lancer le projet (2).
 
Remplir le formulaire et vérifier si success_register.jsp affiche bien votre nom.
 
 
Dans le prochain billet Struts 2 Les formulaires validation.xml , nous verrons comment valider les données du formulaire.
 
 
———————————————-
 
(1)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01
(2) click droit sur le projet, Run As -> Run on Server

Struts 2 Internationalisation.

Internationalisation ( i18n ) ou site multilangue.
 
Cet article fait suite à Struts 2 – Premier projet
 
Comme Struts est plutôt destiné aux gros projets, nous allons tout de suite prendre en compte la possibilité de faire un site multilangue.

On reprend donc le projet du billet  Struts 2 – Premier projet : struts2-test01.war (1)
 
Pour l'instant, notre projet ne fait qu'afficher un message de bienvenue en français.
Nous allons donner le choix à l'internaute d'afficher le site en français ou en anglais.
 
 
 
Utilisation des fichiers properties:
 
  • Dans WEB-INF/classes/ , créer les 2 fichiers properties package_fr.properties et package_en.properties
  • Faites un refresh du projet
 
package_fr.properties:
Welcome.message=Bienvenue !
Welcome.title= Struts 2 tutoriel
 
package_en.properties:
Welcome.message=Welcome !
Welcome.title= Struts 2 tutorial

 
 
 
Indiquer à Struts qu'on va utiliser ces fichiers pour l'internationalisation:
 
Struts.xml :
Ajouter une balise <constant>:
<constant name="struts.custom.i18n.resources" value="package" />

 
 
 
Remplacer le texte en dur du projet par le texte défini dans les fichiers properties et donner le choix à l'internaute:
 
Apporter la modification suivante:
Welcome.jsp :
<head>
<title><s:text name="Welcome.title"></s:text></title>
</head>
<body>
<table border="1">
<tr>
<td>
<s:url id="url" action="Welcome">
<s:param name="request_locale">fr</s:param>
</s:url>
<s:a href="%{url}">Français</s:a>
</td>
<td>
<s:url id="url" action="Welcome">
<s:param name="request_locale">en</s:param>
</s:url>
<s:a href="%{url}">Anglais</s:a>
</td>
</tr>
</table>
<s:text name="Welcome.message"/>
</body>
 
 
<s:url et <s:param nous sert à paramétrer l'action Welcome en définissant la locale, fr ou en.
Struts construit cette url qu'on récupère grace à %{url} qui fait référence à <s:url id="url"
Dorénavant, l'application prendra en compte cette locale.
 
A cette étape le projet est le suivant:
 
 
Exécutez le projet.
 
On peu maintenant afficher le "Bienvenue !" en français ou en anglais.
 
 
 
———————————————-
 
(1)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01

Struts 2 Premier projet

Mise en place des bases d'un projet Struts 2.

Nous allons découvrir Struts 2 en utilisant le projet de base "clé en main" struts2-blank.war fourni par Struts.

 
Pré-requis:
Eclipse (for Java EE Developers) et le serveur Tomcat 6.
 
 
Projet struts2-blank.war :
Aller sur http://struts.apache.org/download.cgi et télécharger struts-2.2.1.1-apps.zip ou struts-2.x-all.zip.
Déziper et importer struts2-blank.war dans votre IDE Java préféré.
Vérifier si le projet fonctionne (1).
Si vous obtenez une page avec "Struts is up and running …", c'est tout bon !
 
 
Créer notre propre premier projet:
Créer un nouveau projet web dynamique ( ex: struts2-test01 ), en vérifiant que Tomcat y est bien associé.
Une fois notre projet struts2-test01 créé:
  1. Copier les librairies du dossier WebContent/WEB-INF/lib de struts2-blank dans celui de struts2-test01
  2. Ecraser WebContent/WEB-INF/web.xml de struts2-test01 par la version du projet struts2-blank.
  3. dans struts2-test01 :
    • créer le dossier WEB-INF/classes, y créer un fichier vide struts.xml
    • dans WebContent/ , créer un fichier vide index.html
    • créer le dossier WebContent/pages, y créer un fichier vide Welcome.jsp
  4. Faites un refresh du projet(2)
 
On obtient donc le projet suivant:
 
 
 
Ajoutez les codes:
 
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" />
 
<package name="pages" namespace="/pages" extends="struts-default">
<action name="Welcome">
<result>/pages/Welcome.jsp</result>
</action>
</package>
 
</struts>
 
 
index.html :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=pages/Welcome.action">
</head>
 
<body>
<p>Loading …</p>
</body>
</html>
 
 
Welcome.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8" 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>
<title>Insert title here</title>
</head>
<body>
Bienvenue !
</body>
</html>
 
 
 
Vérifier si le projet fonctionne (1).
 
Vous obtenez une page qui affiche "Bienvenue !".
 
Pour l'instant, nous avons simplement définis une action Struts "Welcome" dans struts.xml qui a servi à rediriger la page index.html vers Welcome.jsp
 
Voilà, votre premier projet Struts 2 est prêt à évoluer !
 

 
 
———————————————-
 
(1) click droit sur le projet, Run As -> Run on Server
(2)click droit sur le projet -> Refresh
(3)Ce .war ne contient pas les librairies.
Ajoutez les librairies du projet struts2-blank.war dans WebContent/WEB-INF/lib du projet struts2-test01