Struts2 태그 활용 가이드: property, set, bean, if/else, iterator 등

지난 글에서는 Struts2의 OGNL 표현식에 대해 알아보았습니다. 이번에는 Struts2에서 자주 사용되는 핵심 태그들을 실제 예제와 함께 살펴보겠습니다. 다루게 될 태그는 다음과 같습니다:

  • 기본 태그: property, set, bean, include
  • 조건/반복 태그: if/elseif/else, iterator
  • 오류 관련 태그: fielderror

사전 준비: 모델 및 액션 클래스

먼저 실습에 사용할 User 모델 클래스와 OGNL 액션 클래스를 정의합니다. User 클래스에는 name, password 속성과 각각의 getter/setter를 추가합니다. 액션 클래스는 ModelDriven<User> 인터페이스를 구현하여 User 객체를 편리하게 전달받을 수 있도록 합니다.

public class OGNL extends ActionSupport implements ModelDriven<User>{

    private User user = new User();

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    public User getModel() {
        return user;
    }
}

1. property 태그: 값 표현

property 태그는 값 스택에 저장된 데이터를 출력하는 가장 기본적인 태그입니다. 다양한 사용 방법을 살펴보겠습니다.

<ol>
    <li>s:property: <s:property value="name" /></li>
    <li>s:property (문자열 출력): <s:property value="'name'" /></li>
    <li>s:property (기본값 설정): <s:property value="admin" default="관리자"/></li>
    <li>s:property (HTML 이스케이프 활성화): <s:property value="'<span>버튼</span>'" escape="true"/></li>
    <li>s:property (HTML 이스케이프 비활성화): <s:property value="'<span>버튼</span>'" escape="false"/></li>
</ol>

설명

  • Struts2는 value 속성 값을 기본적으로 OGNL 표현식으로 해석합니다. 만약 단순 문자열로 처리하고 싶다면 작은따옴표(' ')로 감싸주면 됩니다.
  • escape="true"는 HTML 태그를 그대로 출력(이스케이프)하고, false는 HTML을 렌더링합니다.

2. set 태그: 변수 재정의

set 태그는 값 스택이나 특정 범위(scope)에 새로운 이름으로 값을 저장할 때 사용합니다.

<ol>
    <li>set (var & password): <s:set var="adminPassword" value="password"/></li>
    <li>set (request 범위): <s:property value="#request.adminPassword"/></li>
    <li>set (ActionContext 범위): <s:property value="#adminPassword"/></li>

    <li>set (scope="page"): <s:set name="pagePassword" value="password" scope="page"/></li>
    <li>set (page 범위 조회): <%=pageContext.getAttribute("pagePassword") %></li>

    <li>set (scope="session" with var): <s:set var="varPassword" value="password" scope="session"/></li>
    <li>set (session 범위 - property로 직접 접근 불가): <s:property value="#varPassword"/></li>
    <li>set (session 범위): <s:property value="#session.varPassword"/></li>
</ol>

설명

  • var 속성으로 새로운 변수명을 지정합니다.
  • scope 속성으로 데이터의 유효 범위(기본값: request 및 ActionContext)를 설정할 수 있습니다.

3. bean 태그: 객체 생성 및 조작

bean 태그는 JSP 페이지 내에서 Java 객체를 생성하고 속성을 설정하는 데 사용됩니다. bean의 생명주기는 <s:bean> 시작부터 </s:bean> 종료까지입니다. <s:debug> 태그를 bean 안팎에 배치하여 값 스택의 변화를 관찰할 수 있습니다.

<ol>
    <li>bean (직접 프로퍼티 사용):
        <s:bean name="com.edu.model.User">
            <s:param name="name" value="'홍길동'"></s:param>
            <s:property value="name"/><br/>
        </s:bean>
    </li>

    <li>bean (var 사용):
        <s:bean name="com.edu.model.User" var="hpugs">
            <s:param name="name" value="'rbb'"></s:param>
            <s:property value="#hpugs.name"/>
            <s:debug></s:debug>
        </s:bean>
        <s:debug></s:debug>
    </li>
</ol>

설명

  • <s:param> 태그를 통해 생성된 객체의 속성값을 설정합니다.
  • var 속성으로 페이지 내에서 객체를 참조할 수 있는 이름을 부여할 수 있습니다.
  • bean은 정의된 범위(<s:bean> ... </s:bean>) 내에서만 존재합니다.

4. include 태그: 외부 리소스 포함

include 태그를 사용하면 외부 HTML 또는 JSP 파일을 현재 페이지에 포함시킬 수 있습니다. 한글 인코딩 문제에 주의해야 합니다.

<ol>
    <li>include (영문 HTML): <s:include value="/include1.html"/></li>
    <li>include (한글 HTML - 인코딩 주의): <s:include value="/include2.html"/></li>
    <li>include (UTF-8 설정 HTML): <s:include value="/include22.html"/></li>
    <li>include (영문 JSP): <s:include value="/include3.jsp"/></li>
    <li>include (한글 JSP): <s:include value="/include4.jsp"/></li>
    <li>참고: include 태그 사용 시 페이지 인코딩과 프로젝트 인코딩을 일치시켜야 한글이 정상 출력됩니다. JSP 파일은 인코딩이 달라도 대부분 정상 동작합니다.</li>
    <li>일반적으로 include 태그보다는 Tiles, Sitemesh 등의 레이아웃 기술 사용을 권장합니다.</li>
</ol>

5. if / elseif / else 태그: 조건 분기

OGNL 표현식을 평가하여 조건에 따라 다른 내용을 출력합니다. request 파라미터를 사용할 때는 인덱스를 명시해야 합니다.

<ol>
    <li>if elseif else: age=<s:property value="#parameters.age"/> (권장하지 않음)</li>
    <li>if elseif else: age=<s:property value="#parameters.age[0]"/> </li>
    <li>actionMessages: <s:property value="actionMessages"/> </li>
    <li>인덱스 없이 사용:
        <s:if test="#parameters.age < 18">너무 어림!</s:if>
        <s:elseif test="#parameters.age < 60">적당함</s:elseif>
        <s:else>노년</s:else>
    </li>
    <li>인덱스 [0] 사용:
        <s:if test="#parameters.age[0] < 18">너무 어림!</s:if>
        <s:elseif test="#parameters.age[0] < 60">적당함</s:elseif>
        <s:else>노년</s:else>
    </li>
    <li>null 체크:
        parameters.age == null: <s:if test="#parameters.age[0] == null">true</s:if><s:else>false</s:else><br/>
        parameters.aaa == null: <s:if test="#parameters.aaa == null">true</s:if>
    </li>
</ol>

주의

  • request 파라미터(예: age)는 배열 형태로 전달되므로 #parameters.age[0]와 같이 인덱스를 지정해야 합니다.

6. iterator 태그: 컬렉션 순회

iterator 태그는 List, Map, 배열 등 반복 가능한 객체를 순회할 때 사용합니다.

기본 리스트 순회

<ol>
    <li>
        <s:iterator value="{'abc', 'def', 'ghi', '123', '456', '789', '147'}" status="type">
            <s:property /> |
            total: <s:property value="#type.count"/> |
            index: <s:property value="#type.index"/> |
            even: <s:property value="#type.even"/> |
            odd: <s:property value="#type.odd"/> |
            first: <s:property value="#type.first"/> |
            last: <s:property value="#type.last"/><br/>
        </s:iterator>
    </li>
</ol>

Map(Key-Value) 순회

<ol>
    <li>var 미사용:
        <s:iterator value="#{1:'가', 2:'나', 3:'다'}">
            <s:property value="key"/> | <s:property value="value"/><br/>
        </s:iterator>
    </li>
    <li>var 사용:
        <s:iterator value="#{1:'가', 2:'나', 3:'다'}" var="abc">
            <s:property value="#abc.key"/> | <s:property value="#abc.value"/><br/>
        </s:iterator>
    </li>
</ol>

7. fielderror, actionerror, actionmessage 태그

액션 클래스에서 전달된 오류 및 메시지를 표시합니다. 먼저 액션 클래스에서 메시지를 추가합니다.

public String execute() throws Exception {
    this.addFieldError("fielderror.text", "FieldError 오류 발생");
    this.addActionError("ActionError 메시지");
    this.addActionMessage("ActionMessage 내용");
    return SUCCESS;
}

JSP 페이지에서는 다음과 같이 사용합니다.

<ol>
    <li>s:fielderror: <s:fielderror /></li>
    <li>s:actionerror: <s:actionerror /></li>
    <li>s:actionmessage: <s:actionmessage /></li>
    <li>특정 필드 오류만 출력: <s:fielderror fieldName="fielderror.text" /></li>
</ol>

각 태그는 해당 타입의 메시지를 자동으로 포맷하여 출력합니다.

태그: struts2 OGNL property tag set tag bean tag

6월 9일 02:01에 게시됨