Submission

정의

서버-클라이언트 통신

Submission은 서버와의 데이터 통신을 위한 모듈로서, AJAX로 구현되어 있습니다. Submission의 특징은 아래와 같습니다.

특징

서버와의 통신용 전송/수신 데이터를 DataCollection 형식으로 정의해야 함.

화면의 전환 없이 데이터만 전송.

동기/비동기 통신 선택 가능.

통신의 전/후 처리를 위해 각 이벤트에 호출할 함수 정의 가능.

Script를 통해 동적 Submission 생성 가능.

ID를 제외한 속성은 동적 변경이 가능.

권장 내용

용도별로 Submission을 등록하는 것을 권장. (유지보수 편의성)

화면의 코드성 데이터 통신은 공통 모듈을 만들어 이용할 것을 권장

일반적인 순서

(1) 화면 UI 작성

(2) 서버와 주고 받는 데이터 형식 정의 (DataCollection 정의)

(3) 화면 UI와 DataCollection 바인딩

(4) Submission 생성

(5) Submission 실행 이벤트 정의

Submission vs. AJAX

개발자는 데이터 통신을 위해 Submission은 정의하거나 AJAX를 통해 직접 통신 모듈을 개발할 수도 있습니다.

Ajax는 Submission을 생성하지 않고 서버를 호출할 수 있습니다.

다음은 Submission과 AJAX를 비교한 것입니다.

Submission vs. AJAX


Submission

AJAX

특징

  • 웹 페이지 별로 정의

  • WebSquare5가 제공하는 형식 사용

  • 공통 모듈로 작성하여 일괄 적용이 가능

  • 개발자가 원하는 형식을 유연하게 사용 가능

장단점

  • 코드의 가독성이 높아짐

  • 유지보수가 쉬움

  • 코드의 가독성이 떨어짐

  • 유지 보수가 어려움

적용

  • 각 웹페이지의 대표적인 기능을 수행하는 데이터 통신

    (코드의 가독성을 높이고 유지보수를 쉽게 함)

  • 반복적으로 사용되는 데이터 통신

var reqstr = '<request>'
    + '<data value="efg">ABCD</data>'
    + '</request>';

$p.ajax({
      action : "http://localhost:8090/developGuide/getAjax.jsp",
      mode : "asynchronous",
      mediatype : "application/xml",
      method : "post",
      requestData : reqstr, 
      type : "xml",
      beforeAjax : function(e) {
        WebSquare.logger.printLog("beforeAjax call");
      },
      success : function(e) { 
        alert(e.responseText); 
      },
      error : function(e) {
        WebSquare.logger.printLog("error call");
      },
      requestHeader : {
        sendData1 : "123",
        sendData2 : "456"
      }
    });
ajax options

options 속성

설명

options.action

ajax 요청주소

options.mode

asynchronous(default)/synchronous

options.mediatype

mediatype

options.method

get/post/put/delete

options.requestData

요청 본문으로 문자열 텍스트 데이터

options.timeout

ajax요청후 timeout 시간. 이시간이 초과해도 응답이 오지 않는 경우 error callback함수를 실행합니다.

options.type

xml/json. xml인 경우, success callback함수의 인자객체의 responseBody속성에 xml객체가 설정되고, json인 경우 자바스크립트 객체가 설정됩니다. 나머지 경우는 text형식이 설정.

options.beforeAjax

요청 전에 실행되는 함수로 이 함수내에서 false를 return하면 ajax요청을 하지 않는다

options.success

요청이 성공한 경우 실행되는 callback함수

options.error

요청이 실패한 경우 실행되는 callback함수

options.requestHeader

request head에 값을 설정하는 객체

Submission & DataCollection

비교

DataCollection

Submission

다양한 종류의 방대한 데이터를 웹 브라우저에서 쉽게 출력하기 위해 WebSquare5가 사용하는 데이터 모델.

DataCollection을 이용하여 서버와의 데이터 통신을 정의

즉, 웹 브라우저와 서버와의 데이터 통신이 필요한 경우 DataCollection을 생성하고 Submission을 정의해야 합니다. (본 장은 Submission을 위주로 설명합니다. DataCollection에 대한 자세한 설명은 본 매뉴얼의 DataCollection 부분을 참조하십시오.)

Submission Vs. DataCollection

Submission 생성

Studio에서 생성

  1. OutlineHead 뷰를 선택합니다.

  2. Submission을 우클릭한 후, Add를 선택합니다.

Submission 생성

  1. 아래와 같은 창이 표시되면 해당 정보를 입력합니다.

Submission 속성

항목

설명

ID

Submission ID.

Reference

서버로 전송할 데이터 형식. (DataCollection 버튼 클릭 후 선택. 단, 해당 DataCollection을 미리 설정해야 함.)

Target

서버로부터 수신할 데이터 형식. (DataCollection 버튼 클릭 후 선택. 단, 해당 DataCollection을 미리 설정해야 함.)

URL Action

수신할 데이터가 있는 서버 URL

Process Message

Submission 실행 중 상태 창에 표시할 메시지.

아래는 상단의 Detailed 버튼을 클릭한 모습입니다. 하단의 Simple 버튼을 클릭하면 위의 화면으로 돌아갈 수 있습니다.

동적 생성

아래와 같이 API를 활용하여 동적으로 Submission을 생성할 수도 있습니다.

$p.createSubmission ( temOpt );

아래와 같이 오브젝트 형태로 Submission 객체를 생성하십시오. 속성은 Submission 생성창의 속성과 동일합니다.

var tmpOpt = {
    id : "sub_getUserXmlMapData"
    , ref : "data:xml,dc_reqCode"
    , target : "data:xml,dc_resUserMapData"
    , action : "/data/sampleData_xml_dc_map.data"
    , mediatype : "text/plain"
    , submitDoneHandler : function(e){
        alert(e.responseText);
    } 
};

// Submission 생성
$p.createSubmission( tmpOpt );

Submission의 생성만으로는 데이터를 주고 받을 수 가 없습니다.

Async 통신 권장 (Sync 모드 경고)

Submission 실행시 비동기(Asynchronous) 모드의 통신을 권장합니다.

Async 모드 권장

config.xml 파일에 <warningSyn> 항목이 "true"로 설정된 경우, 동기(synchronous) 모드의 Submission에 대해 경고 메시지가 표시됩니다.

$r_title(사용 예)
<WebSquare>
	<notRecommended>
        <warningSync value="true"/>
    </notRecommended>
</WebSquare>

Studio에서 sync 모드를 선택할 때 표시되는 경고 메시지

sync 모드 사용 시 실행 화면에 표시되는 경고 메시지

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/_config_xml/warningSync_config_xml/)

YouTube 동영상 (https://youtu.be/Fm05Vd261Eg)

이벤트 추가

OutlineHead 뷰에서 Submission을 우클릭한 후 Event를 선택합니다.

Submission 이벤트

Submission 이벤트

이벤트

설명

Submit

Submission 요청시 선처리 동작

Submit-done

Submission 동작

Submit-error

Submission 오류시 동작

submitdone(e)

xforms-submit-done : Response Status 코드 값이 정상 일 경우 동작.

xforms-submit-done

e 객체 key

설명

e.id

  • Submission 객체의 ID 반환.

e.resourceUri

  • 통신 URI 반환.

e.responseHeaders

  • Response Headers 내용 반환.

e.responseStatusCode

  • Response Status Code 반환.

e.responseReasonPhrase

  • Response Status Text 반환.

e.responseBody

  • Response Data를 XML 데이터로 parse 한 XML 객체 반환.

  • Response Content-Type이 JSON 인 경우 json객체를 XML로 파싱.

e.responseText

  • Response Data 원본으로 String 형태 반환.

e.responseHeadersJSON

  • Response Headers를 JSON으로 반환.

e.responseJSON

  • responseText를 JSON으로 변환.

  • response header의 content-type에 "json" 문자열이 있는 경우에만 변환을 수행.

submiterror(e)

xforms-submit-error : Response Status 코드가 오류 (200 미만 300 이상) 일 경우 동작.

xforms-submit-error

e 객체 key

설명

e.id

  • Submission 객체의 ID 반환.

e.errorType

  • target-error 로 고정값 반환.

e.resourceUri

  • 통신 URI 반환.

e.responseHeaders

  • Response Headers 내용 반환.

e.responseStatusCode

  • Response Status Code 반환.

e.responseReasonPhrase

  • Response Status Text 반환.

e.requestBody

  • Request Data로 String 형태 반환.

e.responseText

  • Response Data 원본으로 String 형태 반환.

e.responseHeadersJSON

  • Response Headers를 JSON으로 반환.

예제

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/$p_executeSubmission_Submission/)

YouTube 동영상 (https://youtu.be/CcCOLLL5yMw)

request header 설정

setRequestHeader() 함수를 사용하여 각 서브미션에 대해 request header를 설정할 수 있습니다.

$r_title(사용 예)
var subObj = $p.getSubmission("submission01");
subObj.setRequestHeader( {"userKey": "userValue"} );

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/setRequestHeader_getSubmission_$p/)

YouTube 동영상 (https://youtu.be/7_kb6Y7Oji4)

Submission 실행

데이터를 주고받기 위해서는 생성된 Submission 을 실행시켜야 합니다.

$p.executeSubmission API를 활용하여 아래와 같이 Submission을 실행하십시오.

$r_title(사용 예)
$p.executeSubmission ( submission id );

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/executeSubmission_$p_DataList/)

YouTube 동영상 (https://youtu.be/_-_BlE40I2Q)

Submission 중단

abortTrigger="true" 속성 설정을 통해 Submission을 중단할 수 있는 취소 버튼을 화면에 출력할 수 있습니다. 사용자가 이 버튼을 클릭하면 현재 실행중인 Submission은 중단됩니다.

지정한 ID의 Submission이 현재 실행 중일 경우 해당 Submission을 중단할 수 있습니다.

$r_title(형식)
WebSquare.ModelUtil.abort( "서브미션ID" );

Submission 확인

$p.getSubmissionList() 함수를 호출할 경우, 해당 함수가 호출된 화면에 포함된 submission 객체를 반환할 수 있습니다. 또한, 화면이 WFrame을 포함할 경우, WFrame의 src 화면에 포함된 submisison 객체를 함께 변환할 수도 있습니다.

// main.xml 아래에 wframe1.xml과 wframe2.xml이 있고 
// 각 화면에 submission1, submission2가 정의된 경우

// wframe1.xml에서 아래를 실행하면
$p.getSubmissionList();
// wframe1.xml에 있는 submission1, submission2 객체가 array로 반환됨.

// main.xml에서 아래를 실행하면,
$p.getSubmissionList({"returnType": "json", {"all" : true});

// 아래의 결과가 반환됨. 
// {"mf":["submission1","submission2"], "mf_wframe1":["submission1","submission2"], "mf_wframe2":["submission1","submission2"]}

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submssion/getSubmissionList_$p/)

YouTube 동영상 (https://youtu.be/VtKnRjGQ-hI)

데이터가 없는 경우 전송 데이터에서 제외

dataType=“bigDecimal” 혹은 “number” 컬럼의 데이터가 없는 경우 전송 데이터에서 제외할 수 있습니다. config.xml 파일에서 <exceptEmptyValue> 항목을 아래와 같이 설정하십시오.

$r_title(사용 예)

<WebSquare>
    <submission>
          <exceptEmptyValue value="true" />
    </submission
</WebSquare>

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/_config_xml/exceptEmptyValue_config_xml/)

YouTube 동영상 (https://youtu.be/d5tq5y7e9j8)

예제

선택용 컴포넌트와 바인딩된 DataMap에 데이터를 로딩하기

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/executeSubmission_$p_DataMap/)

YouTube 동영상 (https://youtu.be/aMj0Pxyc9Tc)

GridView와 바인딩된 DataList에 데이터 로딩하기

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/executeSubmission_$p_DataList_GridView/)

YouTube 동영상 (https://youtu.be/hK4KZi9vA5k)

  1. Project Explorer에서 마우스 우클릭 후 New – WebSquare Project를 선택합니다.

  2. 프로젝트 명("edu")을 입력하고 Next를 클릭합니다.

  3. Context Root를 "/"로 지정한 후 Finish를 클릭합니다.

  4. 새로 생성한 프로젝트를 마우스 우클릭 후 New – WebSquare Page를 선택합니다.

  5. 파일 명("sample")을 입력합니다.

WebSquare 프로젝트 및 Page 파일 (예)

  1. GridView에 표시할 데이터 파일을 준비합니다. (일반적인 경우 서버에 있는 데이터를 수신하나, 본 예제의 경우 로컬 파일을 사용하겠습니다.)

데이터 파일 예시 (data.json)

  1. 위의 데이터 파일에 따라 아래와 같이 DataList를 정의합니다.

Submission을 통해 서버의 데이터를 가져오거나 보내려면 DataCollection 객체가 필요합니다. DataCollection은 데이터 통신시 클라이언트와 서버가 주고 받을 데이터 형식을 정의합니다.

DataList 생성

  1. DataList에 정의된 형태의 데이터를 출력할 GridView를 Design 탭에 그립니다.

GridView

  1. OutlineHead 뷰에서 DataList를 GridView로 드래그-앤-드롭하여 GridView와 DataList를 바인딩합니다. 혹은, GridView 우클릭 후 Bind Bind Set을 클릭하여 바인딩할 DataList를 선택합니다.

GridView 우클릭 후 BindBind Set

바인딩할 DataList 선택

  1. OutlineHead 뷰에서 Submission을 추가합니다.

  1. Submission을 실행할 스크립트를 추가합니다.

서브미션 실행 ($p.executeSubmission();)

Submission

한 개의 Submission으로 여러 DataCollection에 데이터를 로딩하기

예제 파일


인터넷에서 다운로드 혹은

WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기

(/$p/Submission/executeSubmission_$p_DataList_Radio_SelectBox/)

YouTube 동영상 (https://youtu.be/qiCJ4XSJ8tc)