struts2 Type Conversion
개요
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍
실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
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);
}
}
댓글 없음:
댓글 쓰기