Thẻ iterator trong Struts 2
Thẻ iterator này sẽ lặp qua một giá trị. Một giá trị có thể lặp có thể là java.util.Collection, java.util.Iterator. Trong khi lặp qua một iterator, bạn có thể sử dụng thẻ sort để sắp xếp kết quả hoặc thẻ subset để lấy một tập con của danh sách list hoặc mảng array.
Chương này chúng ta cùng tìm hiểu về thẻ iterator và trình làm việc của nó trong Struts 2 thông qua ví dụ minh họa dưới đây.
Tạo các lớp Action
Đầu tiên chúng ta tạo một lớp Employee.java như sau:
package com.vietjack.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("Hoang","NhanSu")); employees.add(new Employee("Ngan","KeToan")); employees.add(new Employee("Nga","NhanSu")); employees.add(new Employee("Nam","KeToan")); contractors = new ArrayList(); contractors.add(new Employee("Thuong","BanHang")); contractors.add(new Employee("Viet","Marketing")); return "success"; } public Decider getNhanSuDecider() { return new Decider() { public boolean decide(Object element) throws Exception { Employee employee = (Employee)element; return employee.getDepartment().equals("NhanSu"); } }; } 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; } }
Lớp Employee có hai thuộc tính là name và department, chúng ta cũng có hai list là employees và contractors. Chúng ta có hai phương thức là getNhanSuDecider mà trả về một đối tượng Decider. Trình triển khai Decider trả về true nếu employee làm việc cho phòng recruitment, nếu không thì nó trả về false.
Tiếp theo, chúng ta tạo một DepartmentComparator để so sánh các đối tượng Employee.
package com.vietjack.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; } }
Như trong ví dụ trên, comparator này so sánh các employee dựa trên department theo thứ tự chữ cái.
Tạo các thành phần View
Tạo employee.jsp với các nội dung sau:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Employees</title> </head> <body> <b>Vi du cua the iterator</b><br/> <s:iterator value="employees"> <s:property value="name"/> , <s:property value="department"/><br/> </s:iterator> <br/><br/> <b>Nhan vien duoc sap xep theo Phong ban</b><br/> <s:bean name="com.vietjack.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>The subset - Nhan vien dang lam viec trong phong Nhan Su </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>The subset - Nhan vien 2 va 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>
Giải thích chi tiết các thẻ trên:
Thẻ Iterator
Chúng ta sử dụng thẻ iterator để lặp qua danh sách các employee. Chúng ta cung cấp thuộc tính employee như là source của thẻ iterator này. Trong phần thân của thẻ, chúng ta có truy cập tới đối tượng Employee trong danh sách. Chúng ta in tên của họ với department theo sau.
Thẻ Sort
Đầu tiên, chúng ta khai báo DepartmentComparator như là một Bean. Chúng ta cung cấp cho Bean này một tên là deptComparator. Sau đó chúng ta sử dụng thẻ sort và xác định danh sách employee như là source và deptComparator như là bộ so sánh để sử dụng. Sau đó, chúng ta lặp qua list và in các employee mà đã được sắp xếp theo department.
Thẻ Subset
Thẻ subset được sử dụng để lấy một tập con của list hoặc array. Chúng ta có hai phiên bản của thẻ subset. Trong ví dụ đầu tiên, chúng ta sử dụng recrutimentDecider để lấy danh sách các employee, người đang làm việc cho phòng recruitment.
Trong ví dụ thứ hai, chúng ta không sử dụng bất cứ Decider nhưng thay vào đó chúng ta dùng các phần tử 2 và 3 trong list. Thẻ subset nhận hai tham số count và start. Trong đó start quyết định điểm bắt đầu của tập con và count xác định độ dài của tập con.
Tạo các file cấu hình
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.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="employee" class="com.vietjack.struts2.Employee" method="execute"> <result name="success">/employee.jsp</result> </action> </package> </struts>
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>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>
Bạn thử chạy ứng dụng và kiểm tra kết quả.