openplanning

Hướng dẫn sử dụng Java JSP Standard Tag Library (JSTL)

  1. JSTL là gì?
  2. Tổng quan về các chức năng của JSTL
  3. Download thư viện JSTL
  4. Tạo WebApp Project
  5. Khai báo thư viện JSTL
  6. Cấu hình để chạy Webapp
  7. Một vài lớp tham gia vào các ví dụ
  8. Các thẻ JSTL cơ bản (JSTL Core Tags)
  9. JSTL Formatting and Localization Tags

1. JSTL là gì?

JSP Standard Tag Library (JSTL) là thư viện thẻ chuẩn cung cấp các thẻ để kiểm soát hành vi trang, lặp đi lặp lại và các lệnh điều khiển, các thẻ quốc tế hóa, và các thẻ SQL.
JSTL là một phần của Java EE API và trong hầu hết các container servlet. Nhưng để sử dụng JSTL trong các trang JSP của bạn, bạn cần phải tải về các thư viện JSTL cho bộ chứa Servlet (container servlet) của bạn. Thông thường, bạn có thể tìm thấy chúng trong các dự án ví dụ và bạn có thể sử dụng chúng. Bạn cần phải đặt các các thư viện này vào thư mục WEB-INF/lib của project. Nếu project của bạn là Maven project bạn cần phải khai báo các thư viện này trong pom.xml

2. Tổng quan về các chức năng của JSTL

Căn cứ chức năng JSTL, chúng được phân loại thành năm loại.
Chức năng
Mô tả / Khai báo
Các thẻ cơ bản
(Core Tags)
Các thẻ cơ bản cung cấp hỗ trợ cho bộ lặp (iteration), các điều kiện logic, bắt ngoại lệ, url, chuyển tiếp (forward) hoặc chuyển hướng (redirect),.... Để sử dụng JSTL core tags, bạn cần đưa nó vào trang JSP giống dưới đây:
Các thẻ cơ bản
(Core Tags)
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Các thẻ định dạng và địa phương hóa.

(Formatting and Localization Tags)
Những thẻ này cung cấp định dạng cho các con số, ngày tháng và hỗ trợ i18n thông qua miền địa phương (locales) và bó tài nguyên (resource bundles). Bạn cần đưa nó vào trang JSP với cú pháp dưới đây.
Các thẻ định dạng và địa phương hóa.

(Formatting and Localization Tags)
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
Các thẻ SQL
(SQL Tags)
Các thẻ JSTL SQL cung cấp các hỗ trợ cho việc tương tác với cơ sở dữ liệu quan hệ như Oracle, MySql v..v. Sử dụng thẻ SQL mà bạn có thể chạy các truy vấn cơ sở dữ liệu, bạn đưa nó vào trong JSP với cú pháp dưới đây:
Các thẻ SQL
(SQL Tags)
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
Các thẻ XML
(XML Tags)
Thẻ XML được sử dụng để làm việc với các tài liệu XML như phân tích cú pháp XML, chuyển đổi dữ liệu XMLXPath đánh giá biểu thức. Cú pháp để có thể sử dụng các thẻ XML trong JSP trang là:
Các thẻ XML
(XML Tags)
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
Các thẻ hàm JSTL
(JSTL Functions Tags)
JSTL tags provide a number of functions that we can use to perform common operation, most of them are for String manipulation such as String Concatenation, Split String etc. Syntax to include JSTL functions in JSP page is:

Thẻ JSTL cung cấp một số chức năng mà chúng ta có thể sử dụng để thực hiện các toán tử thông dùng, hầu hết trong số đó là cho String như nối chuỗi, phân tách chuỗi, ...Cú pháp:
Các thẻ hàm JSTL
(JSTL Functions Tags)
  • <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

3. Download thư viện JSTL

Trước hết bạn cần phải download các thư viện JSTL chuẩn. Nếu bạn đã download Tomcat server, các file thư viện này nằm trong thư mục:
  • <Tomcat>/webapps/examples/WEB-INF/lib
    • taglibs-standard-impl-**.jar
    • taglibs-standard-spec-**.jar
Thông thường các thư viện JSTL chuẩn có tên taglibs-standard-spec-**.jartaglibs-standard-impl-**.jar. Đôi khi các thư viện này cũng được đặt dưới cái tên khác chẳng hạn javax.servlet.jsp.jstl-*.jar, javax.servlet.jsp.jslt-api-*.jar.
Thư viện JSTL
(Cung cấp bởi Apache)
Thư viện JSTL
(Cung cấp bởi Glassfish)
taglibs-standard-spec-*.jar
javax.servlet.jsp.jslt-api-*.jar
taglibs-standard-impl-*.jar
javax.servlet.jsp.jstl-*.jar
Nếu bạn sử dụng Maven:
  • Cung cấp bởi Apache:
<!-- taglibs-standard-spec-*.jar -->
<!-- http://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-spec</artifactId>
    <version>1.2.5</version>
</dependency>

<!-- taglibs-standard-impl-*.jar -->
<!-- http://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
    <version>1.2.5</version>
</dependency>
  • Hoặc cung cấp bởi Glassfish:
<!-- http://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->
<dependency>
   <groupId>org.glassfish.web</groupId>
   <artifactId>javax.servlet.jsp.jstl</artifactId>
   <version>1.2.4</version>
</dependency>

<!-- http://mvnrepository.com/artifact/javax.servlet.jsp.jstl/javax.servlet.jsp.jstl-api -->
<dependency>
   <groupId>javax.servlet.jsp.jstl</groupId>
   <artifactId>javax.servlet.jsp.jstl-api</artifactId>
   <version>1.2.1</version>
</dependency>
  • Cung cấp bởi Sun (Hơi cũ, hiện tại ít được dùng).
<!-- standard.jar -->
<!-- http://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
   <groupId>taglibs</groupId>
   <artifactId>standard</artifactId>
   <version>1.1.2</version>
</dependency>

<!-- jstl-*.jar -->
<!-- http://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
</dependency>
Download:
Bạn có thể download các thư viện cung cấp bởi Apache từ Maven Repository:
Standard spect:
Standard impl:
Kết quả bạn download được:

4. Tạo WebApp Project

Để học JSTL bạn cần tạo một WebApp project để chạy các ví dụ:
  • File/New/Other..
Nhập vào tên Project:
  • JSTLTutorial
Project đã được tạo ra.

5. Khai báo thư viện JSTL

Copy các thư viện JSTL vào thư mục WEB-INF/lib

6. Cấu hình để chạy Webapp

Trước hết bạn cần download và khai báo Tomcat Server với Eclipse. Bạn có thể xem hướng dẫn tại.
Cấu hình để chạy webapp:
Nhấn phải chuột vào project chọn Properties.
Nhấn phải chuột vào project chọn:
  • Run As/Run on Server
Đừng lo lắng nếu bạn nhận được một thông báo như dưới đây, đơn giản vì website của bạn chưa có bất kỳ trang nào.

7. Một vài lớp tham gia vào các ví dụ

Bạn cần một số class, các class này tham gia vào các ví dụ trong tài liệu này.
Dept.java
package org.o7planning.jslttutorial.beans;

import java.util.HashSet;
import java.util.Set;

public class Dept {

  private int deptNo;
  private String deptName;
  private String location;

  private Set<Emp> employees;

  public Dept() {

  }

  public Dept(int deptNo, String deptName, String location) {
      this.deptNo = deptNo;
      this.deptName = deptName;
      this.location = location;
  }

  public int getDeptNo() {
      return deptNo;
  }

  public void setDeptNo(int deptNo) {
      this.deptNo = deptNo;
  }

  public String getDeptName() {
      return deptName;
  }

  public void setDeptName(String deptName) {
      this.deptName = deptName;
  }

  public String getLocation() {
      return location;
  }

  public void setLocation(String location) {
      this.location = location;
  }

  public Set<Emp> getEmployees() {
      return employees;
  }

  public void setEmployees(Set<Emp> employees) {
      this.employees = employees;
  }
 
  public void addEmployee(Emp employee)  {
      if(this.employees== null)  {
          this.employees= new HashSet<Emp>();
      }
      this.employees.add(employee);
  }
}
Emp.java
package org.o7planning.jslttutorial.beans;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Emp {

    private int empNo;
    private String empName;
    private String job;

    private Date hireDate;
    private float salary;

    private static final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    public Emp() {

    }

    // @hireDateStr - phải có định dạng 'MM/dd/yyyy'.
    public Emp(int empNo, String empName, String job,
            String hireDateStr, float salary)  {
        this.empNo = empNo;
        this.empName = empName;
        this.job = job;
        this.salary = salary;
        try {
            this.hireDate = df.parse(hireDateStr);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    public int getEmpNo() {
        return empNo;
    }

    public void setEmpNo(int empNo) {
        this.empNo = empNo;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public float getSalary() {
        return salary;
    }

    public void setSalary(float salary) {
        this.salary = salary;
    }

}
DBUtils.java
package org.o7planning.jslttutorial.utils;

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

import org.o7planning.jslttutorial.beans.Dept;
import org.o7planning.jslttutorial.beans.Emp;

public class DBUtils {

	private static final List<Dept> DEPARTMENTS = new ArrayList<Dept>();

	static {
		initData();
	}

	// Mô phỏng dữ liệu trong Database.
	private static void initData() {

		Dept accountingDept = new Dept(10, "ACCOUNTING", "NEW YORK");
		accountingDept.addEmployee(new Emp(7782, "CLARK", "MANAGER", "6/9/1981", 2450.00f));
		accountingDept.addEmployee(new Emp(7839, "KING", "PRESIDENT", "11/17/1981", 5000.00f));
		accountingDept.addEmployee(new Emp(7934, "MILLER", "CLERK", "6/9/1981", 1300.00f));

		// 
		Dept reseachDept = new Dept(20, "RESEARCH", "DALLAS");
		reseachDept.addEmployee(new Emp(7369, "SMITH", "CLERK", "12/17/1980", 800.00f));
		reseachDept.addEmployee(new Emp(7788, "SCOTT", "ANALYST", "4/19/1987", 3000.00f));
		reseachDept.addEmployee(new Emp(7876, "ADAMS", "CLERK", "5/23/1987", 1100.00f));
		reseachDept.addEmployee(new Emp(7876, "FORD", "ANALYST", "12/3/1981", 3000.00f));
		reseachDept.addEmployee(new Emp(7566, "JONES", "MANAGER", "4/2/1981", 2975.00f));
		// 
		// 
		Dept salesDept = new Dept(30, "SALES", "CHICAGO");
		salesDept.addEmployee(new Emp(7654, "MARTIN", "SALESMAN", "9/28/1981", 1250.00f));
		salesDept.addEmployee(new Emp(7499, "ALLEN", "SALESMAN", "2/20/1981", 1600.00f));
		salesDept.addEmployee(new Emp(7521, "WARD", "SALESMAN", "2/22/1981", 1250.00f));
		salesDept.addEmployee(new Emp(7844, "TURNER", "SALESMAN", "9/8/1981", 1500.00f));
		salesDept.addEmployee(new Emp(7900, "JAMES", "CLERK", "12/3/1981", 950.00f));
		// 
		Dept openrationsDept = new Dept(40, "OPERATIONS", "BOSTON");
		// 
		DEPARTMENTS.add(accountingDept);
		DEPARTMENTS.add(reseachDept);
		DEPARTMENTS.add(salesDept);
		DEPARTMENTS.add(openrationsDept);
	}

	// Truy vấn bảng Department.
	public static List<Dept> queryDepartments() {
		return DEPARTMENTS;
	}

	// Truy vấn bảng Employee.
	// Lấy ra danh sách các nhân viên của 1 phòng ban.
	public static Set<Emp> queryEmployees(int deptNo) {
		for (Dept dept : DEPARTMENTS) {
			if (deptNo == dept.getDeptNo()) {
				return dept.getEmployees();
			}
		}
		return null;
	}
}

8. Các thẻ JSTL cơ bản (JSTL Core Tags)

Thẻ
Mô tả
<c:out>
Để viết một cái gì đó trong trang JSP, bạn có thể sử dụng EL cũng có thẻ này
<c:import>
Giống với <jsp:include> hoặc chỉ thị include (include directive)
<c:redirect>
Chuyển hướng (redirect) yêu cầu tới một nguồn dữ liệu khác.
<c:set>
Sét đặt giá trị biến cho bởi phạm vi.
<c:remove>
Loại bỏ biến ra khỏi phạm vi đã cho.
<c:catch>
Bắt ngoại lệ và gói vào một đối tượng.
<c:if>
Điều kiện logic đơn giản, sử dụng với EL và bạn có thể sử dụng nó để xử lý các trường hợp ngoại lệ từ <c:catch>
<c:choose>
Tag có điều kiện đơn giản mà thiết lập một bối cảnh cho các trường hợp loại trừ lẫn nhau có điều kiện, đánh dấu bằng <c:when><c:otherwise>
<c:when>
Thẻ con của <c:choose>, khi một điều kiện tại when là đúng.
<c:otherwise>
Thẻ con của <c:choose>, khi tất cả các điều kiện <c:when> là sai.
<c:forEach>
Dùng để lặp trên một tập hợp.
<c:forTokens>
dùng để lặp trên chuỗi (tokens) được phân cách bởi một dấu phân cách.
<c:param>
Được sử dụng với <c:import> để truyền các tham số.
<c:url>
Để tạo một URL với các tham số tùy chọn (optional query string parameters).
Các toán tử EL
Một tính năng hữu ích của EL là khả năng thực hiện so sánh, hoặc giữa các số hoặc các đối tượng. Tính năng này được sử dụng chủ yếu cho các giá trị của thuộc tính thẻ tùy chỉnh, nhưng đều có thể được sử dụng để viết ra các kết quả của một sự so sánh (đúng hoặc sai) cho trang JSP. EL cung cấp các toán tử so sánh sau đây:
Bằng với
(equals)
==
eq
Không bằng
(Not equals)
!=
ne
Nhỏ hơn
(Less than)
<
lt
Lớn hơn
(Greater than)
>
gt
Nhỏ hơn hoặc bằng
(Less than or equals)
<=
le
Lớn hơn hoặc bằng
(Greater than or equals)
>=
ge
Cách so sánh thứ 2 nên được sử dụng để tránh xa việc nhầm lẫn giữa các dấu < hoặc > với thẻ trong JSP. Tuy nhiên, hành vi của hai cách là như nhau. Hãy xem ví dụ dưới đây:
Khái niệm
Điều kiện EL
Kết quả
Số nhỏ hơn
${1 < 2}
true
Số lớn hơn
${1 > 2}
false
Số nhỏ hơn
(Less than)
${1 lt 2}
true
Số lớn hơn
(Greater than)
${1 gt 2}
false
Số hơn hơn hoặc bằng
${1 >= 1}
true
Số nhỏ hơn hoặc bằng
${1 <= 1}
true
Số nhỏ hơn hoặc bằng
(Less equals)
${1 le 1}
true
Số lớn hơn hoặc bằng
(Greater than or equal)
${1 ge 1}
true
Số bằng với
${1 == 1}
true
Số bằng với
(equal)
${1 eq 1}
true
Số không bằng với
${1 != 2}
true
Số không bằng với
(not equal)
${1 ne 2}
true
Chữ nhỏ hơn
${'abe' < 'ade'}
true
Chữ lớn hơn
${'abe' > 'ade'}
false
Chữ bằng với
(Equals)
${'abe' eq 'abe'}
true
Chữ không bằng với
(Not equals)
${'abe' ne 'ade'}
true
Bạn cũng có thể sử dụng các toán tử && và ||.
Toán tử
Mô tả
&&
||
Hoặc
Ví dụ:
${(guess >= 10) && (guess <= 20)}
${ guess >= 10 && guess <= 20 }
${(guess < 10) || (guess > 20)}
${ guess < 10 || guess > 20 }
c:forEach
Hãy xem một ví dụ đầu tiên sử dụng thẻ <c:forEach> của JSTL Core. Người dùng truy cập vào servlet /jstlCoreExample01 dữ liệu sẽ được truy vấn trên Servlet, sau đó chuyển tiếp (forward) yêu cầu (request) tới trang JSP để hiển thị. Trên trang JSP sử dụng JSTL để hiển thị dữ liệu.

Nếu bạn không muốn người dùng truy cập trực tiếp vào các trang JSP bạn có thể để chúng trong thư mục WEB-INF hoặc các thư mục con của thư mục này.

Trên Servlet bạn có thể lưu trữ dữ liệu vào một thuộc tính (attribute) của request, dữ liệu này chỉ tồn tại trong thời gian request đang diễn ra.
// Lấy ra dữ liệu từ DB (Mô phỏng).
List<Dept> list = DBUtils.queryDepartments();

// Ghi dữ liệu vào thuộc tính 'departments' của request.
request.setAttribute("departments", list);
Trên JSP bạn có thể sử dụng dữ liệu đã được lưu trữ trên thuộc tính (attribute) của request.
<c:forEach items="${requestScope.departments}" var="dept">

  ${dept.deptName}

</c:forEach>


<!-- Hoặc (Bạn có thể không cần requestScope)  -->

<c:forEach items="${departments}" var="dept">

  ${dept.deptName}

</c:forEach>
Xem ví dụ đầy đủ.
JstlCoreEx01Servlet.java
package org.o7planning.jslttutorial.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.jslttutorial.beans.Dept;
import org.o7planning.jslttutorial.utils.DBUtils;

@WebServlet("/jstlCoreExample01")
public class JstlCoreEx01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public JstlCoreEx01Servlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Truy vấn dữ liệu từ DB (Mô phỏng).
		List<Dept> list = DBUtils.queryDepartments();

		// Lưu dữ liệu vào thuộc tính 'departments' của request.
		request.setAttribute("departments", list);

		// Tạo đối tượng RequestDispatcher
		// để Forward (chuyển tiếp) yêu cầu tới jstl_core_example01.jsp
		RequestDispatcher dispatcher = getServletContext()
				.getRequestDispatcher("/WEB-INF/jsps/jstl_core_example01.jsp");

		// Forward (Chuyển tiếp) yêu cầu, để hiển thị dữ liệu trên trang JSP.
		dispatcher.forward(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
/WEB-INF/jsps/jstl_core_example01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>

<!-- Khai báo sử dụng JSTL Core Tags -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL Core Tags Example 01</title>
</head>
<body>

<h2>Departments and Employees</h2>

<!-- Dùng for để duyệt trên các phòng ban (departments) -->
<c:forEach items="${departments}" var="dept">
 <h3>${dept.deptName}</h3>
 <ul>
   <!-- Dùng for để duyệt trên các nhân viên
               thuộc phòng ban hiện tại -->
   <c:forEach items="${dept.employees}" var="emp">
       <li>
          ${emp.empName} - (${emp.job})
       </li>    
   </c:forEach>
 </ul>

</c:forEach>


</body>
</html>
Chạy ví dụ:
c:if
<c:if> được sử dụng để kiểm tra một điều kiện nào đó là đúng hay sai. Chẳng hạn ví dụ dưới đây kiểm tra xem một tập hợp có phần tử hay không (Kiểm tra xem phòng ban hiện tại có nhân viên hay không). Ví dụ này giống ví dụ ở trên nhưng chỉ hiển thị các phòng ban có nhân viên.
JstlCoreEx02Servlet.java
package org.o7planning.jslttutorial.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.jslttutorial.beans.Dept;
import org.o7planning.jslttutorial.utils.DBUtils;

@WebServlet("/jstlCoreExample02")
public class JstlCoreEx02Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public JstlCoreEx02Servlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Chuẩn bị dữ liệu từ DB (Mô phỏng).
		List<Dept> list = DBUtils.queryDepartments();

		// Lưu dữ liệu vào thuộc tính (attribute) 'departments' của request.
		request.setAttribute("departments", list);

		// Tạo đối tượng RequestDispatcher
		// để forward (chuyển tiếp) yêu cầu tới jstl_core_example02.jsp
		RequestDispatcher dispatcher = getServletContext()
				.getRequestDispatcher("/WEB-INF/jsps/jstl_core_example02.jsp");

		// Forward (Chuyển tiếp) yêu cầu, để hiển thị trên trang JSP.
		dispatcher.forward(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
/WEB-INF/jsps/jstl_core_example02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>

<!-- Khai báo sử dụng JSTL Core Tags -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL Core Tags Example 01</title>
</head>
<body>

<h2>Departments and Employees</h2>

<!-- Dùng for để duyệt trên các phòng ban (departments) -->
<c:forEach items="${departments}" var="dept">

<!-- Kiểm tra một tập hợp có phần tử không -->
<c:if test="${not empty dept.employees}">
     <h3>${dept.deptName}</h3>
     <ul>
       <!-- Dùng for để duyệt trên các nhân viên
                   thuộc phòng ban hiện tại -->
       <c:forEach items="${dept.employees}" var="emp">
           <li>
              ${emp.empName} - (${emp.job})
           </li>    
       </c:forEach>
     </ul>
 </c:if>

</c:forEach>


</body>
</html>
Chạy ví dụ:
c:choose - c:when - c:otherwise
Cú pháp sử dụng:
<c:choose>
    <c:when test="${điều kiên 1}">
       <%-- Làm gì đó ở đây khi điều kiện 1 đúng  --%>
    </c:when>
    <c:when test="${điều kiên 2}">
        <%-- Làm gì đó ở đây khi điều kiện 2 đúng  --%>
    </c:when>
    <c:otherwise>
        <%-- Câu lệnh sẽ được thực thi khi tất cả các điều kiện tại <c:when> ở trên sai.  --%>
    </c:otherwise>
</c:choose>
Ví dụ:
c_choose.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:choose,c:when,c:otherwise example</title>
</head>
<body>

<h2>c:choose,c:when,c:otherwise example</h2>


<c:choose>
  <%-- Khi tham số color == 'red' --%>
  <c:when test="${param.color=='red'}">
      <p style="color:red;">RED COLOR</p>
  </c:when>  
 
  <%-- Khi tham số color == 'blue' --%>
  <c:when test="${param.color=='blue'}">
      <p style="color:blue;">BLUE COLOR</p>
  </c:when>  
 
  <%-- Các trường hợp khác --%>
  <c:otherwise>
      <b>Other color</b>
  </c:otherwise>
</c:choose>

</body>
</html>
Chạy ví dụ:
c:out
Thẻ <c:out> hiển thị các kết quả của một biểu thức, tương tự như cách làm việc của <% =%>, khác biệt là <c:out> có thể sử dụng "." để truy cập vào các thuộc tính của đối tượng. Ví dụ, để truy cập dept.deptName chỉ cần sử dụng thẻ là <c:out value = "${dept.deptName}" />.
<c:out> có thể tự động escape nội dung XML.

escape có ý nghĩa là nếu có các ký tự đặc biệt < > hoặc & nằm ở trong <c:out> khi in ra nó sẽ được chuyển thành &lt;&gt;&amp;

  • Chẳng hạn:
    • <c:out value = "${'<atag> &'}" />
  • In ra (Xem trong source của trang trên trình duyệt).
    • &lt;atag&lt; &amp;
Ví dụ:
c_out.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:out example</title>
</head>
<body>

<h2>c:out example</h2>

<c:out value="${'This is true: 10 > 1 '}" />

<br/>
Tag: <c:out value="${'<atag> , &'}"/>

</body>
</html>
Chạy ví dụ:
c:set
c_set.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:set example</title>
</head>
<body>

<h2>c:set example</h2>

<c:set scope="request" var="greeting" value="Hello every body" />


Greeting: <c:out value="${greeting}"/>

</body>
</html>
Chạy ví dụ:
c:remove
c_remove.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:remove example</title>
</head>
<body>

<h2>c:remove example</h2>

<c:set scope="request" var="greeting" value="Hello every body" />


Greeting: <c:out value="${greeting}"/>
<br/><br/>

<c:remove scope="request" var="greeting" />
After remove:
<br/>
Greeting: <c:out value="${greeting}"/>

</body>
</html>
Chạy ví dụ:
c:catch
c_catch.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:catch example</title>
</head>
<body>

<h2>c:catch example</h2>

<c:catch var ="ex">
  <%
   int a = 100/0;    
  %>
</c:catch>

<c:if test = "${ex != null}">
 Exception : ${ex}
 <br />
 Message: ${ex.message}
</c:if>

</body>
</html>
Chạy ví dụ:
c:forTokens
c_forTokens.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:forTokens example</title>
</head>
<body>

<h2>c:forTokens example</h2>


<c:forTokens items="Tom,Jerry,Donald" delims="," var="name">
  <c:out value="${name}"/><p>
</c:forTokens>

</body>
</html>
Chạy ví dụ:
c:url - c:param
c_url.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c:url,c:param example</title>
</head>
<body>

<h2>c:url,c:param example</h2>


<c:url value="http://example.com/showPage.jsp" var="myURL">
  <c:param name="color" value="red"/>
  <c:param name="background" value="blue"/>
</c:url>

<c:out value="${myURL}"/>

</body>
</html>
Chạy ví dụ:

9. JSTL Formatting and Localization Tags

Các thẻ định dạng JSTL (JSTL formatting tags) được sử dụng để định dạng và hiển thị văn bản, ngày tháng, thời gian, và số cho các trang web có tính chất quốc tế (Có người dùng đa quốc gia).
Tag
Description
<fmt:formatNumber>
Sử dụng để định dạng số thành một chuỗi theo một quy tắc chỉ định.
<fmt:parseNumber>
Phân tích các chuỗi đại diện của một số, tiền tệ, hoặc tỷ lệ phần trăm.
<fmt:formatDate>
Định dạng ngày tháng hoặc thời gian sử dụng một mẫu chỉ định.
<fmt:parseDate>
Phân tích một String mô tả ngày tháng hoặc thời gian.
<fmt:bundle>
Tải bó nguồn dữ liệu (resource bundle) để sử bởi thẻ body của nó.
<fmt:setLocale>
Stores the given locale in the locale configuration variable.
<fmt:setBundle>
Loads a resource bundle and stores it in the named scoped variable or the bundle configuration variable.
<fmt:timeZone>
Specifies the time zone for any time formatting or parsing actions nested in its body.
<fmt:setTimeZone>
Stores the given time zone in the time zone configuration variable
<fmt:message>
To display an internationalized message.
<fmt:requestEncoding>
Sets the request character encoding
fmt:formatNumber
Thẻ <fmt:formatNumber> được sử dụng để định dạng số, phần trăm và tiền tệ.
Cú pháp:
<fmt:formatNumber
  value="<number>"
  type="<string>"
  pattern="<string>"
  currencyCode="<string>"
  currencySymbol="<string>"
  groupingUsed="<string>"
  maxIntegerDigits="<integer>"
  minIntegerDigits="<integer>"
  maxFractionDigits="<integer>"
  minFractionDigits="<integer>"
  var="<string>"
  scope="<string>"/>
Thuộc tính:

Thuộc tính

Bắt buộc

Kiểu

Mặc định

Mô tả

value

Yes

Number

Giá trị số, sẽ được định dạng.

type

String

number

Xác định xem giá trị được định dạng như một số, tiền tệ hoặc tỷ lệ phần trăm.
Các giá trị (number, currency, percel).

pattern

String

Khuôn định dạng (Formatting pattern).

currencyCode

String

Lấy theo miền địa phương mặc định.
Mã tiền tệ được sử dụng nếu các loại thuộc tính là tiền tệ.

currencySymbol

String

Lấy theo miền địa phương mặc định.
Các ký hiệu tiền tệ được sử dụng nếu các loại thuộc tính là tiền tệ.

groupingUsed

String

true

Có phân tách nhóm hay không khi định dạng đầu ra.

maxIntegerDigits

Integer

Số lượng tối đa các chữ số trong phần nguyên.

minIntegerDigits

Integer

Số lượng tối thiểu của các chữ số ở phần nguyên

maxFractionDigits

Integer

Số lượng tối đa các chữ số trong phần thập phân.

minFractionDigits

Integer

Số lượng tối thiểu các chữ số trong phần thập phân.

var

String

In ra màn hinh.

Tên của biến lưu trữ kết quả đã được định dạng.

scope

String

Phạm vi của biến lưu trữ trong var.

fmt_formatNumber.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<!DOCTYPE html>
<html>
  <head>
     <meta charset="UTF-8">
     <title>fmt:formatNumber example</title>
  </head>
  <body>
     <h2>fmt:formatNumber example</h2>
     <c:set var="accountBalance" value="12345.6789" />
     <h3>accountBalance=<c:out value="${accountBalance}"/></h3>
     
     The Account Balance can be displayed using various ways:
     
     <p>
        formatNumber (type='currency'):
        <strong>
           <fmt:formatNumber value="${accountBalance}" type="currency"/>
        </strong>
     </p>
     <p>
        formatNumber (type='number', maxIntegerDigits= '3'):
        <strong>
           <fmt:formatNumber type="number" maxIntegerDigits="3" value="${accountBalance}" />
        </strong>
     </p>
     <p>
        formatNumber (type='number', maxFractionDigits= '3'):
        <strong>
           <fmt:formatNumber type="number" maxFractionDigits="3" value="${accountBalance}" />
        </strong>
     </p>
     <p>
        formatNumber (type='number', groupingUsed= 'false'):
        <strong>
           <fmt:formatNumber type="number" groupingUsed="false" value="${accountBalance}" />
        </strong>
     </p>
     <p>
        formatNumber (type='percent', maxIntegerDigits= '3'):
        <strong>
           <fmt:formatNumber type="percent" maxIntegerDigits="3" value="${accountBalance}" />
        </strong>
     </p>
     <p>
        formatNumber (type='percent', maxIntegerDigits= '10'):
        <strong>
           <fmt:formatNumber type="percent" minFractionDigits="10" value="${accountBalance}" />
        </strong>
     </p>
     <p>
        formatNumber (type='number', pattern= '###.###E0'):
        <strong>
           <fmt:formatNumber type="number" pattern="###.###E0" value="${accountBalance}" />
        </strong>
     </p>
     <p>        
        Account Balance in USA (fmt:setLocale value='en_US'):
        <br/>
        formatNumber (type='currency'):          
        <fmt:setLocale value="en_US"/>
        <strong>
           <fmt:formatNumber value="${accountBalance}" type="currency"/>
        </strong>
     <p>
        Account Balance in Canada (fmt:setLocale value='fr_CA'):
        <br/>
        formatNumber (type='currency'):
        <fmt:setLocale value="fr_CA"/>
        <strong>
           <fmt:formatNumber value="${accountBalance}" type="currency"/>
        </strong>
  </body>
 
</html>
Chạy ví dụ:
fmt:parseNumber
Thẻ <fmt:parseNumber> được sử dụng để phân tích một chuỗi mô tả một con số, tiền tệ, hoặc phần trăm.
Cú pháp:
<fmt:parseNumber
   value="<string>"
   type="<string>"
   pattern="<string>"
   parseLocale="<string>"
   integerOnly="<string>"
   var="<string>"
   scope="<string>"/>
Thuộc tính:

Thuộc tính

Bắt buộc

Kiểu

Mặc định

Mô tả

value

Yes

String

String được phân tích.

type

String

number

Quyết định xem String được cung cấp để phân tích là số, tiền tệ hoặc phần trăm, mặc định là số.
(number, currency, percentage).

pattern

String

Khuôn mẫu của String đã cho trong thuộc tính value được phân tích.

parseLocale

String

locale mặc định

Locale để sử dụng khi phân tích các giá trị bằng cách sử dụng khuôn mẫu (pattern) đã cho.

integerOnly

String

false

Chỉ định có hoặc không, chỉ các phần nguyên của giá trị được phân tích.

var

String

In ra trang

Tên của biến để lưu trữ kết quả phân tích, kết quả trả về là một số (java.lang.Number).

scope

String

page

Phạm vi của var để lưu trữ.

Theo mặc định, <fmt: formatNumber> gửi đầu ra của nó đến JspWriter hiện tại (Để ghi vào trang), nhưng nếu bạn chỉ định thuộc tính var, <fmt: formatNumber> sẽ lưu trữ đầu ra của nó vào một biến có phạm vi (scope) được chỉ định trong thuộc tính var. Giá trị mặc định của thuộc tính scope'page', bạn có thể chỉ định giá trị khác cho thuộc tính scope.
fmt_parseNumber.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<!DOCTYPE html>
<html>
  <head>
     <meta charset="UTF-8">
     <title>fmt:parseNumber example</title>
  </head>
  <body>
     <h2>fmt:parseNumber example</h2>    
 
   <!-- Một chuỗi có định dạng tiền tệ -->
   <c:set var="accountBalance" value="$12345.6789" />
   
    <h4>Input <c:out value="${accountBalance}"/></h4>   
   
   <fmt:parseNumber var="parsedNumber" type="currency"
                  parseLocale="en_US"
                  value="${accountBalance}" />
   
   <p>Account Balance: <c:out value="${parsedNumber}" /></p>
   

   <!-- integerOnly="true" : Chỉ lấy phần nguyên -->
   
   <fmt:parseNumber var="parsedNumber" type="currency"
                   integerOnly="true" parseLocale="en_US"
                   value="${accountBalance}" />
                   
   <p>Account Balance (without cents): <c:out value="${parsedNumber}" /></p>
  </body>
 
</html>
Chạy ví dụ:
fmt:formatDate
Thẻ <fmt:formatDate> dùng để định dạng ngày tháng và thời gian thành một chuỗi theo khuôn mẫu cho chỉ định.
Thuộc tính:

Name

Required

Type

Default

Description

value

True

Date

Ngày tháng hoặc thời gian, dùng để định dạng.

type

False

String

date

Quyết định xem giá trị trong thuộc tính value là ngày tháng hoặc thời gian, hoặc cả hai.
(date, time, both)

dateStyle

False

String

default

Cách định dạng kiểu ngày tháng. Định dạng ngày tháng có thể được xác định với ngữ nghĩa tương tự trong class java.text.DateFormat.

timeStyle

False

String

default

Cách định dạng kiểu thời gian. Định dạng thời gian có thể được xác định với ngữ nghĩa tương tự trong class java.text.DateFormat.

pattern

False

String

Mô hình được sử dụng cho ngày tháng và thời gian khi định dạng.

timeZone

False

String

Múi giờ mặc định

Múi giờ để đại diện cho thời gian định dạng.

var

False

String

Ghi ra trang

Tên của các biến để lưu trữ kết quả định dạng.

scope

False

String

page

Phạm vi lưu trữ của biến var.

Các ký tự định dạng:
Mục đích
Ví dụ

G

Định danh cho kỷ nguyên

AD

y

Năm

2002

M

Tháng

April & 04

d

Ngày trong tháng

20

h

Giờ(0-12)

12

H

Giờ (0 - 23)

0

m

Phút

45

s

Giây

52

S

Mili giây

970

E

Ngày trong tuần

Tuesday

D

Ngày trong năm

180

F

Ngày của tuần trong tháng

2 (2nd Wed in month)

w

Tuần trong năm

27

W

Tuần trong tháng

2

a

Ký hiệu a.m./p.m.

PM

k

The hour(12-hour time)

24

K

The hour(24-hour time)

0

z

Múi giờ

Central Standard Time

'

The escape for text

''

The single quote

fmt_formatDate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<!DOCTYPE html>
<html>
  <head>
     <meta charset="UTF-8">
     <title>fmt:formatDate example</title>
  </head>
  <body>
     <h2>fmt:formatDate example</h2>
     <c:set var="now" value="<%=new java.util.Date()%>" />
     <p>
        Time (fmt:formatDate type="time"):
        <strong>
           <fmt:formatDate type="time" value="${now}" />
        </strong>
     </p>
     <p>
        Date (fmt:formatDate type="date"):
        <strong>
           <fmt:formatDate type="date" value="${now}" />
        </strong>
     </p>
     <p>
        Date, Time (fmt:formatDate type="both"):
        <strong>
           <fmt:formatDate type="both" value="${now}" />
        </strong>
     </p>
     <p>
        Date, Time Short (fmt:formatDate type="both" dateStyle="short"):
        <strong>
           <fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${now}" />
        </strong>
     </p>
     <p>
        Date, Time Medium (fmt:formatDate type="both" dateStyle="medium" timeStyle="medium"):
        <strong>
           <fmt:formatDate type="both" dateStyle="medium" timeStyle="medium" value="${now}" />
        </strong>
     </p>
     <p>
        Date, Time Long (fmt:formatDate type="both" dateStyle="long" timeStyle="long"):
        <strong>
           <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${now}" />
        </strong>
     </p>
     <p>
        Date, Time (dd-MM-yyyy HH:mm:ss):
        <strong>
           <fmt:formatDate pattern="dd-MM-yyyy HH:mm:ss" value="${now}" />
        </strong>
     </p>
     
     <!-- Store in variable -->
     <fmt:formatDate pattern="dd-MM-yyyy HH:mm" value="${now}" var="nowString"/>
     
      <p>
        Now String (dd-MM-yyyy HH:mm):
        <strong>
           <c:out value="${nowString}" />
        </strong>
      </p>    
  </body>
</html>
Chạy ví dụ:
fmt:parseDate
Thẻ <fmt:parseDate> dùng để phân tích một string mô tả của ngày tháng hoặc thời gian.
Cú pháp:
<fmt:parseDate
   value="<string>"
   type="<string>"
   dateStyle="<string>"
   timeStyle="<string>"
   pattern="<string>"
   timeZone="<string>"
   parseLocale="<string>"
   var="<string>"
   scope="<string>"/>
Thuộc tính

Thuộc tính

Bắt buộc

Kiểu dữ liệu

Mặc định

Mô tả

value

False

String

Nội dung trong body của thẻ

Chuỗi mô tả ngày tháng được phân tích.

type

False

String

date

Quết định xem giá trị chỉ định trong value chứa ngày tháng (date) hay thời gian (time) hoặc cả hai (both).

dateStyle

False

String

default

Chỉ định kiểu ngày tháng (SHORT, LONG, FULL, MEDIUM hoặc DEFAULT).

timeStyle

False

String

default

Chỉ định kiểu thời gian (SHORT, LONG, FULL, MEDIUM hoặc DEFAULT).

pattern

False

String

Chỉ định khuôn mẫu của chuỗi thời gian sẽ được phân tích.

timeZone

False

String

Múi giờ (time zone) mặc định

Múi giờ để diễn giải nếu chuỗi ngày tháng có chứa thông tin thời gian bất kỳ.

parseLocale

False

String

Miền địa phương (locale) mặc định

Locale whose date time formatting will be used to parse the date time.
Miền địa phương có định dạng ngày tháng thời gian sẽ được sử dụng để phân tích.

var

False

String

In ra trang

Tên của biến dùng để lưu trữ kết quả phân tích được.

scope

False

String

page

Phạm vi lưu trữ của biến var.

fmt_parseDate.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>   
<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>fmt:parseDate example</title>
   </head>
   <body>
      <h2>fmt:parseDate example</h2>
   
      <!-- Một chuỗi có định dạng ngày tháng thời gian -->
      <c:set var="dateTimeString" value="17-11-2015 11:49" />
      <h4>
         dateTimeString:
         <c:out value="${dateTimeString}"/>
      </h4>
      <!-- Phân tích chuỗi mô tả ngày tháng thời gian lưu vào biến kiểu java.util.Date -->
    
      <fmt:parseDate value="${dateTimeString}"
         type="both" var="parsedDatetime" pattern="dd-MM-yyyy HH:mm" />
      <p>
         The date time after parsing:
         <c:out value="${parsedDatetime}" />
      </p>
      <br/>
      <p>
         Date only (dd/MM/yyyy):
         <fmt:formatDate value="${parsedDatetime}" pattern="dd/MM/yyyy"/>
   </body>

</html>
Kết quả chạy ví dụ:
fmt:bundle
Thẻ <fmt:bundle> dùng để nạp gói tài nguyên và sẽ được sử dụng trong trang. Các gói tài nguyên mà thẻ này tải chứa các cặp khóa-giá trị (key,value) được sử dụng để quốc tế hoặc nội địa hóa các ứng dụng web. Sau đó, các thẻ <fmt:message> được sử dụng để hiển thị các value ứng với các key trong các gói tài nguyên đến đầu ra.
Cú pháp:
<fmt:bundle baseName="<string>" prefix="<string>"/>
Thuộc tính:

Name

Required

Type

Default

Description

baseName

True

String

Tên đầy đủ của gói tài nguyên. Giống với quy ước tên đầy đủ của Java ('.' Được sử dụng để tách các tên package). Ví dụ: org.o7planning.MyBundle

prefix

False

String

Khi được sử dụng với <fmt:message>, thuộc tính này là một tiền tố, chỉ định giá trị được thêm vào giá trị của key, để mỗi khi sử dụng bạn không cần phải cung cấp tiền tố lặp đi lặp lại.

Sử dụng thẻ <fmt:bundle><fmt:message> có thể giúp website của bạn hiển thị đa ngôn ngữ. Hãy xem ví dụ sau:
Bạn tạo ra 3 file properties trong package org.o7planning.bundles.
Với nội dung:
MyBundle.properties & MyBundle_en.properties
login.label.userName=User Name
login.label.password=Password
MyBundle_vi.properties
login.label.userName=Tên \u0111\u0103ng nh\u1EADp
login.label.password=M\u1EADt kh\u1EA9u

Thật không may, khi đọc file .properties thông qua ResourceBundle, nó luôn đọc với mã hóa 'ISO-8859-1'. Bạn không thể sử dụng Unicode trong file properties. Cách tiếp cận thông thường là Escapse các ký tự Unicode trong file Properties. Và khi đó nó sẽ giống dưới đây:

  • login.label.password=Mật khẩu
Escapse ===>
  • login.label.password=M\u1EADt kh\u1EA9u
Khi bạn gõ chữ Unicode vào file properties trên "Properties File Editor" của Eclipse, nó sẽ tự động thay thế các ký tự không phải ASCII (None-ASCII).
fmt_bundle.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<c:if test="${not empty param.language}">
  <c:set var="language" value="${param.language}" scope="session"/>
</c:if>
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="org.o7planning.bundles.MyBundle" />
<!DOCTYPE html>
<html>
  <head>
     <meta charset="UTF-8">
     <title>fmt:bundle example</title>
  </head>
  <body>
     <h2>fmt:bundle example</h2>
     <form action="">
        <table border="0">
           <tr>
              <td>
                 <fmt:message key="login.label.userName"/>
              </td>
              <td>
                 <input type="text" name="userName" />
              </td>
           </tr>
           <tr>
              <td>
                 <fmt:message key="login.label.password"/>
              </td>
              <td><input type="text" name="userName" /></td>
           </tr>
        </table>
        <input type="submit"  value="Submit"/>
     </form>
  </body>
</html>
Chạy ví dụ:
Chú ý:
<!--
Nếu người dùng đã sử dụng một ngôn ngữ cụ thể khi xem một trang,
biến 'language' được sét đặt có phạm vi 'session' giá trị của nó sẽ tồn tại
trong suốt quá trình làm việc của người dùng, và website sẽ vẫn hiển thị theo ngôn ngữ đó,
nếu trên tham số của trang không chỉ định một ngôn ngữ cụ thể khác.
-->

<c:set var="language" value="${param.language}" scope="session"/>

<fmt:setLocale value="${language}" />
fmt:message
Thẻ <fmt:message> được sử dụng để hiển thị các thông báo bản địa hóa bằng cách thay thế các key (khóa) bởi các thông điệp thực tế nạp từ file tài nguyên (resource bundle). Thẻ này hoạt động kết hợp với <fmt:bundle> được sử dụng để tải các gói tài nguyên.
Cú pháp:
<fmt:message
   key="<string>"
   bundle="<string>"
   var="<string>"
   scope="<string>"/>
Thuộc tính:

Thuộc tính

Bắt buộc

Kiểu

Mặc đinh

Mô tả

key

False

String

Giá trị trong thân thẻ

Khóa của message để tìm kiếm trên bó tài nguyên.

bundle

False

String

Default bundle

Nguồn tài nguyên để tìm khóa (key).

var

False

String

Print to Page

Tên của biến, dùng để lưu trữ message tương ứng với key.

scope

False

String

page

Phạm vi của biến var.