Struts, Spring 실무전문강좌, 마이플렛폼 공인교육기관
개발자 최고인기강좌!! --> Spring&iBATIS 실무과정, JAVA초보에서 Web&Spring, Miplatform까지
www.oraclejava3.co.kr 자바강좌에서 확인하세요.
(분당정자점은 양재, 강남에서 15분 거리에 있습니다. ^^)
struts2 Type Conversion 개요<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />:namespace prefix = o />
HTML 폼에서 요청 파라미터로 데이터를 전송하면 모두 String 형태로 데이터를 전송한다. 그러므로 Action에서 받아 일일이 형 변환을 해주어야 하는데 Struts2에서는 Type Conversion을 지원한다.
먼저 execute 메소드에서 수동으로 형 변환하는 경우를 보자.
[CreateUser.java]
package action;
import java.text.SimpleDateFormat;
import java.util.Date;
import interceptor.UserServiceAware;
import model.Email;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class CreateUser extends ActionSupport implements UserServiceAware {
String name;
String age;
String birthday;
String email;
UserService userService;
@Override
public String execute() throws Exception {
// 형변환을 한다.
int realAge = Integer.parseInt(age);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date realBirthday = df.parse(birthday);
Email realEmail = Email.parse(email);
// 빈을 생성하고 형변환한 필드들을 빈에 세팅한다.
User user = new User();
user.setName(name);
user.setAge(realAge);
user.setBirthday(realBirthday);
user.setEmail(realEmail);
// 빈을 인자로 넣어서 비즈니스 메서드를 호출한다.
userService.createUser(user);
return SUCCESS;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public void setEmail(String email) {
this.email = email;
}
}
위에서는 execute() 메소드에서 일일이 수동으로 형 변환을 했다. 만약 form에서 넘어오는 데이터가 많다면 애로 사항이 있을 것이다. Struts2에서는 이렇게 형 변환이나 유효성 체크 등의 일은 별도로 하고 execute() 메소드에서는 형 변환된 원하는 데이터로 본질적인 기능에 충실하도록 지원한다.
아래의 Action을 보자.
package action;
import java.util.Date;
import interceptor.UserServiceAware;
import model.Email;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class CreateUser2 extends ActionSupport implements UserServiceAware {
/*
* 필드들이 적절한 타입으로 선언되어 있다.
*/
String name;
int age;
Date birthday;
Email email;
UserService userService;
@Override
public String execute() throws Exception {
User user = new User();
user.setName(name);
user.setAge(age); //내장 Converter에 의해 자동 형변환된다. (String -> int)
user.setBirthday(birthday);
user.setEmail(email);
userService.createUser(user);
return SUCCESS;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setEmail(Email email) {
this.email = email;
}
}
Action의 Property를 원하는 적절한 Type으로 선언하고 형변환은 자동으로 처리되도록 하고 있다. String을 int로 바꾸는 것은 내장된 형 변환 기능을 이용해서 처리하고 String을 Email로 바꾸는 것은 EmailConverter, Date Type으로 바꾸는 것은 DataConverter에서 처리한다.
이렇게 형 변환이 자동적으로 이루어진다면 도메인 오브젝트를 이용할 수 있는데 User의 age나 email은 String이 아닌 int, Email Type이다. ModelDriven 액션을 사용할 때 도메인 오브젝트인 user가 상단에 올라가므로 위 예제에서 Action의 Property에 형 변환 되는 것과 아래 예제에서 user의 Property가 자동 형 변환 되는 것은 동일한 동작 이다.
package action;
import interceptor.UserServiceAware;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
public class CreateUser3 extends ActionSupport implements ModelDriven, Preparable, UserServiceAware {
User user;
UserService userService;
public Object getModel() {
return user;
}
public void prepare() throws Exception {
user = new User();
}
@Override
public String execute() throws Exception {
userService.createUser(user);
return SUCCESS;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
[Email.java]
package model;
/**
* Created by IntelliJ IDEA. User: plightbo Date: Apr 11, 2005
*/
public class Email {
String username;
String domain;
public Email() {
}
public Email(String username, String domain) {
this.username = username;
this.domain = domain;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String toString() {
return username + '@' + domain;
}
public static Email parse(String email) {
Email e = new Email();
int at = email.indexOf('@');
if (at == -1) {
throw new IllegalArgumentException("Invalid email address");
}
e.setUsername(email.substring(0, at));
e.setDomain(email.substring(at + 1));
return e;
}
}
[User.java]
package model;
import java.util.Date;
public class User {
String name;
int age;
Date birthday;
Email email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Email getEmail() {
return email;
}
public void setEmail(Email email) {
this.email = email;
}
@Override
public String toString() {
return String.format("[User:name=%s,age=%s,birthday=%s,email=%s]", name, age, birthday,
email);
}
}