|
객체의 각 프로퍼티 값을 입력한 것을 동시에 여러 개를 입력할 수 있게 하고, 이를 액션의 리스트 프로퍼티에 객체로 한번에 저장하는 예입니다.
{{예제: 서적 데이터 입력}}
이 예제는 3개의 서적 정보를 동시에 입력 받아서 액션 클래스의 리스트에 서적 객체 데이터를 자동으로 저장하는 예제입니다. 이 예제를 구성하기 위해서 사용할 액션은 2개입니다. - 입력 폼을 출력할 add.action - 입력한 리스트를 출력할 view.action
이 예제를 실행한 모습은 다음과 같다.
[add.action 실행 화면]

[데이터 입력 후 화면]

[Submit 버튼을 눌러서 view.action을 호출했을 때의 화면]

서적 데이터는 isbn, title, writer 3개의 프로퍼티와 리스트에 담을 때 사용할 키 프로퍼티인 id 로 총 4개의 프로퍼티로 구성합니다.
[src/example/test/Book.java]
|
package example.test;
import java.io.Serializable;
public class Book implements Serializable {
private int id;
private String isbn;
private String title;
private String writer;
public Book() {}
public Book(int id) {
this.id = id;
}
public Book(int id, String isbn, String title, String writer) {
this.id = id;
this.isbn = isbn;
this.title = title;
this.writer = writer;
}
public int getId() { return id; }
public void setId(int id) {this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getWriter() { return writer; }
public void setWriter(String writer) { this.writer = writer; }
public String getIsbn() { return isbn; }
public void setIsbn(String isbn) { this.isbn = isbn; }
}
|
다음은 액션클래스를 구성합니다.
[src/example/test/BookAction.java]
|
package example.test;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
private List listBook = new ArrayList();
public String add() throws Exception {
for (int i=0; i<3; i++) {
//id 값으로 i값을 사용하고 실제 모델 데이터에서는 사용하지 않을
//수 도 있고, id 값으로 i값 대신 모델 데이터에서 사용할 고유값 //을 얻어서 넣을 수 있다. 또는 일단 i값을 사용한 후에 고유값으로 //치환할 수 있을 것이다.
Book b = new Book(i);
listBook.add(b);
}
return SUCCESS;
}
public String view() throws Exception {
return SUCCESS;
}
public List getListBook() {return listBook;}
public void setListBook(List listBook) {this.listBook = listBook;}
}
|
BookAction 클래스는 java.util.List 타입의 프로퍼티 listBook 을 갖는다. add() 액션 메소드에서 for() 문을 이용하여 3번 반복하며, 임의의 일련번호를 갖는 Book 타입의 객체를 생성하여 listBook에 저장하고 있다. 이는 입력폼에서 3개의 서적 정보 입력 컨트롤을 생성하기 위한 것인데 JSP에서
<s:iterator value="listBook" ... > <s:textfield .../> <s:textfield .../> <s:textfield .../> </s:iterator>
과 같은 형식으로 여러개의 입력 데이터를 자동으로 생성하기 위한 것이다.
액션 클래스를 구성했으면 타입 변환을 위한 정의 파일을 작성해야 한다. 타입 변환 정의 파일은 액션 클래스와 같은 패키지에 "액션 클래스명-conversion.xml" 이름으로 생성하면된다. 이 예제에서는 BookAction-conversion.xml 이 될 것이며, 이 파일은 입력 폼에서 입력한 여러개의 데이터를 각각의 객체로 구성하여 BookAction 클래스의 프로퍼티인 listBook 에 저장하기 위한 것이다.
[src/example/test/BookAction-conversion.xml]
|
KeyProperty_listBook=id
Element_listBook=example.test.Book
CreateIfNull_listBook=true
|
KeyProperty_listBook=id 부분은 액션 클래스의 프로퍼티인 listBook에서 키 값으로 사용할 프로퍼티를 정의하는 이름이다. (KeyProperty_리스트 프로퍼티 명) 과 같은 형식으로 기입한다. 따라서 이 값은 listBook 리스트에 저장될 객체의 키 프로퍼티 이름이 된다.
Element_listBook 부분은 액션 클래스의 리스트 프로퍼티에 저장될 클래스를 정의하는 곳이다. (Element_리스트 프로퍼티 명) 형식으로 적으며, 우측 값에는 클래스 전체 경로 또는 같은 패키지에 있다면 클래스명만 적을 수 있다.
CreateIfNull_listBook 부분 역시 같은 규칙으로 이름이 정해지고, listBook 이 널 값인 경우 생성할 것인지의 여부를 결정하는 곳이다.
다음 입력 폼으로 사용할 add.jsp를 작성한다.
[/test/add.jsp]
|
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Struts2</title>
</head>
<body>
<s:form action="view" method="POST" theme="simple">
Struts2 Type Conversion Example...
<br/>
<ul>
<s:iterator value="listBook" id="book">
<li>
ISBN: <s:textfield name="listBook(%{#book.id}).isbn"/>
title: <s:textfield name="listBook(%{#book.id}).title"/>
writer: <s:textfield name="listBook(%{#book.id}).writer"/>
</li>
</s:iterator>
</ul>
<br/>
<s:submit/>
</s:form>
</body>
</html>
|
입력 페이지인 add.jsp 에서 서적의 3가지 데이터인 isbn, title, write 를 각각 입력 받을 텍스트 필드 컨트롤을 자동 생성하기 위해서 <s:iterator> 와 <s:textfield> 태그를 사용한다. 이 때 주의해서 사용할 부분은 <s:iterator ... id="book"> 에서 id 속성에 정의된 book 이다. 이 값은 list에 저장될 객체를 구분하기 위한 용도로 사용된다. 또한 <s:textfield > 태그의 name 속성 값에는 name="listBook(%{#book.id}).isbn" 과 같이 listBook 리스트에 저장될 객체의 각 속성을 정의할 수 있다.
add.jsp의 <s:submit/> 버튼을 클릭했을 때 view.action을 호출하도록 <s:form > 태그의 action 속성에 action="view"라고 정의되어있다.
view.action을 호출하면 실행될 view.jsp의 내용은 다음과 같다. <s:iterator > 태그를 이용하여 액션의 리스트형 프로퍼티인 listBook에 저장되어있는 객체의 값을 출력하는 내용으로 구성된다.
[/test/view.jsp]
|
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Struts2</title>
</head>
<body>
<ul>
<s:iterator value="listBook">
<li>
<s:property value="isbn"/> : <s:property value="title"/> ...(<s:property value="writer"/>) <br/>
</li>
</s:iterator>
</ul>
</body>
</html>
|
끝으로 struts.xml 파일에 add.action과 view.action을 정의한다.
[src/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>
<package name="default" extends="struts-default" namespace="">
<action name="add"
class="example.test.BookAction" method="add">
<result>/test/add.jsp</result>
</action>
<action name="view"
class="example.test.BookAction" method="view">
<result>/test/view.jsp</result>
</action>
</package>
</struts>
|
|