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


Redirect 

클라이언트의 요청을 처리한 후, 웹 컨테이너는 sendRedirect() 메소드가 호출되면 브라우저에 응답을 보낸다. 

이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL을 포함한다.

여기에서 하나의 요청이 종결되고, 새로부여받은 URL 로 브라우저에서 완전히 새롭게 요청하기 때문에

이전에 요청 스코프에 저장되어 있던 객체는 새로운 요청 전에 소멸된다. 


[

 

위 그림처럼  첫 요청이 실행되다가, 리다이렉트 요청이 들어오면 다시
클라이언트인 브라우저에게  
리다이렉트 요청을 보내고, 브라우저는 그 요청을 받고
요청을 하게된다.



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



Forward

요청이 포워딩 될때는 해당 요청이 서버의 다른자원(서블릿)에 전달된다. 

이때에는 이 요청을 처리하는것을 클라이언트(브라우저)에게 알리지 않는다.

이런방식의 처리는 웹 컨테이너 내부에서만 일어나고, 클라이언트는 알수없게된다.

그렇기 때문에 브라우저 주소창은 이전 주소가 그대로 남아있고, 내부적으로만 바뀐다.

포워딩은 리다이렉트와 다르게 객체를 요청에 담아서 요청을 처리한다.

그렇기 때문에 그전 스코프에 저장되어 있던 객체들도 포워드 후에도 

참조할수 있다.

포워딩은 클라이언트와 통신없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 보여준다.








복사http://blog.naver.com/crazybnn/30099211372그림 : 데쳄버 
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



Redirect 접두어

form 에 지정된 Action 이 아니라 다른 주소로 리다이렉트 할때 쓴다.

리다이렉트와 포워딩 의 차이는 간단하게 

일단 리다이렉트는 브라우저에 다시 요청을 보내라고 시켜서 브라우저에서 다시 요청이 들어오는것이고,
포워딩은 서블릿 자체내에서 페이지를 옮기는것이다.

리다이렉트시에는 브라우저 주소창에 주소가 바뀌지만,
포워딩은 서블릿컨테이너에서 내부적으로 페이지를 바꾼것이기 때문에, 브라우저는 그 사실을 모른다. 
그래서 주소가 바뀌지 않는다.


name="redirect: 다음 리다이렉트 시킬 주소" 를 입력하게되면

리다이렉트가 된다.

<s:submit value="Redirect 접두어" name="redirect:http://winmargo.tistory.com"/>




 


주소창을 잘보면 주소가 바뀐걸 알수있다. 이게 리다이렉트이다. 

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



Action 접두어

액션 접두어는 form 에 지정된 action 말고 다른 액션을 지정하고싶을때
쓰는 접두어이다.

name="action:액션명" 을 지정하면 그 버튼은 지정한 액션의으로 서브밋 되어서 

무조건 execute() 메소드를 수행시킨다.

↑↑↑↑↑↑ 라고 했는데, struts.xml 에서 매핑을 다른 메소드로 지정을 해놓으니

그 메소드가 실행이 되는데, 이유는 좀 찾아봐야되겠다..

<s:submit value="Action 접두어" name="action:test"/>

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


접두어 4 종류


1. 메소드 접두어

Method.jsp
 
<s:form action="call">
<s:textfield name="name"/>
<br>
<s:submit value="Login"/>
<s:submit value="Login" name="method:margo"/>
</s:form>

         

<s:submit value="Login"/>
이 서브밋을 누르게 되면, struts.xml 에 정의된 call.action 이 들어오면 수행될
액션 클래스가 수행될것이다. 만약 struts.xml 에서 메소드를 지정하지 않았다면
자동으로 execute() 가 수행될것이다.


<s:submit value="Login" name="method:margo"/> 
 하지만 submit 의 name 속성에 "method:메소드명" 을 지정하게되면

call.action 이 수행하게될 액션클래스의 메소드가 실행되게 된다.

위 구문처럼 method:margo 하게되면
액션클래스에 margo() 메소드가 실행된다.





일단 제일 처음 예제처럼 method.jsp 에서 두개의 기본 버튼이 생성될것이다.
 






그리고 struts.xml 에서 call 액션에 대한 액션클래스를 매핑한다.







execute() 메소드에서는 "success"를 리턴할것이고, 
margo() 메소드에서는 "margo"를 리턴할것이다. 




 
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 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하십니까?

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



이클립스를 사용합니다.

web.xml 을 설정해줍니다. 모든 접속은 org.apache.struts2.dispatcher.FilterDispatcher가 하도록 합니다.

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <display-name>Struts2</display-name>

  

  <filter>

  <filter-name>Struts2</filter-name>

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

  </filter>

  

  <filter-mapping>

  <filter-name>Struts2</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

  

</web-app>





자신에게 필요한  .jar 파일을 라이브러리에 복사합니다.

 





이제 스트러츠 설정 파일인 struts.xml을 생성해줍니다.

 









struts.xml 을 생성 했으면 기본으로 필요한 구문이 있습니다.




아래와 같은 형식이어야 합니다.
 



저기서 중요한 구문은

<!DOCTYPE struts PUBLIC '-//Apache Software Foundation//DTD Struts Configuration 2.0//EN' 

 'http://struts.apache.org/dtds/struts-2.0.dtd'>

오타가 나면 동작을 안합니다. 




패키지  네임스페이스를 사용해서 여러 패키지를 사용할수도 있습니다.


각 패키지 안에 <action>들은 하나의 액션클래스와 뷰페이지를 설정할수있도록 하는

역할을 합니다.

<action name="">은 브라우저 주소창에 입력될  .action(기본) 입니다. 위에 예제처럼 list 일경우는

예를 들어   http://localhost:8080/Struts_MVC_BBS/list.action

저런식으로 요청이 들어오면 Struts_BBS패키지안의 'ListAction' 클래스가 수행하겠다고 설정하는 것입니다.

<action >태그 속성에서 method 속성을 지정하지 않으면 기본적으로 'ListAction'클래스의 execute() 메소드

실행하겠다고 지정하는것이 됩니다.

만약 process() 메소드를 실행하게 하고싶다면 method="process" 라고 속성을 주면 됩니다.

액션 엘리먼트 안의 <result> 엘리먼트는 액션클래스가 어떤 작업을 수행수 리턴값이 무조건 String 이 되야합니다.

그 스트링값이 기본적으로 "success"가 오게되면 <result name="success">/list.jsp</result> 처럼 매핑되어있는

리절트가 실행되게 됩니다.  리턴값이 success 인 리절트는 네임속성을 주지않아도 기본값입니다.

결과값이 "write" 가 오게된다면 <result type="chain" name="write">/write</result>  

매핑 해놓은것처럼 /write 로 리절트되게되는데, 여기서 /write.jsp가 아닌 /write 로 되어있는데

이문장은 /write.action 이 수행된다는 의미입니다. 다시말해 뷰페이지가아닌

액션클래스에서 다시 액션클래스로 리다이렉트 시키는 것입니다.










 
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 로쓰비 2011.08.11 11:19 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다.




스트럿츠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