struts.xml



위 설정을 기준으로 아래 예제를 보겠음.


첫 번째 - 액션속성만 줄때.

<s:submit value="간편한 리다이렉트 " action="test"/> 



먼저  서브밋 버튼에 action 이 지정된 버튼을 꾹 누르면

리다이렉션 된다. 여기서 중요한게 액션을 다시 실행시키기 때문에

struts.xml 에 매핑되어있는 기본설정이 메소드를 'margo'로 지정되있기 때문에

TestAction 클래스의 margo() 메소드를 실행시키게 된다.




두 번째 - 액션속성과 메소드속성

<s:submit value="간편한 리다이렉트 " action="test" method="execute"/>


위 버튼을 누르게 되면 test 액션으로 매핑된 액션클래스로 리다이렉트 되는데

메소드는 지정한것처럼 execute() 메소드가 실행된다.
 



위 예제들에서 보듯이 struts.xml 에 지정된 속성을 기본으로 

하나의 form 안에서 여러 submit 버튼을 여러 방법으로 지정할 수 있기 때문에

JavaScript 대신 편하게 쓸수있다.

위 submit 속성들만 이용하면 쉽게 액션을 지정할 수 있겠다. 












YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


 Struts 2 태그

struts 2 태그를 사용하기 위해서는 jsp 페이지에 다음과 같이 taglib를 선언해야 한다.

 

<%@ taglib prefix="s" uri="/struts-tags" %>

 

 

[0] request.getParameter()  request.getAttribute()session.getAttribute()

 

<s:property value="#parameters.변수명" /> => request.getParameter() 

<s:property value="#request.변수명"> => request.getAttribute() 
<s:property value="#session.변수명"> => session.getAttribute()

 

 

[1]OGNL(Object Graph Navigation Language)

OGNL은 자바 객체의 프로퍼티 값을 얻거나 저장하기 위하여 자바 빈들 상의 프로퍼티들을 추적하는 표현식을 다룰 수 있게 한다.

 

또한 OGNL은 정적 메서드 또는 인스턴스 메서드를 실행하고, 컬렉션 타입의 데이터 또한 사용할 수 있도록 Lambda 표현식과 같은 진보된 표현식을 제공한다. 또한 OGNL은 XWork 내에서 확장된 풍부한 타입 변환 모델을 제공한다. 또한 OGNL 언어의 기본은 단순하며, 빈의 프로퍼티는 프로퍼티 이름으로 엑세스 된다.

 

■ 태그의 value속성은 객체를 의미한다

<s:textfield name="id" value="seoul"/> 또는

<s:textfield name="id" value="${seoul}"/>

 

이라고 하면 value 속성의 seoul은 문자가 아닌 getSeoul() 메서드 호출의 의미가 된다. 따라서 문자 seoul을 의미하고 싶다면

 

<s:textfield name="id" value="'seoul'"/>또는

<s:textfield name="id" value="{'seoul'}"/>

 

라고 표현해야 한다.

 

■ # 사용(외부 참조)

스트럿츠2는 OGNL표현식을 사용하기위해 최상위 컨텍스트 맵를 사용한다. 이 컨텍스트 맵에는 어플리케이션, 세션, ValueStack(루트), request, 파라미터 등의 객체가 저장되고 여기서 액션은 ValueStack 즉 루트 객체에 있기 때문에 루트 객체에서는 #없이 프로퍼티를 참조할 수 있다. 그러나 다른 객체 예를 들어 session 객체의 프로퍼티를 참조하려면 #을 사용해야한다.

 

<s:property value="#session.myid"/> 또는

<s:property value="#session['myid']"/>

 

예) OGNL을 사용해서 요청 파라미터, 요청, 세션을 참조 하는 법

#parameters['key'] or #parameters.key

-> request.getParameter("key") 의 반환 값과 동일

 

#request['key'] or #requuest.key

-> request.getAttribute("key")의 반환 값과 동일

 

#session['key'] or #session.key

-> session.getAttribute("key")의 반환 값과 동일

 

■ collections 객체(map, list, set) 사용 시 OGNL

<s:select name="name" list="{'aa','bb','cc'}" value="%{'bb'}"/>

 

이것은 문자열 aa,bb,cc 를 포함하는 리스트를 생성하고 기본값으로 bb를 사용한다는 의미 이다.

 

<s:select name="name" list="#{'key1':'aa','key2':'bb','key3':'cc'}"/>

 

이것은 key1 라는 키 값에 aa라는 value 값을 저장 한다는 의미 이다.

 

 

[2] 컨트롤 태그(일반)

■ if , else , elseif

⋅ 의미

 기본적 if구문

⋅ 사용 예

 <s:if test="a==1">a는 1이다

 </s:if>

 

<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>

 

- elseif 태그

<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>

 

- else 태그

<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>

 

if 에서 parameter 값으로 status 변수가 넘어왔을 경우(#parameters.status) 처리

<s:if test="#parameters.status[0] == 'invalid' ">

     invalid process

</s:if>

 또는

<s:set name="status"><s:property value="#parameters.status" /></s:set>

<s:property value="%{status}" /> <!-- 출력 -->

<s:if test="%{#status=='invalid'}">

    invalid process

</s:if>

또는

<s:set name="status"><s:property value="#parameters.status" /></s:set>

<s:property value="#status" /> <!-- 출력 -->

<s:if test="#status=='invalid'">

    invalid process

</s:if>

 

■ append

⋅ 의미

 여러 리스트를 하나의 iterator로 묶어줌(첫 번째 리스트에 두 번째 리스트가 합쳐진 형태)

⋅ 사용 예

<s:append id = "totalList">

<s:param value="%{list1}"/>

<s:param value="%{list2}"/>

</s:append>

 

<s:iterator value="%{totalList}">

<s:property/>

</s:iterator>

 

■ generator

⋅ 의미

val 속성 값으로

iterator를 생성

⋅ 속성

separator : 구분자

count : 최대 요소 수

⋅ 사용 예

<s:generator separator=","val="%{'aaa,bbb,cc,dd'} count="3">

<s:iterator>

<s:property/>

</s:iterator>

</s:generator>

cf) 결과 : aaa,bbb,ccc

 

■ merge

⋅ 의미

여러 리스트를 하나의 iterator로 묶음(첫 번째 리스트의 첫 번째 아이템, 두 번째 리스트의 두 번째 아이템, 다시 첫 번째 리스트의 두 번째 아이템 순서로 합쳐짐)

⋅ 사용 예

<s:merge id= "totalList">

<s:param value="%{lsit1}"/>

<s:param value="%{list2}"/>

</s:merage>

 

<s:iterator value="%{totalList}">

<s:property />

</s:iterator>

 

■ sort

⋅ 의미

  태그속성으로 설정되는 comparator를 사용하여 목록을 정렬하는 태그. 예를 들어 list 에 {b,a,c}를 저장하고 comparator를 사용 정열하면 {a,b,c}가 됨

⋅ 사용 예

<s:sort comparator="myComparator" source ="list">

<s:iterator>

<s:property/>

</s:itertator>

</s:sort>

 

■ subset

⋅ 의미

iterator의 서브셋을 취하는 태그

⋅ 속성

count : subset iterater에 담을 요소의 수

start : 시작 인덱스 값(0부터)

decider : 메서드 사용 시 메서드 명

⋅ 사용 예

<s:subset source="list" count="3" start ="3">

<s:iterator>

<s:property/>

</s:iterator>

</s:subset> 

 

[3] 데이터 태그 (일반)

■ a

⋅ 의미

HTML 의 <a href =""/>

⋅ 사용 예

<s:url id="test" action="link">

</s:url> 

<s:a href="${test}">링크</s:a>

 

■ action

⋅ 의미

jsp에서 직접 액션을 호출

⋅ 속성

executeResult : 리절트 실행여부 

⋅ 사용 예

<s:action name="action1" executeResult="true"/>

 

■ bean

⋅ 의미

자바빈 규정에 따라 클래스를 인스턴스화

 ⋅ 사용 예

<s:bean name="com.bean.User" id="user">

<s:param name="first" value="'a'"/>

<s:param name="last" value="'b'"/>

first : <s:property value="first"/>

last : <s:property value="last"/>

</s:bean>

<br/>

first :<s:property value="#user.first"/>

last : <s:property value="#user.last"/>

 

■ date

⋅ 의미

date형식 가져오기

⋅ 사용 예

<s:date name="currDate" format="yyyy-MM-dd hh:mm:ss"/>

 

■ debug

 ⋅ 의미

debug 하이퍼 링크를 출력. 링크를 클릭하면 ValueStack의 내용과 스택 컨텍스트 내용을 출력

⋅ 사용 예

<s:debug/>

 

■ i18n

⋅ 의미

리소스 번들을 얻고 그 내용을 벨류 스택에 저장한다(미리 리소스 번들에 "abc= 가나다" 라고 만들어 둠)- 국제화

⋅ 사용 예

<s:i18n name="example.i18n.myBundle">

리소스 번들예제

<s:text name= "abc"/>

</s:i18n>

 

■ include

⋅ 의미

jsp include 역활

⋅ 사용 예

<s:include value="includeTag1.jsp">

<s:param name="a" value="'abc'"/>

</s:indclude> 

 

■ param

⋅ 의미

파리미터로 사용

⋅ 사용 예

<s:param name="a" value="'a'"/>

<s:param name="a">a</s:param>

 

■ push

⋅ 의미

ValueStack 안에 값을 저장 한다

⋅ 사용 예

<s:push value= "user">

first:<s:property value="first"/>

se<s:property value="se"/>

</s:push>

 

■ set

⋅ 의미

특정 스코프의 변수에 값을 할당

⋅ 사용 예

<s:set name="a" value="user.first" scope="session"/>

<s:porperty value="#a"/>

 

■ ext

⋅ 의미

i18n 텍스트 메시지를 렌더링

 

■ url

⋅ 의미

url 생성. param 태그 사용가능

⋅ 사용 예

<s:url id="a" value="/jsp/a.jsp">

<s:param name="id" value="'a23'"/>

</s:url>

 

■ propery

⋅ 의미

프로퍼티값을 출력. value값을 지정안하면 ValueStack의 맨 위의 값을 취함

  1. default (String) -  값이 널일때 기본값으로 사용할것이 있는지 정함 스트링형
  2. escape (Boolean) - HTML형식으로 보여줄지 정함 기본값은 true
  3. value (Object) - 값을 보여줌 obejct타입

⋅ 사용 예

<s:property value="a"/>

<s:property />

 

[4] 폼 태그 (사용자)

■ checkbox

⋅ 의미

html checkbox로 랜더링

⋅ 사용 예

<s:checkbox name="a" value="%{aa}"/>aa

<s:checkbox name="b" value="%{bb}"/>bb

 

■ checkboxlist

⋅ 의미

list를  체크박스 시리즈로  생성

⋅ 사용 예

<s:checkboxlist name="check1" list="list1"/>

 

■ combobox

⋅ 의미

html  text와 select를 그룹으로 제공

⋅ 사용 예

<s:combobox name="checkedFruit" list="{'apple','grape','orange'}"/>

<s:combobox name="checkedFlower" list="%{#{'1':'rose','2':'cosmos','3':'lily'}}"/>

<s:combobox name="checkedTraffic" list="mapTraffics"/>

 

■ datetimepicker

⋅ 의미

 datetimepicker 요소를 렌더링(달력 출력). 헤드에 ajax 설정

⋅ 사용 예

<head>

<s:head theme="ajax">

</head>

<s:datetimepicker name="birthday"/>

 

■ doubleselect

⋅ 의미

첫 번째 리스트 선택에 따라 두 번째 리스트 내용이 선택 되어 나온다.

⋅ 사용 예

<s:doubleselect name="list1" list="{'1",'2'}" doubleName="list2"

doubleList="%{top=='1'? {'a','b'}:{'가','나'}}"/>

 

■ head

⋅ 의미

head 섹션의 부분을 렌더링한다.

 ⋅ 사용 예

 <s:head theme="ajax"/>

 

■ file

⋅ 의미

html file요소

⋅ 사용 예

<s:file name="upload"/>

 

■ form

⋅ 의미

html form 요소

⋅ 사용 예

<s:form action="admin" theme="simple">

</s:form>

 

■ hidden

⋅ 의미

html hidden

⋅ 사용 예

<s:hidden name="property" value="some"/>

 

■ label

⋅ 의미

html label

⋅ 사용 예

<s:label>예제 </s:lable>

 

■ optontransferselect

⋅ 의미

2개의 select 컴포넌트 사이에 option을 이동할 수 있는 컴포넌트를 생성

⋅ 사용 예

<s:head theme="ajax"/> 

<s:optiontransferselect headerKey="" headerValue="--please select--" emptyOption="true"

leftTitle="Fruit" rightTilte="Car" name="checkedList" list="listFruit" doubleHeaderKey=""

doubleHeaderValue="--please select--" doubleEmptyOption="true"

doubleName="checkedList2" doubleList="listCar"/>

 

■ optgroup

⋅ 의미

select 태그 내에 삽입할 optgroup 컴포넌트를 생성

⋅ 사용 예

<s:head theme="ajax" />

<s:form theme="ajax"><s:select label="my selection" name="myselection"

value="{%{'popeye'}}" list="%{#{'sup':'sub','sp':'sp' }}"><s:optgroup label="'adult"

list="%{#{'sou':'sou'}}"/><s:optgroup label="fruit"

list="%{#{'o':'orange','a':'apple' }}"/></s:select></s:form>

 

■ password

⋅ 의미

 html password

⋅ 사용 예

<s:password name="pass" size="10" maxlength="15"/>

 

■ reset

⋅ 의미

reset 버튼

⋅ 사용 예

<s:reset value="reset"/>

 

■ select

⋅ 의미

html select

⋅ 사용 예

<s:select headerKey="" headerValue="선택" name="check1" list="list1" listKey="id"

listValue="name"/>

 

■ submit

⋅ 의미

submit 버튼

⋅ 사용 예

<s:submit />

⋅ method 접두어

Action class에 execute() 메서드와 cancel() 메서드가 존재 하는 경우 jsp에서,

 

<s:form action="actionname" theme="simple">

<s:textfield name="name"/>

<s:submit value ="전송"/>

<s:submit name="method:cancel" value="취소"/>

</s:form>

 

이런 경우 두 submit 버튼에 각각 execute() 와 cancel() 메서드를 바로 호출해서 쓸 수 있다.

 

⋅ action 접두어

만약 cancel submit에 다른 액션(goaction 이라고 가정)의 메서드를 호출하고자 한다면

 

<s:form action="actionname" theme="simple">

<s:textfield name="name"/>

<s:submit value ="전송"/>

<s:submit name="action:goaction" value="취소"/>

</s:form>

 

이런 경우 goaction 의 execute() 메서드가 호출 된다

 

⋅ redirect 접두어

<s:form action="actionname" theme="simple">

<s:textfield name="name"/>

<s:submit value ="전송"/>

<s:submit name="redirect:www.google.com" value="취소"/>

</s:form>

 

이렇게 하면 내부적으로 ServeltRedirectResult를 사용하여 www.google.com으로 리다이렉트 된다.

 

■ textarea

⋅ 의미

html textarea

⋅ 사용 예

<s:textarea name="test" theme="simple" cols="90"/>

 

■ textfield

⋅ 의미

html text 

⋅ 사용 예

<s:textfield name="test"/>

 

■ token

⋅ 의미

폼의 이중 submit 방지(더블클릭 등)

⋅ 사용 예

<s:token/>

<s:submit/>

 

■ updownselect

⋅ 의미

셀렉트박스의 요소를 위, 아래로 이동할수 있는 버튼을 가진 select 컴포넌트를 생성

⋅ 사용 예

<s:updownselect headerKey="" headerValue="선택" name="check" list="list1" listKey="id"

listValue="name" moveDownLabel="move down" moveUpLabel="move up"

selectAllLabel="select all"/>

 

[5] non 폼 태그 (사용자)

넌폼 태그(Non-Form Tag)는 폼에 종속되지 않고 단독으로 처리할 수 있는 태그들로 구성 되며, 비동기적인 비즈니스 로직을 수행할 수 있는 Ajax 기능을 포함한 태그들이 포함 하고 있다.

 

예를 들면, <s:div/>, <s:tabbedPanel/>, <s:tree/> 등을 대표로 들 수 있다. 일반적인 웹 애플리케이션에서 Ajax를 구현하기 위하여 XmlHttpRequest를 처리하기 위한 자바스크립트 코드가 필요하고, 서버 측에서 클라이언트로 비즈니스 데이터를 XML로 변환하여 전송해야하며 전송된 XML데이터를 DHTML을 이용하여 동적으로 컴포넌트를 구성해야 한다 하며, XML 데이터를 한다.

 

그러나 스트럿츠 2 프레임워크에서 제공하는 ajax 테마와 몇 몇 태그들을 이용하면 스트럿츠 2의 다른 개발과 동일한 방식으로 JSP와 Action 클래스, 비즈니스 로직을 구현하면서도 이를 가능하게 해주는 매우 강력한 기능을 제공한다.

 

■ actionerror

⋅ 의미

액션에 오류가 있으면 actionerror를 렌더링. 액션클래스에 『addActionError("에러메시지");』설정

⋅ 사용 예

<s:actionerror />

 

■ actionmessage

⋅ 의미

actionerror와 같이 사용

⋅ 사용 예

<s:actionmessage/>

 

■ component

특정 템플릿을 사용하는 커스텀 ui 위젯을 렌더링 한다.

 

■ div

ajax 테마를 사용할 때 div 태그는 전체 페이지를 갱신하지 않고 해당 내용을 갱신하기 위하여 현재 페이지로부터 원격호출을 제공한다.

 

■ fielderrror

필드에러 렌더링

 

■ table

모델링 테이블을 렌더링하기 위한 태그

 

■ tablePanel

tabbedpanel 위젯은 AJAX 컴포넌트이다. 각 탭은 로컬 또는 리모트 컨텐츠가 될 수 있다 (사용자가 탭을 선택할 때 갱신된다 )

 

■ tree

AJAX를 지원하는 트리 위젯을 렌더링 한다.

 

 

■ treenode

AJAX를 지원하는 트리 위젯 안의 트리 노드를 렌더링 한다

 

 

===============================================================================================================

복사http://blog.naver.com/tyboss/70047271376

[출처] Struts 2 Tag taglib 스트러츠2|작성자 마루아라

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 2012.12.11 11:14  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다




RedirectAction 접두어는 Action접두어와는 달리 그 액션의 execute() 메소드를 실행시키는게 아니라

struts.xml 에 정의되어 있는 형식대로

test 라는 액션을 리다이렉트 한다.

중요한것은 Action 접두어는 execute() 를 실행시키는것이고,

RedirectAction 접두어는 액션 자체를 리다이렉트 시키는것이다.

<s:submit value="RedirectAction 접두어" name="redirectAction:test"/>

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


여러 패키지를 설정하고 네임스페이스를 이용해서, 같은 컨텍스트주소아래
네임스페이스별로 같은 액션을 쓸 수있다.

단, 패키지 네임과 네임스페이스는 모두 달라야 한다.





기본 패키지 형태

기본 네임스페이스는 "" 빈 문자열이다. 기본 네임스페이스는 모든 것을 다 잡아낼 필요가 있을 때 사용된다.
액션을 특정 네임스페이스에서 찾을 수 없다면 기본 네임스페이스를 찾는다.


      
       

        







루트 네임스페이스

루트 네임스페이스는 "/" 이다. 루트는 컨텍스트 경로 바로 밑의 요청을 받았을 때의 네임스페이스이다.
만약 로컬 액션을 찾을 수 없다면 기본 네임스페이스에서 찾게 된다.










네임 스페이스 지정

자신이 네임스페이스를 지정할때는 "/네임스페이스" 이다.
브라우저에서 요청하는 형식은 "컨텍스트주소/네임스페이스/액션네임"   형식이다.



YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. Mr.No 2011.07.26 10:39 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하십니까?

    무플 방지 위원회에서 나왔습니다.




스트럿츠2에서 파일을 다운로드하기 위해 몇 가지 미리 알아야 할 것이 있다.
다운로드를 위해 스트럿츠2는 "stream"방식의 리절트 타입을 사용한다. 

"stream" 리절트 타입을 사용해 서버에 존재하는 텍스트 파일, XML 파일을 다운로드하고
그 내용을 화면에 출력하거나 디스크 상에 저장하는 방법을 제공한다.

다운로드 기능을 구현하기 위해 다운로드 액션 클래스를 정의하고, 액션 클래의 필수 또는 옵션 프로퍼티를 정의해야 한다.
또한 이렇게 정의된 프로퍼티에 매핑하는 리절트의 파라미터를 정의하는 방법을 알아야 한다. 

 
다운로드 액션 클래스에서 매핑되어야 할 프로퍼티

private String localFileName;
private String serverFileName;	
private String contentDisposition;
private InputStream duck;
private long contentLength;


위코드와 매핑될 Struts.xml 파일에는 아래와 같이 코딩되야한다.

		
	

		${contentType} 
		${contentLength}
		${contentDisposition}
		duck
		${4096}
	
	

</param> 이 왜 출력이 안되는지 ;; 어쨋든 저뒤에 다있음. 닫아줘야함.


위 두 코드를 작성하고나면 이제 뷰페이지에서 다운로드할 파일을 클릭하면
스트럿츠에서 그 액션을 받아서 액션클래스로 연결시켜서 다운로드를 할수있게 된다.

뷰페이지에서는 대충 그냥 만든다.

		
				

			


itemBean.fileName에서 꺼낸 파일이름으로 링크가 달려서
그 링크를 클릭하게되면 url id ="download" 이름으로 달려있는 액션 "download"액션이 실행된다.


여기 까지의 동작을 정리해보면

1. 톰캣이 로딩되면서, struts.xml 파일을 읽어들여서
   다운로드에 대한 설정을 하게되고,

2. 다운로드할 파일에 액션링크가 걸리게되고,

3. 클릭하는순간 url 에 정의된 액션으로 실제 파일이름이 파라미터로 전달되면서

4. 액션클래스가 실행된다. 


이제 액션 클래스를 보자.
public class FileDownloadAction extends ActionSupport{
	
	private String localFileName;
	private String serverFileName;	
	private String contentDisposition;
	private InputStream duck;
	private long contentLength;
	
	
	public String execute() throws Exception{
		
		String basePath = getText("path");
		String fullPath = basePath + "\\" + localFileName;
		System.out.println("FileDownloadAction -> fullPath : " + fullPath);
		
		
		//contentLength
		File file = new File(fullPath);
		this.setContentLength(file.length());
		
		
		//contentDisposition
		//this.setContentDisposition("attachment; filename="
		//		+ URLEncoder.encode(localFileName, Constants.CHARSET));
		//this.setContentDisposition("attachment; filename="
		//		+ localFileName);
		this.setContentDisposition("attachment; filename="
				+ new String(localFileName.getBytes("euc-kr"),"8859_1"));
		


		System.out.println("FileDownloadAction -> ContentDisposition : " + getContentDisposition());
		
		
		//inputStream
		//this.setDuck(ServletActionContext.getServletContext().getResourceAsStream(fullPath));
		this.setDuck(new FileInputStream(fullPath));
		return "success";
	
		
	} // execute() end;

위 코드중에 주석이 덕지덕지 붙은 코드가 있는데 저코드가, 한글 변환에 관한 설정들인데,
페이지 설정에 따라서 한글설정이 다다를수 있으므로, 실험을 해봐야한다.
디비에 저장되있는 파일네임을 읽어와서 쓸때도, 한글변환설정이 맞아야 올바르게 다운로드가 된다.

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


필터 디스패처는 인터셉터, 액션, 액션 실행 후 반환되는 리절트 코드 값과 매핑된 리절트를 실행하는 액션 프록시를 실행한다. 


필터 디스패처는 ActionMapper가 유효성 검사 후에 넘어온 액션실행을 위해서


1. serviceAction() 메소드가  ActionProxy 클래스의 execute() 메소드를 실행 시킨다.


2. 프록시는 Configuration Manager(Struts.xml) 의 설정 정보를 가져온후, 


3. 프록시 execute() 메소드는 ActionInvocation 클래스인 DefaultActionInvocation 클래스의 invoke() 메소드를 수행 시킨다.


     invoke() 메소드를 수행하면서 프록시는 DefaultActionInvocation 클래스에게 ActionContext 를 넘겨준다


액션 인보케이션은 인터셉터 스택 중 실행할 다음 인터셉터가 있다면, 그 인터셉터의 intercept() 메소드를 호출한다.


호출 하면서 인자로 ActionInvocation 자신을 넘긴다. Interceptor.Intercept(this);


intercept()메소드는 파라미터로 넘어온 인보케이션의 invoke() 메소드를 다시 호출하며, 체인이 형성된다.

결국 같은 액션 인보케이션의 invoke() 메소드를 반복하여 더이상 인터셉트가 없을때까지, 재귀호출된다.


더이상 호출할 인터셉터가 없다면, invoke() 메소드는 해당 액션을 실행한다음 리절트를 실행한다.


실행후 리턴되면, 자신을 호출했던 인터셉트로 반환되면서, 해당 인터셉트의 남은 후처리 작업을 수행후 리턴한다.


다시 invoke() 로 리턴되면 액션을 수행했기 때문에 그냥 리턴되어서 자신이 호출한 인터셉트로 리턴되고,
인터셉트는 후처리작업후


다시 invoke() 로 리턴되면서 맨처음으로 돌아가게된다. 


끝까지 콜백된 메소드는 httpServletResponse를 통해서 돌아 나간다.


아래는 DefaultActionInvocation 클래스의 invoke() 메소드 코드다.



public String invoke() throws Exception {

	
	if(executed) {

		throw new IllegalStateException("Action has already executed");

	} // if end;

	
	if(interceptors.hasNext()){
		
		InterceptorMapping interceptor 
		= (InterceptorMapping) interceptors.next();
		
		resultCode =
			
			// 여기에서 인터셉트를 호출하면서 자신이 인자로 들어간다.
			interceptor.getInterceptor().intercept(this);
		
	}else{
		
		// 더이상 실행할 인터셉트가 없기 때문에, 액션을 실행한다.
		resultCode = invokActionOnly();
		
	} // end if;
	
	
	
	if( !executed) {
		
		//......................
		
		
		if(proxy.getExecuteResult()) {
			
			// 리절트를 실행한다.
			executeResult();
			
		}
		
		
		executed = true;
		
	} // end if;
	
	return resultCode;

}

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



  
  
   
  
  
  
   
  
  
  
   
  
  


--> 위 url 태그를 부르는 방법은  <s:a href="%{gotoContent}"><s:property value="title"/></s:a>

url 태그에 id 값은 <s:a > 태그에서 href="%{gotoContent}" 로 부르는 값이다.

 <s:property value="title"/> 이 값에 링크가 걸려서 저 title 이 뿌려지는 문자를 클릭하게되면
content.action 으로 가게되는데, 가면서 어떤 값들을 가지고 갈수있다.


 



파라미터에 들어가는 name 값은 'VALUE STACK'에 들어갈 변수명이고,
프로퍼리에 value 값은 변수값이다.

저걸 여러개 쭉쭉 써서 연결되는 class 파일에서 get, set 메소드 를 마련해두면
잘~~ 들어가있다.
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


2011. 7. 22 오전 9:58:02 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
심각: Can not find a java.io.InputStream with the name [duck] in the invocation stack. Check the <param name="inputName"> tag specified for this action.

저런 에러가 있다...struts.xml 에서도 설정을 제대로 해줬고, 

<action name="download" class="Struts_BBS.FileDownloadAction">

		

			<result name="success" type="stream">

			

				<param name="contentType">${contentType}</param>

				<param name="contentLength">${contentLength}</param>

				<param name="contentDisposition">${contentDisposition}</param>

				<param name="inputName">duck</param>

      			<param name="bufferSize">${4096}</param>

			</result>

</action>  

자바 액션클래스에서도 inputStream을 제대로 만들어줬다고 생각했었는데, 

this.setDuck(ServletActionContext.getServletContext()
.getResourceAsStream(fullPath));

계속 null로 뜨면서 getter를 하지못하고, 맨위에 저 에러를 계속 토해냈다. ㅡㅡ ㅅㅂ

저 코드말고

this.setDuck(new FileInputStream(fullPath));

이런식으로 해주면 잘 되더라........아...아까운 내 시간... 
 
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST