Struts 2 - Les balises Iterator

Créer des classes d'action

Tout d'abord, créons une classe simple appelée Employee.java qui ressemble à -

package com.tutorialspoint.struts2;

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

import org.apache.struts2.util.SubsetIteratorFilter.Decider;

public class Employee {
   private String name;
   private String department;

   public Employee(){}
   public Employee(String name,String department) {
      this.name = name;
      this.department = department;
   }
   
   private List employees;
   private List contractors;
	
   public String execute() {
      employees = new ArrayList();
      employees.add(new Employee("George","Recruitment"));
      employees.add(new Employee("Danielle","Accounts"));
      employees.add(new Employee("Melissa","Recruitment"));
      employees.add(new Employee("Rose","Accounts"));

      contractors = new ArrayList();
      contractors.add(new Employee("Mindy","Database"));
      contractors.add(new Employee("Vanessa","Network"));
      return "success";
   }

   public Decider getRecruitmentDecider() {
      return new Decider() {
         public boolean decide(Object element) throws Exception {
            Employee employee = (Employee)element;
            return employee.getDepartment().equals("Recruitment");
         }
      };
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public String getDepartment() {
      return department;
   }
   
   public void setDepartment(String department) {
      this.department = department;
   }
   
   public List getEmployees() {
      return employees;
   }
   
   public void setEmployees(List employees) {
      this.employees = employees;
   }
   
   public List getContractors() {
      return contractors;
   }
   
   public void setContractors(List contractors) {
      this.contractors = contractors;
   }
}

La classe Employee a deux attributs - name et department, nous avons également deux listes de employees - la permanentles employés et les entrepreneurs. Nous avons une méthode appeléegetRecruitmentDecider qui renvoie un Decider objet.

L'implémentation Decider retourne true si l'employé travaille pour le recruitment département, et il retourne false autrement.

Ensuite, créons un DepartmentComparator pour comparer les objets Employé -

package com.tutorialspoint.struts2;

import java.util.Comparator;

public class DepartmentComparator implements Comparator {
   public int compare(Employee e1, Employee e2) {
      return e1.getDepartment().compareTo(e2.getDepartment());
   }

   @Override
   public int compare(Object arg0, Object arg1) {
      return 0;
   }
}

Comme le montre l'exemple ci-dessus, le comparateur de service compare les employés en fonction du service par ordre alphabétique.

Créer des vues

Créez un fichier appelé employee.jsp avec le contenu suivant -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Employees</title>
   </head>
   
   <body>
      <b>Example of Iterator Tag</b><br/>
      
      <s:iterator value = "employees">
         <s:property value = "name"/> , 
         <s:property value = "department"/><br/>
      </s:iterator>
   
      <br/><br/>
   
      <b>Employees sorted by Department</b>
      <br/>

      <s:bean name = "com.tutorialspoint.struts2.DepartmentComparator" 
         var = "deptComparator" />

      <s:sort comparator = "deptComparator" source = "employees">
         
         <s:iterator>
            <s:property value = "name"/> , 
            <s:property value = "department"/><br/>
         </s:iterator>
      </s:sort>
   
      <br/><br/>
   
      <b>SubSet Tag - Employees working in Recruitment department </b><br/>
      <s:subset decider="recruitmentDecider" source = "employees">
         
         <s:iterator>
            <s:property value = "name"/> , 
            <s:property value = "department"/><br/>
         </s:iterator>
      
      </s:subset>
   
      <br/><br/>
   
      <b>SubSet Tag - Employees 2 and 3 </b><br/>
   
      <s:subset start="1" count = "2" source = "employees">
         
         <s:iterator>
            <s:property value = "name"/> , 
            <s:property value = "department"/><br/>
         </s:iterator>
      
      </s:subset>
   </body>
</html>

Passons en revue les balises utilisées une par une -

Étiquette d'itérateur

Nous utilisons le iteratortag pour parcourir la liste des employés. Nous fournissons la propriété "Employees" comme source de la balise iterator. Dans le corps de la balise iterator, nous avons maintenant accès à l'objet Employé dans la liste des employés. Nous imprimons le nom de l'employé suivi de son département.

Trier la balise

Tout d'abord, nous avons déclaré le DepartmentComparatorcomme un haricot. Nous avons donné un nom à ce haricotdeptComparator. Ensuite, nous avons utilisé la balise de tri et spécifié la liste «employés» comme source et «deptComparator» comme comparateur à utiliser. Ensuite, comme dans l'exemple précédent, nous itérons la liste et imprimons les employés. Comme vous pouvez le voir sur la sortie, cela imprime la liste des employés triés par service.

Balise de sous-ensemble

le subsetLa balise est utilisée pour obtenir un sous-ensemble de la liste ou du tableau. Nous avons deux types de balises de sous-ensemble. Dans le premier exemple, nous utilisons lerecrutimentDecider pour obtenir la liste des employés qui travaillent pour le service de recrutement (veuillez consulter la méthode getRecruitmentDecider () dans Employee.java).

Dans le deuxième exemple, nous n'utilisons aucun décideur, mais nous recherchons plutôt les éléments 2 et 3 de la liste. La balise de sous-ensemble prend en deux paramètres "count" et "start". "start" détermine le point de départ du sous-ensemble et le "count" détermine la longueur du sous-ensemble.

Fichiers de configuration

Votre struts.xml devrait ressembler à -

<?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.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "employee" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "success">/employee.jsp</result>
      </action>
   </package>

</struts>

Votre web.xml devrait ressembler à -

<?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>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat. Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URLhttp://localhost:8080/HelloWorldStruts2/employee.action. Cela produira l'écran suivant -