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


struts.xml

<!-- 2.POJO 형태의 ACTION -->
	<package name="pojo" extends="struts-default">
		<action name="helloWorld02" class="tutorial.HelloWorld02">
			<result name="success">/helloWorld02.jsp</result>
		</action>
	</package>

HelloWorld02.java

package tutorial;

public class HelloWorld02 {
	private String message;
	
	//getMessage()역할은 request.setAttribute("message",message);
	public String getMessage(){
		return message;
	}
	
	public String execute() throws Exception{
		message = "POJO 형태의 액션 만들기";
		
		return "success";
	}
}

helloWorld02.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>POJO 형태의 액션 연습</title>
</head>
<body>
${message}
</body>
</html>

implements Action이 없으면

강요되는 부분이 없어서 에러날 확률이 있다

그냥 작동된다는것만 확인 하자




Struts2 : JSP보다 어렵지만 능률적


처음요청을받는 필터 FilterDispatcher
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>


struts.xml : 어플리케이션의 모든 제어에 대한 설정, 클래스 패스의 루트에 위치, 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">

     <!-- 기본연결 start -->

              <!-- helloWorld: 요청 url,  호출되는 class:dr.struts2.ch01.action.HelloWorld-->

       <action name="helloWorld" class="dr.struts2.ch01.action.HelloWorld">

               <!-- 출력되는 /hello.jsp -->

        <result name="success">/hello.jsp</result>

       </action>

   </package>

<!-- 기본연결 end -->

</struts>


P53

액션 클래스 작성 방법

1. POJO 형태로 작성 : 평범한 옛 자바 오브젝트 : 복잡해진 상속,구현 관계를 깨버리고  편의성 생산성을 회복하기위한 방법
2. Action 인터페이스로 구현하여 작성 : struts.xml에서 액션과 class를 맵핑 success같은 반환타입에따라 jsp선택이동 
3. ActionSupport 클래스를 확장하여 작성 :      

-ActionSupport 클래스는 Validateable 인터페이스의 validate() 메서드와, ValidationAware인터페이스의 addFieldError()메소드와 함께 사용하여 유효성을 검사하는 기능을 제공한다 . 

-액션을 Actionsupport클래스을 확장하여 유효성 검사







include 요소 설정 파일 관리하기 P70

여러개의 설정파일을 만들어서 나눠사용 가능

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

패키지(package)

패키지는 result-types, interceptors, action 등을 논리적인 단위로 그룹핑하는데 사용한다.

1) 패키지에 들어가는 엘리먼트 순서

result-types
interceptors
default-interceptor-ref
default-action-ref
global-results
global-exception-mappings
action

2) 패키지 속성
속성필수설명
name
(식별요소)
필수필수 속성. 패키지를 구분하는 키. 패키지의 name은 유일해야 함. 다른 패키지가 이 패키지를 상속할 때 이 이름을 사용한다.
extends
(다른패키지
상속할때)
선택다른 패키지를 상속하고자 할 때 다른 패키지의 name을 지정한다. 다른 패키지를 상속하면 그 패키지 내의 설정들을 그대로 이어 받는다. 상위 패키지의 설정을 다시 정의하면 그 설정을 오버라이드 하게 된다.
namespace

선택네임스페이스. 패키지 내의 액션들을 URL에 매핑할 때 이 네임스페이스가 URL의 중간 경로가 된다
abstract선택패키지를 추상 패키지로 만든다. 추상 패키지에는 액션 설정이 없다. 다른 패키지에 상속하는 용도


네임스페이스

/StrutsMain/helloWorld.action
/StrutsMain/ch04/helloWorld.action
           (네임 스페이스지정시 URL의 중간경로 , ch04 폴더:가상일수도 있고 만들어줄수도있음)

액션없이 설정만으로 jsp연결

루트네임 스페이스 : 네임 스페이스 사용안할시
명시적 루트네임스페이스 : namespace="/"

디폴트 네임스페이스 : 명시안하거나
extends="struts-default"
명시적으로 명시 namespace=""


많이 사용하는 방법
<!-- 3.네임스페이스 사용 -->
<!-- 4.ActionSupport를 이용한 jsp 호출 -->
<!-- 5. 디폴트 액션  -->


01 Action 인터페이스 이해하기

execute() 메소드 : 액션 클래스가 인스턴스화되면서 자동 호출되는 기본 액션 메소드
리턴 코드
리턴코드설명
ERROR액션 실행에 실패하여 에러 페이지로 돌아감
INPUT입력 값이 부족하거나 문제가 있어 입력 페이지로 돌아감
LOGIN로그인을 하지 않아서 액션을 실행할 수 없으므로 로그인 페이지로 돌아감
NONE액션이 성공적으로 실행은 되었지만 화면을 보여주지 않음
SUCCESS액션이 성공적으로 실행되어 결과 화면을 사용자에게 보여줌


생성자, getter,setter, toString



도메인 오브젝트 사용1,2,3



ActionSupport (prepare,medelDriven,params) 클래스에 대한 이해

-ActionSupport 클래스는 Validateable 인터페이스의 validate() 메서드와, ValidationAware인터페이스의 addFieldError()메소드와 함께 사용하여유효성을 검사하는 기능을 제공한다 . 

-액션을 Actionsupport클래스을 확장하여 유효성 검사


ModelDriven

 - 도메인 오브젝트에 접근하기 위한 방법으로 ModelDriven 액션을 사용하는 방법이 있다. 

 - ModelDriven 액션 클래스를 생성하기 위해서는 ModelDriven 인터페이스를 구현해야 한다. 

 - ModelDriven 인터페이스를 API document에서 찾아보도록 한다.


class: 인터페이스를 구현한 클래스에서는 추상메소드를 오버라이딩해서 구현


@Override

public Object getModel(){

  return user; : 생성된 객체를  value stack 상단에 올림

}


struts.xml:

<interceptor-ref name="modelDriven"/>


userRegForm3.jsp: 

<input type="text" name="userId">



Preparable


 - Preparable 인터페이스는 액션의 메소드 execute를 실행하기 전에 다른 로직을 실행하고 싶을때 사용한다. 

 - Preparable인터페이스 API document에서 찾아보도록한다


class: 인터페이스를 구현한 클래스에서는 추상메소드를 오버라이딩해서 구현


@Override

public void bprepare() thorws Exception{

   user=new User(); :객체를 생성

}


struts.xml:

<interceptor-ref name="prepare"/>



유효성검사


extends ActionSupport


@Override

public void validate()


<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>


====================================프로젝트========================================
Java Resources
           src
                 com.ch4.action
                       CreateUser (도메인 오브젝트 사용1) : JSP적 
                       CreateUser2 (도메인 오브젝트 사용2) : Struts2 user.프로퍼티
                       CreateUser3 (도메인 오브젝트 사용3)
                       HelloWorld (네임스페이스)
                       HelloWorld3 (파라미터값을 전달받는 예제)
                       HelloWorld4 (유효성체크)
                       HelloWorld5 (ActionSupport 상속 유효성 체크)

                 com.ch4.dao
                       UserDao (도메인 오브젝트 사용1)

                 com.ch4.domain
                       User (도메인 오브젝트 사용1)  

                 com.ch5.interceptor
                       TimerInterceptor (커스텀 인터셉터)

                 tutorial
                       HelloWorld (첫예제)
                       HelloWorld02 (POJO 형태)
                 struts-ch5.xml
                 struts-ch4.xml 
                 struts.xml (include 할것)

WebContent
         ch4
                 createSuccess.jsp (도메인 오브젝트 사용1,2,3)
                 hello.jsp (네임스페이스)
                 name3.jsp (파라미터값을 전달받는 예제)
                 name4.jsp (유효성체크)
                 name5.jsp (ActionSupport 상속 유효성 체크)
                 userForm.jsp (도메인 오브젝트 사용1): JSP적 
                 userForm2.jsp (도메인 오브젝트 사용2) : Struts2 user.프로퍼티
                 userForm3.jsp (도메인 오브젝트 사용3)

         WEB-INF
                 web.xml
         a.jsp (와일드 카드를 사용해서 출력하기)
         hello.jsp (액션없이 action출력하기)
         helloWorld.jsp (첫예제)
         helloWorld02.jsp (POJO 형태)
         index.html
         some.jsp (디폴트 액션 연습 500에러)

====================================프로젝트========================================


====================================코드========================================
Java Resources
           src
                 com.ch4.action
                       CreateUser (도메인 오브젝트 사용1) : JSP적

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

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 설정  (0) 2012.06.20
struts2 란?  (0) 2012.06.20
HelloWorld
package tutorial;

import com.opensymphony.xwork2.Action;

public class HelloWorld  implements Action{

    private String message;
    
    public String getMessage(){
        return message;
    }
    
    @Override
    public String execute() throws Exception {
        
        message ="Hello, World";
        
        return SUCCESS;
    }
}

struts.xml
<!--?xml version="1.0" encoding="UTF-8" ?-->


<struts>
    <!-- 1.기본연결 -->
    <package name="tutorial" extends="struts-default">
        <action name="helloWorld" class="tutorial.HelloWorld">
            <result name="success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>

web.xml
<!--?xml version="1.0" encoding="UTF-8"?-->
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>struts2Main</display-name>
    <!-- 스트럿츠는 필터가 서블릿보다 먼저 동작하여 요청을 받는다  -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        <init-param>
            <param-name>struts.i18n.encoding</param-name>
            <param-value>utf-8</param-value>
           </init-param> 
    </filter>
    
    <!-- 모든요청을 필터가 받는다. -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>
helloWorld.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>
${message}
</body>
</html>



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

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 설정  (0) 2012.06.20
struts2 란?  (0) 2012.06.20

work_struts


새프로젝트 만들기 


톰켓서버설정














인코딩정보 4군대













struts import 하기















요소역할비고
필터URL의 확장자가 action이면 FilterDispatcher에 의해서 액션을 실행하기 위한 환경을 구축하도록 한다.web.xml
액션리절트가 필요로 하는 메시지를 제공한다.HelloStruts.java
매핑액션실행 후 결과를 처리할 리절트와의 매핑을 설정한다.struts.xml
리절트메시지를 출력하기 위한 화면 처리를 담당한다.helloStruts.jsp



 web.xml : 웹 어플리케이션 Deployment Descriptor(DD), Struts2 필터 등록

<!-- Struts2 dispatcher start -->

 <filter>

                 <filter-name>struts2</filter-name>

                 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

                 <init-param>

                          <param-name>struts.i18n.encoding</param-name>

                          <param-value>utf-8</param-value>

                 </init-param>

        </filter>

        <filter-mapping>

                 <filter-name>struts2</filter-name>

                 <url-pattern>*.action</url-pattern>

        </filter-mapping>

        <!-- Struts2 dispatcher end -->



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

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 란?  (0) 2012.06.20



프레임워크은 ‘핵심적인 클래스와 인터페이스, 정보파일(XML)을 미리 모아놓은 집합 또는 라이브러리’라고 할 수 있다. 

1) 스트럿츠 프레임워크는 Jakarta프로젝트에서 개발, 오픈 소스의 웹 어플리케이션 프레임워크.
2) 스트럿츠는 MVC 패턴의 프레임워크.
3) 스트럿츠2는 스트럿츠와 웹워크가 결합한 형태

4) 다운로드와 설치 : http://struts.apache.org 에 접속 최신 버전 다운로드




<스트럿츠2의 특징>

1) 완전히 새로운 프레임워크. 
    스트럿츠1 때와는 다른 웹워크의 MVC 아키텍처 채용
2)  직관적인 개발. 
    POJO 기반 액션(Action)
3)  Zero Configuration 지향. 
    기본 값 지원으로 많은 설정 생략 가능. 
    어노테이션 사용으로 설정 파일에서 설정 생략
4)  신속한 리로딩. 
    변경된 환경 설정 파일의 내용을 웹 컨테이너 재시작 없이 리로드
5) POJO 액션, POJO 폼
   프레임워크에 종속되지 않음
6) 손쉬운 Ajax(Asynchronous Javascript And XML)구현
    Dojo 프레임워크 포함
    Ajax 테마 지원 태그
7)  다양한 표현식 언어 EL(Expression Language) 지원
     JSTL 사용 가능
     OGNL(Object Graph Navigation Language) 지원
8)  다양한 리절트 타입의 지원 및 프로파일링
     JSP 외의 프리마터(Freemarker), 밸로시티(Velocity) 등의 사용 가능




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

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 설정  (0) 2012.06.20

+ Recent posts