RegisterUser1 (redirect 연습)

package com.ch5.action;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import com.opensymphony.xwork2.Action;

public class RegisterUser1 implements Action{

    private String userId;
    
    @Override
    public String execute() throws Exception {
             
        return SUCCESS;
    }
    
    public String getUserId() {
        String id="";
        try {
            id =URLEncoder.encode(userId,"utf-8");
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return id;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }    
}



struts-ch5.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="ch5" namespace="/ch5" extends="struts-default">
         
        
        <!-- redirect -->
        <action name="register" class="com.ch5.action.RegisterUser1">
            <interceptor-ref name="params"/>
            <result name="success" type="redirect">registerSuccess.jsp?userId=${userId}</result>
        </action>
    </package>
</struts>




 registerForm1.jsp (redirect 연습)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chain 연습</title>
</head>
<body>
<form action="register.action" method="post">
id:<input type="text" name="userId"><br/>
<input type="submit" value="로그인">
</form>
</body>
</html>



                 registerSuccess.jsp (redirect 연습)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>redirect 연습</title>
</head>
<body>
<h1>${param.userId}님 환영합니다.</h1>
</body>
</html>




Chapter04.zip


redirectAction


redirectAction 리절트 타입의 동작 원리는 result 리절트 타입과 동일하다. result 리절트 타입은 리다이렉트할 URL을 지정하였지만, redirectAction 리절트 타입은 actionName 파라미터를 사용하여 리다이렉트 대상이 될 액션 이름을 지정한다.


<action name="UserRegAction" class="action.UserRegAction">
     <interceptor-ref name="params"/>
     <result name ="success" type="redirectAction">
       <param name="actionName">LoginAction</param>
       <param name="userId">${userId}</param>
       <param name="message">${message}</param>
     </result>
  </action>

<action name="LoginAction" class="action.LoginAction">
    <intercepter-ref name="params"/>
    <result name="success">/jsp/userRegSuccess.jsp</result>
 </action>




<global-results/>


액션 요청의 결과를 이한 result 요소는 action 요소의 자식 요소로 설정한다. 경우에 따라서는 여러개의 action 요소에 동일한 result 요소가 설정되는 경우가 있다.


로그인 페이지나 에러페이작 대표적인 예일것이다. 이런 페이지들이 여러 action 요소에 중복되어 설정되는 것을 피하기 위한  방법으로 global-result를 사용할수있다.


<package name="sample" extends="struts-default">
     <global-results>
          <result name="login">/jsp/login.jsp</result>
          <result name="error">/jsp/error.jsp</result>
     </global-results>
     
     <action name="sample" class"tutorial.SampleAction">
          <result name="success">/jsp/smple.jsp</result>
     </action>
</package>



sample 액션을 수행한후 리턴 코드 값으로 success 를 되돌리면 local result에 정의된 success result 에 의해 sample.jsp를 결과 페이지로 출력한다. 만일 sample 액션의 수행후 리턴 코드 값으로 login혹은 error를 되돌릴 경우에는 일차적으로 결과페이지 localresult에서 찾는다 localresult에서 찾지못하면 패키지 내 정의된 <global-results> 에서 찾는다.

dispatcher방식으로 action을 호출함



LoginAction (Chain 연습)

package com.ch5.action;

import com.opensymphony.xwork2.Action;

public class LoginAction implements Action{
    
    private String userId;
    private String message;
    
    @Override
    public String execute() throws Exception {
        message = (message==null ? "" : message) + userId + "로 로그인 했습니다.";
        return SUCCESS;
    }  

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}



                       RegisterUser (Chain 연습)

package com.ch5.action;

import com.opensymphony.xwork2.Action;

public class RegisterUser implements Action{

    private String userId;
    private String password;
    private String message;
         
    @Override
    public String execute() throws Exception {
        message = userId + "를 등록했습니다.";
        return SUCCESS;
    }
  
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getMessage() {
        return message;
    }

    public void setPassword(String password) {
        this.password = password;
    }    
}


struts-ch5.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="ch5" namespace="/ch5" extends="struts-default">
         
<!-- chain -->
        <action name="registerAndLogin" class="com.ch5.action.RegisterUser">
            <interceptor-ref name="params"/>
            <result name="success" type="chain">
                <param name="actionName">login</param>
                <param name="namespace">/ch5</param>
            </result>
        </action>
        <action name="login" class="com.ch5.action.LoginAction">
            <interceptor-ref name="chain"/>
            <interceptor-ref name="params"/>
            <result name="success" type="dispatcher">result.jsp</result>
        </action>

    </package>
</struts>


registerForm.jsp (Chain 연습)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chain 연습</title>
</head>
<body>
<form action="registerAndLogin.action" method="post">
id:<input type="text" name="userId"><br/>
비밀번호:<input type="password" name="password"><br/>
<input type="submit" value="로그인">
</form>
</body>
</html>



result.jsp (Chain 연습)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chain 연습</title>
</head>
<body>
${message}
</body>
</html>



                 userForm3.jsp (Chain 연습)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
<form action="createUser3.action" method="post">
    이름: <input type="text" name="name"><br/>
    나이: <input type="text" name="age"><br/>
    이메일: <input type="text" name="email"><br/>
    <input type="submit" value="전송">
</form>
</body>
</html>






Chapter04.zip



dispatcher 와 redirect 리절트 타입 : 전달된 데이터가 계속 전달되지 않고 페이지가 이동하는것이 특징


redirect 리절트 타입은 JSP에서 response.sendRedirect("...") 메소드를 호출한 것과 같은 효과를 낸다.

redirect 리절트 타입은 리다이렉트할 URL을 응답으로 웹 브라우저에 보낸다.

URL로 새롭게 서버와 연결이 되므로 request가 새롭게 생성되는 것을 의미한다. 웹브라우저에 나타나는 URL로 바뀐다.


dispatcher는 request가 유지된다. 서버와 새롭게 연결이 되는 것이 아니므로 처음 접속 했던 request 정보를 가지고 있다. 

dispatcher는 요청 처리를 다른 웹 리소스로 위임 하는 것이다 따라서 웹 브라우저에 요청 URL이 바뀌지 않는다. 


         <!-- dispatcher와 redirect 리절트 타입 -->
        <action name="LoginAction1" class="action.LoginAction">
            <interceptor-ref name="params"/>
            <result name="success" type="dispatcher">loginSuccess.jsp</result>
        </action>



=> URL이 바뀌지않고 이전페이지의 정보가 유지되어  userid와 message값이 출력되도록할수있다.

        

    <!-- redirect -->
        <action name="LoginAction2" class="action.LoginAction">
            <interceptor-ref name="params"/>
            <result name="success" type="redirect">loginSuccess.jsp</result>
        </action>


=> URL이  loginSuccess.jsp로 변경되고 이전 페이지의 정보가 유지되지 않아 실행결과 페이지에 userid와 message값이 출력되지않았다.

리절트의 타입의종류


체인리절트를 활용한 액션 체인 : 계속 다른 페이지로 데이터를 보낼수있다.


2개의 액션을 체인 리절트 활용하여 회원 등록 액션 처리 후 로그인 액션이 처리되도록 하자.

ex)


1. 최초 회원 가입 페이지를 출력할 액션인 UserRegForm.action

2. 회원가입 정보를 저장할 액션인 UserRegLoginAction.action

3. 로그인 정보를 조회할 액션인 LoginAction.action


UserRegForm.action => UserRegForm.jsp => UserRegLoginAction.action (UserRegLoginAction.java 의 execute()메소드):UserRegLoginAction는 jsp가없다.

          

                                        ====chain===> LoginAction.action (LoginAction.java의 execute()메소드) ===>

 userRegsuccess.jsp  


UserRegForm,LoginAction 2개의 액션을 체인리절트활용

 <!-- chain -->
        <action name="registerAndLogin" class="com.ch5.action.RegisterUser">
            <interceptor-ref name="params"/>           
<result name="success" type="chain">
                <param name="actionName">login</param>
                <param name="namespace">/ch5</param>
            </result>
        </action>

        <action name="login" class="com.ch5.action.LoginAction">      
      <interceptor-ref name="chain"/>
            <interceptor-ref name="params"/>
            <result name="success" type="dispatcher">result.jsp</result>
        </action>

   

'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 chain  (0) 2012.06.27
struts2 dispatcher 와 redirect 리절트 타입  (0) 2012.06.27
struts2 커스텀 인터페이스  (0) 2012.06.27
struts2 커스텀 인터셉터  (0) 2012.06.21
struts2 인터셉터란?  (0) 2012.06.21

struts-ch5.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="ch5" namespace="/ch5" extends="struts-default">
		<interceptors>
			<interceptor name="timer" class="com.ch5.interceptor.TimerInterceptor" />
			<interceptor name="userDao" class="com.ch5.interceptor.UserDaoInterceptor" />
		</interceptors>
		
		<!-- timer 인터셉터 활용 -->
		<action name="helloWorld" class="com.ch4.action.HelloWorld">
			<interceptor-ref name="timer" />
			<interceptor-ref name="logger" />
			<result name="success">/ch4/hello.jsp</result>
		</action>
		
		<!-- UserDaoInterceptor 활용 -->
		<action name="createUser3" class="com.ch5.action.CreateUser3">
			<interceptor-ref name="prepare" />
			<interceptor-ref name="modelDriven" />
			<interceptor-ref name="params" />
			<interceptor-ref name="userDao" />
			<result name="success">createSuccess.jsp</result>
		</action>
	</package>	
</struts>

com.ch5.interceptor/UserDaoAware

package com.ch5.interceptor;

import com.ch4.dao.UserDao;

public interface UserDaoAware {
	public void setUserDao(UserDao userDao);
}

com.ch5.interceptor/UserDaoInterceptor

package com.ch5.interceptor;

import com.ch4.dao.UserDao;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class UserDaoInterceptor implements Interceptor{

	UserDao userDao;
	int cnt;

	@Override
	public void init() {
		userDao = new UserDao();
		System.out.println("cnt = "+(++cnt));
	}
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Object action = invocation.getAction();
		if(action instanceof UserDaoAware){
			UserDaoAware userDaoAware = (UserDaoAware) action;
			userDaoAware.setUserDao(userDao);
		}
		return invocation.invoke();
	}

	@Override
	public void destroy() {
		userDao = null;
	}
}

com.ch5.action/CreateUser3

package com.ch5.action; import com.ch4.dao.UserDao; import com.ch4.domain.User; import com.ch5.interceptor.UserDaoAware; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; public class CreateUser3 implements Action,Preparable,ModelDriven,UserDaoAware{ User user; UserDao userDao; @Override public String execute() throws Exception { userDao.createUser(user); return SUCCESS; } @Override public void setUserDao(UserDao userDao) { this.userDao = userDao ; } @Override public Object getModel() { return user; } @Override public void prepare() throws Exception { user = new User(); } }

ch5/createSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
사용자를 추가했습니다.<br/>
${user}
</body>
</html>

ch5/userForm3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
<form action="createUser3.action" method="post">
	이름 : <input type="text" name="name"><br/>
	나이 : <input type="text" name="age"><br/>
	이메일 : <input type="text" name="email"><br/>
	<input type="submit" value="전송">
</form>
</body>
</html>

userDao -> init()메소드 동작이 되면서 intercept() 시작되면서 getAction을 받아오면서 CreateUser3.java를 불러온다

UserDaoAware로 if문으로 캐스팅 가능한지를 보고 불가능하면 빠져나간다


setUserDao가 있는게 확실하면 userDao를 셋팅 


다 완료시 execute() 실행한뒤 return SUCCESS를 하여 result부분에 진입 한뒤 jsp 실행 



실행시 콘솔창









struts-ch5.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="ch5" namespace="/ch5" extends="struts-default">
		<interceptors>
			<interceptor name="timer" class="com.ch5.interceptor.TimerInterceptor" />
		</interceptors>
		
		<!-- timer 인터셉터 활용 -->
		<action name="helloWorld" class="com.ch4.action.HelloWorld">
			<interceptor-ref name="timer" />
			<interceptor-ref name="logger" />
			<result name="success">/ch4/hello.jsp</result>
		</action>
	</package>	
</struts>
struts.xml
<include file="struts-ch5.xml" />
TimerInterceptor.java
package com.ch5.interceptor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class TimerInterceptor extends AbstractInterceptor{

	private static Log log = LogFactory.getLog(TimerInterceptor.class);

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//전처리
		long startTime = System.currentTimeMillis();

		//인터셉터 스택의 다음 인터셉터
		//또는 마지막 인터셉터라면 액션 실행
		String result = invocation.invoke();

		//후처리
		long executionTime = System.currentTimeMillis() - startTime;
		log.info("실행 시간 :"+executionTime+"ms");

		return result;
	}

}


기존에 있던 파일을 실행했습니다


여러개의 interceptor가 연결이 되어 있을때

전처리 후처리에 의해

invoke 메세지를 매번 호출하는것이 아니라

연속적으로 연결이 되어 있으면

연동이 되어 마지막에 단 한번만 호출이된다







인터셉터

액션의 호출을 동적으로 가로채는 객체로써 다양한 기능을 제공한다. 

1. action 의 메소드
2. ex) UserDao 객체를 생성하여 액션의 setUserDao() 에 넣어줄수있음

* 네임스페이스가 다르다면 명칭이 동일해도 문제없다. 하지만 같은 네임스페이스안에 동일한 명칭은 사용불가

인터셉터의 리턴코드

-ERROR : 액션 실행에 실패하여 에러 페이지로 돌아간다.

-INPUT :  입력값이 부족하거나 문제가있어 입력 페이지로 돌아간다.
-LOGIN :  로그인을 하지 않아서 액션을 실행 할수 없으므로 로그인 페이지로 돌아간다.
-NONE :  액션이 성공적으로 실행은 되었지만 화면을 보여주지 않는다.
-SUCCESS :  액션이 성공적으로 실행되어 결과화면을 사용자에게 보여준다.


인터셉터의 종류

params

- 폼에서 입력받은 값을 액션 객체에 전달하기 위해서 params 인터셉터에 대해서 살펴본다.




chaining

- 이전에 실행된 액션의 속성을 현재 액션에서 사용하도록 한다.많은 경우 이 인터셉터는 리절트 체인과 함께 사용된다.


- 주소가 안바뀌는 장점이있슴


createSession

- HTTP 세션을 자동으로 생성한다.


debugging 

-개발자에 따라 커스터 마이즈된 다양한 디버깅 화면을 제공한다.


exception

-액션 실행중에 발생한 예외 케이스에 대해 결과에 반영한다. 자동으로 예외 처리 핸들러에 리다이렉션 하도록한다.


fileUpload

-파일 업로드 기능을 지원하는 인터셉터이다.


i18n

- 사용자 세션에 따라서 선택된 지역화 설정을 유지한다.


store

-ValidationaAware 인터페이스를 구현함으로써 메시지를 저장하고 검색한다. 필드 에러나 액션에서 발생하는 에러메시지를 저장한다.


scoped Model-Driven

-ScopedModelDriven 인터페이스를 구현하는 액션을 위해서 특정 스코프에 해당하는 모델 객체를 저장하고 검색하는 기능이다.


scope

-세션 또는 애플리케이션 스코프에서 액션의 상태를 저장하고 검색한다.


servletConfig

-다양한 서블릿 기반 정보에 대해 접근하는 액션을 제공한다.


staticParams

-정적으로 정의된 값을 액션에 설정한다. 예를 들면 액션 설정시 param 태그를 사용하여 설정한 값들이 이에 해당한다.


roles

-현재 유저가 설정된 역할중 하나에 해당할 때에만 액션이 실행되도록한다.


token

-중복된 폼 전송을 방지하기 위해서 올바른 토큰을 가지고 있는지를 체크한다. 이러한 기능은 인터넷 웹 사이트에서 전자 결제를 구현할 때 많이 사용된다.  

  특히. 인터넷으로 결제 기능을 제공하는 경우 사용자가 결제 버튼을 두 번 누름으로써 신용카드 결제가 여러 번 이루어지는 경우가 종종 발생한다. 이를 방지하기 위해서 token인터셉터를 사용한다.


tokenSession

-토큰과 유사하다. 하지만. 올바르지 않은 토큰이 주어진 경우는 전송된 데이터를 세션에 저장한다.


vaildation

-액션에서 전달할 데이터를 검증하는 기능을 제공한다.


인터셉터 스택의 종류






struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
		<!-- Action 인터페이스 사용 및 유효성 검사 -->
		<action name="helloWorld4" class="com.ch4.action.HelloWorld4">
			<interceptor-ref name="params" />
			<result name="input">name4.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- ActionSupport 사용 및 유효성 검사 -->
		<action name="helloWorld5" class="com.ch4.action.HelloWorld5">
			<interceptor-ref name="params" />
			<interceptor-ref name="workflow" />
			<result name="input">name5.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- 도메인 오브젝트 사용1 -->
		<action name="createUser" class="com.ch4.action.CreateUser">
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
	</package>	
</struts>

userForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
<form action="createUser.action" method="post">
	이름 : <input type="text" name="name"><br/>
	나이 : <input type="text" name="age"><br/>
	이메일 : <input type="text" name="email"><br/>
	<input type="submit" value="전송">
</form>
</body>
</html>

createSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
사용자를 추가했습니다.<br/>
${user}
</body>
</html>

CreateUser.java
package com.ch4.action;

import com.ch4.dao.UserDao;
import com.ch4.domain.User;
import com.opensymphony.xwork2.Action;

public class CreateUser implements Action{

	//멤버변수
	private String name;
	private String age;
	private String email;
	
	@Override
	public String execute() throws Exception {
		//User 오브젝트 생성
		User user = new User();
		user.setName(name);
		user.setAge(age);
		user.setEmail(email);
		
		//Dao 생성
		UserDao userDao = new UserDao();
		userDao.createUser(user);
		
		return SUCCESS;
	}
	//setter
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

nterceptor가 낚아 챈다

CreateUser의 setter를 실행시켜서 

execute() 에 User 오브젝트를 생성한다








위에 방식은 java의 방식

이번 방식은 Struts2 만의 방식 

struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
		<!-- Action 인터페이스 사용 및 유효성 검사 -->
		<action name="helloWorld4" class="com.ch4.action.HelloWorld4">
			<interceptor-ref name="params" />
			<result name="input">name4.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- ActionSupport 사용 및 유효성 검사 -->
		<action name="helloWorld5" class="com.ch4.action.HelloWorld5">
			<interceptor-ref name="params" />
			<interceptor-ref name="workflow" />
			<result name="input">name5.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- 도메인 오브젝트 사용1 -->
		<action name="createUser" class="com.ch4.action.CreateUser">
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
		
		<!-- 도메인 오브젝트 사용2 -->
		<action name="createUser2" class="com.ch4.action.CreateUser2">
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
	</package>	
</struts>
userForm2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
<form action="createUser2.action" method="post">
	이름 : <input type="text" name="user.name"><br/>
	나이 : <input type="text" name="user.age"><br/>
	이메일 : <input type="text" name="user.email"><br/>
	<input type="submit" value="전송">
</form>
</body>
</html>

스트럿츠2의 방법


user.name

user.age

user.email


라고 쓰면 user를 자바빈으로 인식


코딩이 줄어들면서

위에와 동일한 일을 한다


하지만 이 방식은 권장 방식이 아니다 

-> 자바빈의 명칭이 바뀔 경우 다 뜯어 고쳐야된다(의존성이 높은 코드)


이러한 방식이 있다는것만 알아두자 








권장 방식


struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
		<!-- Action 인터페이스 사용 및 유효성 검사 -->
		<action name="helloWorld4" class="com.ch4.action.HelloWorld4">
			<interceptor-ref name="params" />
			<result name="input">name4.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- ActionSupport 사용 및 유효성 검사 -->
		<action name="helloWorld5" class="com.ch4.action.HelloWorld5">
			<interceptor-ref name="params" />
			<interceptor-ref name="workflow" />
			<result name="input">name5.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- 도메인 오브젝트 사용1 -->
		<action name="createUser" class="com.ch4.action.CreateUser">
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
		
		<!-- 도메인 오브젝트 사용2 -->
		<action name="createUser2" class="com.ch4.action.CreateUser2">
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
		<!-- 도메인 오브젝트 사용3 -->
		<!-- interceptor 순서를 반드시 지킬것 -->
		<action name="createUser3" class="com.ch4.action.CreateUser3">
			<interceptor-ref name="prepare" />
			<interceptor-ref name="modelDriven" />
			<interceptor-ref name="params" />
			<result name="success">createSuccess.jsp</result>
		</action>
	</package>	
</struts>
CreateUser3.java
package com.ch4.action;

import com.ch4.dao.UserDao;
import com.ch4.domain.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;

public class CreateUser3 implements Action,Preparable,ModelDriven{

	private User user;
	
	@Override
	public String execute() throws Exception {
		UserDao userDao = new UserDao();
		userDao.createUser(user);
		
		return SUCCESS;
	}
	//생성된 자바빈 객체에 params 인터셉터가 데이터를 저장할 수 있도록
	//value stack 상단에 자바빈 객체를 올려주는 역할 수행
	@Override
	public Object getModel() {
		return user;
	}
	//자바빈 객체 생성
	@Override
	public void prepare() throws Exception {
		user = new User();
	}

}
userForm3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
<form action="createUser3.action" method="post">
	이름 : <input type="text" name="name"><br/>
	나이 : <input type="text" name="age"><br/>
	이메일 : <input type="text" name="email"><br/>
	<input type="submit" value="전송">
</form>
</body>
</html>

interceptor가 2개가 늘어남
prepare -> CreateUser3.java prepare()를 동작 시킴

modelDriven -> getModel()를 동작시킴 

params -> 셋팅

xml에 명시할경우
위에 있는 순서를 지켜야된다






이 게시물 공통 사용 코드는

createSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>도메인 오브젝트 테스트</title>
</head>
<body>
사용자를 추가했습니다.<br/>
${user}
</body>
</html>


User.java

package com.ch4.domain;

public class User {
    private String name;
    private String age;
    private String email;
        
    public User() {
        System.out.println("User 인터페이스가 생성되었습니다.");
    }
    
    public String getName() {        
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", email=" + email + "]";
    }        
}



Chapter04.zip


'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 커스텀 인터셉터  (0) 2012.06.21
struts2 인터셉터란?  (0) 2012.06.21
struts2 ActionSupport를 사용하여 유효성 검사(Interceptor)  (0) 2012.06.21
struts2 유효성 검사  (0) 2012.06.21
struts2 include 사용  (0) 2012.06.21

extends ActionSupport를 해준뒤에


Override 및 Implements 자동완성으로 넣기



struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
		<!-- Action 인터페이스 사용 및 유효성 검사 -->
		<action name="helloWorld4" class="com.ch4.action.HelloWorld4">
			<interceptor-ref name="params" />
			<result name="input">name4.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
		
		<!-- ActionSupport 사용 및 유효성 검사 -->
		<action name="helloWorld5" class="com.ch4.action.HelloWorld5">
			<interceptor-ref name="params" />
			<interceptor-ref name="workflow" />
			<result name="input">name5.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
	</package>	
</struts>
HelloWorld5.java

package com.ch4.action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld5 extends ActionSupport{ private String name; private String message; @Override public void validate() { if(name == null || "".equals(name) || "World".equals(name)){ //유효성 검사 //addFieldError는 ActionSupport가 가지고 있는 메소드 addFieldError("name","이름이 없거나 'World'라는 이름은 사용할 수 없습니다."); } } @Override public String execute() throws Exception { message = "Hello!, "+name; return SUCCESS; } public String getMessage() { return message; } public void setName(String name) { this.name = name; } }

name5.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>데이터 전송</title>
</head>
<body>
<font color="blue">${fieldErrors.name}</font>
<form action="helloWorld5.action">
	<input type="text" name="name" value="${param.name}">
	<input type="submit" value="전송">
</form>
</body>
</html>






'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 인터셉터란?  (0) 2012.06.21
struts2 도메인 오브젝트  (0) 2012.06.21
struts2 유효성 검사  (0) 2012.06.21
struts2 include 사용  (0) 2012.06.21
struts2 와일드카드 디폴트  (0) 2012.06.21

struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
		<!-- Action 인터페이스 사용 및 유효성 검사 -->
		<action name="helloWorld4" class="com.ch4.action.HelloWorld4">
			<interceptor-ref name="params" />
			<result name="input">name4.jsp</result>
			<result name="success">hello.jsp</result>
		</action>
	</package>	
</struts>

name4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>데이터 전송</title>
</head>
<body>
<font color="red">${message}</font>
<form action="helloWorld4.action">
	<input type="text" name="name" value="${param.name}">
	<input type="submit" value="전송">
</form>
</body>
</html>

HelloWorld4.java

package com.ch4.action; import com.opensymphony.xwork2.Action; public class HelloWorld4 implements Action{ private String message; private String name; @Override public String execute() throws Exception { //유효성 검사 if(name == null || "".equals(name) || "World".equals(name)){ message = "이름이 없거나 'World'라는 이름을 쓸 수 없습니다."; return INPUT; } message = "Hello,"+name; return SUCCESS; } public String getMessage() { return message; } public void setName(String name) { this.name = name; } }

ActionSupport를 사용하는게 더 바람직하다

struts.xml

<include file="struts-ch4.xml" />

struts-ch4.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="ch4-4" namespace="/ch4" extends="struts-default">
		<!-- 데이터 전송 -->
		<action name="helloWorld3" class="com.ch4.action.HelloWorld3">
			<interceptor-ref name="params" />
				<result name="success">hello.jsp</result>
		</action>
	</package>	
</struts>

HelloWorld3.java

package com.ch4.action;

import com.opensymphony.xwork2.Action;

public class HelloWorld3 implements Action{

	private String message;
	private String name;
	
	//getMessage()역할은 request.setAttribute("message",message)
	public String getMessage() {
		return message;
	}
	//setName() 역할은 request.getParameter("name");
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String execute() throws Exception {
		message = "Hello, "+name;
		return SUCCESS;
	}

}

name3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>데이터 전송</title>
</head>
<body>
<form action="helloWorld3.action">
	<input type="text" name="name">
	<input type="submit" value="전송">
</form>
</body>
</html>


멤버변수와 form태그의 이름을 동일하게 해놓는다

struts.xml
<!-- 6.와일드카드 디폴트 -->
<package name="ch4-3" extends="struts-default">
	<action name="*">
		<result name="success">{1}.jsp</result>
	</action>
</package>
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>와일드카드 디폴트 사용</title>
</head>
<body>
와일드카드 디폴트를 이용해서 JSP 호출
</body>
</html>

*은 모든 단어를 의미함

 

단점

모든 요청을 다 흡수함

사용하려면 맨 밑에다 사용

(자주 사용하지 않는 방법임) 

 

(가급적이면 사용하지 않는것이 좋습니다) 






※존재하지 않는 페이지에 대한 처리


struts.xml

<!-- 5.Default Action지정 -->
	<package name="Hello" extends="struts-default">
		<default-action-ref name="someAction" />
			<action name="someAction">
				<result name="success">/some.jsp</result>
			</action>
	</package>
some.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>디폴트 액션 연습</title>
</head>
<body>
요청한 페이지를 찾을 수 없습니다.
</body>
</html>




Action페이지에 내용이 없을 경우에 사용하면 편리함 

 struts.xml
<!-- 4.ActionSupport를 이용한 jsp 호출-->
<package name="ch4-1" extends="struts-default">
	<action name="hello">
		<result name="success">hello.jsp</result>
	</action>
</package>
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ActionSupport를 이용한 JSP 호출</title>
</head>
<body>
액션이 없어도 JSP 호출할 수 있어요 ~~~
</body>
</html>




'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 와일드카드 디폴트  (0) 2012.06.21
struts2 default-action-ref (에러페이지)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20

+ Recent posts