Page de démarrage en Thymeleaf, Spring et Class Controller
	
	
		bonjour;
je travailler avec projet maven en utilisant thymeleaf et class controller mais toujour j'avais probléme en lancement de page index.html
et voila la page:
<html>  
<head>  
<title>Acheter En Ligne</title>  
</head> 
 
<body>  
<br/>
<br/>
<br/>
<br/>
<br/>
    <center>  
        
        <h1>  
            <a href="ListeProduits.htm">Acheter Des Produits A Travers Ce Lien</a>  
        </h1>  
    </center>  
</body>  
</html>
------------------------------le fichier web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_ID">
  
  <display-name>Archetype Created Web Application</display-name>
  
<session-config>
        <session-timeout>60</session-timeout>
    </session-config>
<servlet>  
        <servlet-name>mvc-dispatcher</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <load-on-startup>2</load-on-startup>  
    </servlet>  
   <servlet-mapping>
      <servlet-name>mvc-dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
 
    
   
  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener> 
   <welcome-file-list>
   <welcome-file>/WEB-INF/pages/index.html</welcome-file></welcome-file-list>
</web-app>  
----------------------------------------------------lefichier mvc-dispatcher-servlet.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schem...ng-mvc-3.0.xsd
                           http://www.springframework.org/schema/beans
                           http://www.springframework.org/schem...-beans-3.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
   
   
<context:annotation-config/>
<context:component-scan base-package="com.programme.test.util"/>
<context:component-scan base-package="com.programme.test.service"/>
<context:component-scan base-package="com.programme.test.dao"/>
<context:component-scan base-package="com.programme.test.controller"/>
  <mvc:annotation-driven /> 
  
  
<mvc:view-controller path="/login" />
  <!-- **************************************************************** -->
  <!--  THYMELEAF-SPECIFIC ARTIFACTS                                    -->
  <!--  TemplateResolver <- TemplateEngine <- ViewResolver              -->
  <!-- **************************************************************** -->
 <bean id="templateResolver"
        class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <!-- Template cache is true by default. Set to false if you want -->
    <!-- templates to be automatically updated when modified.        -->
    <property name="cacheable" value="true" />
  </bean>
    
  <bean id="templateEngine"
        class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
  </bean>
   
  <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
  </bean>  
</beans>
---------------------------------------------------la classe de control 
package com.programme.test.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.programme.test.domain.Client;
import com.programme.test.domain.Commande;
import com.programme.test.domain.CommandeLigne;
import com.programme.test.domain.Ensemble;
import com.programme.test.domain.Produit;
import com.programme.test.service.ClientManager;
import com.programme.test.service.CommandeLigneManager;
import com.programme.test.service.CommandeManager;
import com.programme.test.service.ProduitManager;
@Controller
public class  {
	@Autowired
	ProduitManager manager;
	
	@Autowired
	ClientManager managerClient;
	
	@Autowired
	CommandeManager managerCommande;
	
	@Autowired
	CommandeLigneManager managerCommandeLigne;
  
	private List<Produit> listeProduits1;
	private List<Produit> panier;
	
	 @ModelAttribute("totalP")
	 public double getTotal() {
		 int tot = 0;
		   if (panier==null) 
 		{
      tot=0;
 		}
   else
  {
	   for (int i = 0; i < panier.size (); i++)
	   {
		   tot=(int) (tot+((panier.get(i).getQuantite())*(panier.get(i).getPrix())));
	   }
  }
		  
		 return  tot;
	 }
	
	 @ModelAttribute("clientA")
	 public Client getClientA() {
	 
		 return  new Client();
	 }
	
	 @ModelAttribute("nombreP")
	 public int getNombrePanier() {
	 
		 if (panier==null)
		 {
			 return 0;
		 }
		 else
		 {
			return panier.size(); 
		 }
		 
	 }
	 
	 @ModelAttribute("produitC")
	 public Ensemble getProduitObject() {
	 
		 return  new Ensemble();
	 }
	 @ModelAttribute("quantiteM")
	 public Produit getQuantiteModifier() {
	 
		 return  new Produit();
	 }
	   @ModelAttribute("ProduitsL")
	   public List<Produit> populateTypes() {
		   listeProduits1=manager.listeDeProduits();
	       return listeProduits1;
	   }
	   @ModelAttribute("ProduitsAC")
	   public List<Produit> populateTypes1() {
		   
	       return panier;
	   }
	   @RequestMapping({"/ListeProduits"})
	   public String showSeedstarters() {
	       
	       return "ListeProduits";
	   }
	
	   @RequestMapping({"/ListeProduitsAcheter"})
	   public String showSeedstarters1() {
		
	       return "ListeProduitsAcheter";
	   }
	   
	   @RequestMapping(value="/AjouterPanierAuCommande", params={"AjouterCommande"})
	   public String saveCommande(
	           final Client client1, final BindingResult bindingResult, final ModelMap model) {
		   String message="";
		   if((panier.size ()>0) && (panier!=null))
		   {
		   final Client c1= managerClient.clientChercher(client1.getIdClient(), client1.getPassword()); 
	   
		   if (c1!=null)
			   
	     {
			  
			   int idCommande=managerCommande.rechercheMaxIdCommande();
			   int tot=0;
			   for (int i = 0; i < panier.size (); i++)
			   {
				   tot=(int) (tot+((panier.get(i).getQuantite())*(panier.get(i).getPrix())));
			   }
			   
			   Commande commande=new Commande();
			   commande.setIdCommande(idCommande+1);
			   commande.setDescription(null);
			   commande.setPrixTotal(tot);
			   commande.setIdClient(client1.getIdClient());
			   managerCommande.createNewCommande(commande);
			   
			   for (int i = 0; i < panier.size (); i++)
			   {
				   CommandeLigne commandeLigne=new CommandeLigne();
				   commandeLigne.setIdClient(client1.getIdClient());
				   commandeLigne.setIdCommande(idCommande+1);
				   commandeLigne.setIdProduit(panier.get(i).getIdProduit());
				   commandeLigne.setQte(panier.get(i).getQuantite());
				   commandeLigne.setPrixUnitaire(panier.get(i).getPrix());
				   commandeLigne.setPrixTotal((panier.get(i).getQuantite())*(panier.get(i).getPrix()));
				   managerCommandeLigne.creatNewCommandeLigne(commandeLigne);
			   }
			   
			   message="CommandeAjouter";
			   panier=new ArrayList<Produit>();
			
	     }
	     else
	     {
	    	 message="Verifier IdClient et Password";
	    	
	     }
		   }
		   else
		   {
			   message="Panier vide";  
		   }
		  // model.clear();
	       return "redirect:/ListeProduitsAcheter?q1="+message;
	   }
	   
	   @RequestMapping(value="/AjouterProduitAuPanier" ,params={"AjoutePP"})
	   public String ajouterProduitEnPanier(final Ensemble produit1,final BindingResult bindingResult, 
		        final HttpServletRequest req) {
		   final Integer rowId = Integer.valueOf(req.getParameter("AjoutePP"));
		  String message="";
		   if((produit1.getListeP().get(rowId.intValue()).getQuantite())>0)
		   {
			   
		  message=" ";
		    Produit p=new Produit();
            p.setIdProduit(listeProduits1.get(rowId.intValue()).getIdProduit());
            p.setDesciption(listeProduits1.get(rowId.intValue()).getDesciption());
            p.setPrix(listeProduits1.get(rowId.intValue()).getPrix());
            p.setQuantite(produit1.getListeP().get(rowId.intValue()).getQuantite());
		   
            if (panier==null) 
		    		{
		    panier=new ArrayList<Produit>();
		    panier.add(p);
		    		}
		    else
		    {
		    	int id1=-1;
		    	
		    	 for (int i = 0; i < panier.size (); i++)
		  	   {
		    		 if((panier.get(i).getIdProduit())==(listeProduits1.get(rowId.intValue()).getIdProduit()))
		    			 {
                         id1=i;
		    			 }
		    		
		  	   }
		    	 
		    	 if(id1>=0)
		    	 {
		    		int qt= (panier.get(id1).getQuantite())+(produit1.getListeP().get(rowId.intValue()).getQuantite());
		    		
		    		panier.get(id1).setQuantite(qt);
		    	 }
		    	 else
		    	 {
		    		 panier.add(p); 
		    	 }
		     
		    }
		   }
		   else
		   {
			   message="La Quantite doit etre superieur de 0";
		   }
		    //produit1.getRows().remove(rowId.intValue());
		    return "redirect:/ListeProduits?q="+message;
	   }
	   @RequestMapping(value="/SupprimerProduitDePanier" ,params={"SupprimerPA"})
	   public String supprimerProduitDePanier(final Ensemble produit1,final BindingResult bindingResult, 
		        final HttpServletRequest req) {
		   final Integer rowId = Integer.valueOf(req.getParameter("SupprimerPA"));
		   if(panier!=null)
		   {
			   panier.remove(rowId.intValue());
		   }
		   
		    
		    return "redirect:/ListeProduitsAcheter";
	   }
	   
	   
	   @RequestMapping(value="/ModifierProduitDePanier" ,params={"ModifierPA"})
	   public String modifierProduitDePanier(final Produit produit1,final BindingResult bindingResult, 
		        final HttpServletRequest req) {
		   final Integer rowId = Integer.valueOf(req.getParameter("ModifierPA"));
		String message="";
		   if((produit1.getQuantite())>0)
		  {
			   message=" ";
		   if(panier!=null)
		   {
			   panier.get(rowId.intValue()).setQuantite(produit1.getQuantite());
		   }
		  }
		  else
		  {
			  message="La Quantite doit etre superieur de 0";
		  }
		    
		    return "redirect:/ListeProduitsAcheter?q="+message;
	   }
	   
	   @RequestMapping(value="/AjouterProduitAuPanier1", params={"AjoutePP"})
	   public String removeRow1(
		        final Produit produit1, final BindingResult bindingResult, 
		        final HttpServletRequest req) {
		    final Integer rowId = Integer.valueOf(req.getParameter("AjoutePP"));
		    System.out.println(rowId.intValue());
		    System.out.println(produit1.getDesciption());
		    //produit1.getRows().remove(rowId.intValue());
		  
		    return "ListeProduits";
	   }
	   
	 
/**	   @RequestMapping(value="/tr", params={"save"})
	   public String saveSeedstarter(
	           final Greeting seedStarter, final BindingResult bindingResult, final ModelMap model) {
	       if (bindingResult.hasErrors()) {
	           return "seedstartermng";
	       }
	       //this.seedStarterService.add(seedStarter);
	       model.clear();
	       return "redirect:/seedstartermng";
	   }
	   @RequestMapping(value="/greeting", method=RequestMethod.GET)
	    public String greetingForm(Model model) {
	        model.addAttribute("greeting", new Greeting());
	        return "my";
	    }
	   @RequestMapping(value="/greeting", method=RequestMethod.POST)
	    public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
	        model.addAttribute("greeting", greeting);
	        return "my";
	    }
	
	  
	    @RequestMapping({"/my"})  
	    public ModelAndView showMessage(final Produit produitC) {  
	    	 produitC.setIdProduit(0);
	    	System.out.println("ez1");
	    	System.out.println("from controller");  
	        return new ModelAndView("my", "messages", manager.listeDeProduits());  
	    } */
	
	    
	    
}
-----------------------------------------le classe ProduitController relier par 2 page 
fichier ListeProduits.html
------------------------
<html >
<head>
    <title>Acheter En Ligne</title>
</head>
<body>
<h3 align="left">
<a href="index.html">Retour</a>
</h3>
<form action="#"  th:action="@{/AjouterProduitAuPanier}" th:object="${produitC}" method="post">
<table align="center" border="2" >
   <CAPTION><u><b><font size="15">liste Des Produits</font></b></u></CAPTION>          
             <thead>
			<tr>
			    <th>N</th>
				<th>ID</th>
				<th>Description</th>
				<th>Prix</th>
				<th>Qauntite</th>
				<th>Choisir</th>
				
			</tr>
		</thead>
                
      <tbody >  
    
      <tr th:each="prd,rowPrd : ${ProduitsL}" >  
       
        <td align="center" th:text="${rowPrd.count}"></td>
        
        <td align="center" th:text="${prd.idProduit}" th:value="${prd.idProduit}"  ></td> 
       
        <td align="center" th:text="${prd.Desciption}" ></td>
        <td align="center" th:text="${prd.prix}+' DT'" style="width:100px;"><h1>DT</h1>  </td>
        <td align="center"><input   type="text"   th:field="*{listeP[__${rowPrd.index}__].quantite}" style="width:50px;text-align:center"  /></td>
        <td>
           <button type="submit" name="AjoutePP" th:value="${rowPrd.index}" style="font-weight:bold;" >Ajouter Au Panier</button>
        </td>
     
   
    </tr> 
    </tbody>
</table>
    <center>  
    <h3  ><p th:text="${param.q[0]}" th:unless="${param.q == null}" style="color:red;">Test</p></h3>
        <h2>Liste Des Produits Acheter</h2>  
        <h4>  
            <a href="ListeProduitsAcheter.htm" th:if="${nombreP} > 0"> <h3 th:text="'Panier '+${nombreP}" ></h3> </a> 
         </h4>
    </center> 
</form>
</body>
</html>
-------------------------------
fichier ListeProduitsAcheter.html
-------------------
<html >
<head>
    <title>Home</title>
    
</head>
<body>
<h3 align="left">
<a href="ListeProduits.htm">Retour</a>
</h3>
<table align="center" border="2" >
   <CAPTION><u><b><font size="13">liste Des Produits Acheter</font></b></u></CAPTION>          
             <thead>
			<tr>
			    <th>N</th>
				<th>ID</th>
				<th>Description</th>
				<th>Qauntite</th>
				<th>Prix Unitaire</th>
				<th>Prix Total</th>
				<th>Supprimer</th>
				<th>Modifier</th>
				
			</tr>
		</thead>
                
      <tbody >  
    
      <tr th:each="prd,rowPrd : ${ProduitsAC}" >  
       
        <td align="center" th:text="${rowPrd.count}"></td>
        
        <td align="center" th:text="${prd.idProduit}" th:value="${prd.idProduit}"  ></td> 
       
        <td align="center" th:text="${prd.Desciption}" ></td>
        <td align="center" th:text="${prd.quantite}"      ></td>
        <td align="center" th:text="${prd.prix} +' DT'" style="width:100px;"><h1>DT</h1>  </td>
        <td align="center" th:text="${prd.quantite} * ${prd.prix} + ' DT'"      ></td>
        <td>
        <form action="#"  th:action="@{/SupprimerProduitDePanier}"  method="post">
           <button type="submit" name="SupprimerPA" th:value="${rowPrd.index}"  >Supprimer</button>
        </form>
        </td>
        <td>
        <form action="#"  th:action="@{/ModifierProduitDePanier}" th:object="${quantiteM}"  method="post">
          <input   type="text" th:field="*{quantite}"  style="width:50px;text-align:center"  />
           <button type="submit" name="ModifierPA" th:value="${rowPrd.index}"   >Modifier Qauntitér</button>
        
        </form>
        </td>
     
    </tr> 
<tr>
<td align="right" colspan="5" >TOTAL : 
</td>
<td align="center"  th:text="${totalP} +' DT' ">
</td>
</tr>
    </tbody>
</table>
<center>
<p th:text="${param.q[0]}" th:unless="${param.q == null}" style="color:red;font-weight:bold; font-size:15;">Test</p>
</center>
<br/>
<br/>
<br/>
<form action="#"  th:action="@{/AjouterPanierAuCommande}" th:object="${clientA}" method="post">
<table align="center" border="2" >
<CAPTION><u><b><font size="5">Information Client</font></b></u></CAPTION> 
 <thead>
			</thead>
				    <tbody>
				<tr>
				<td>ID Client</td>
				<td align="center"><input style="width:100px;text-align:center"  type="text"   th:field="*{idClient}"   /></td>
                </tr>
                <tr>
                <td>Password</td>
                <td align="center"><input style="width:100px;text-align:center"  type="password"   th:field="*{password}"   /></td>
				</tr>
				<tr>
				<td align="center" colspan="2"	>	
				 <button type="submit" name="AjouterCommande"  style="font-weight:bold; font-size:15;" >Ajouter Commande</button>
				</td>
				</tr>
				</tbody>
</table>
<center>
<p th:text="${param.q1[0]}" th:unless="${param.q1 == null}" style="color:red;font-weight:bold; font-size:15;">Test</p>
</center>
</form>
</body>
</html>
-------------------------------------------------------------
il ya t'il quelqu'un à une idée pour demerre la page index.html
sans modifir <url-pattern> en web.xml parceque l'instruction  (<url-pattern>/</url-pattern>) neçessaire pour demarrée les methode  @RequestMapping
et merci.
Ridha.