Tag <c:set> (JSTL Core) ตั้งค่า property ของ JavaBean หรือ java.util.Map หรือสร้าง variable ใหม่ ใน scope ที่กำหนด
Attributes
| Attribute | คำอธิบาย | Required | Default |
| value | ค่าที่จะตั้ง (EL expression) | No | Body content |
| target | Target object (JavaBean หรือ Map) | No | - |
| property | Property name ของ target | No | - |
| var | Variable name สำหรับเก็บค่า (ถ้าไม่มี target) | No | - |
| scope | Scope ของ var: page, request, session, application | No | page |
โหมดการทำงาน 2 แบบ
1. สร้าง/ตั้งค่า Variable (ไม่มี target)
<c:set var="salary" scope="session" value="${2000 * 2}"/>
<c:out value="${salary}"/> <-- 4000 -->
2. ตั้งค่า Property ของ Bean/Map (มี target และ property)
<!-- JavaBean -->
<c:set target="${user}" property="name" value="Somchai"/>
<!-- java.util.Map -->
<c:set target="${myMap}" property="key1" value="value1"/>
ตัวอย่างสมบูรณ์
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<!-- Mode 1: Variable -->
<c:set var="counter" scope="page" value="${0}"/>
<c:set var="counter" value="${counter + 1}"/>
Counter: <c:out value="${counter}"/> <-- 1 -->
<hr/>
<!-- Mode 2: Bean Property -->
<jsp:useBean id="user" class="com.example.User" scope="session"/>
<c:set target="${user}" property="email" value="somchai@example.com"/>
Email: <c:out value="${user.email}"/>
</body>
</html>
กฎสำคัญ
- ถ้ามี
target ต้องมี property ด้วย
target ต้องมี setter method (setProperty()) หรือเป็น Map
value ไม่ระบุ → ใช้ body content แทน
- EL expressions ใน value รองรับ operators, functions, implicit objects
เปรียบเทียบ <c:set> vs <jsp:setProperty>
| คุณสมบัติ | <c:set> | <jsp:setProperty> |
| Target | Bean, Map, Variable | Bean only |
| Value source | EL expression (ยืดหยุ่น) | param, value, property |
| Scope control | var + scope attribute | Bean scope only |
| Null/Empty handling | EL handles gracefully | Limited |
แนะนำ: ใช้ <c:set> แทน <jsp:setProperty> เพื่อความสม่ำเสมอกับ JSTL/EL