1. transaction을 이용해서 입력, 수정, 삭제 후 저장을 해보자.
transaction() 이란?
- Dataset의 값을 갱신하기 위한 서비스를 호출하고, transaction이 완료되면 CallBack Function을 수행하는 Method
2. 파일첨부된 employees_save.jsp을 받아서 Tomcat7.0 -> webapps - > ROOT - >edu(폴더만듬) -> xp(폴더만듬)폴더 안에 복사한다.
3. 편집기를 사용해서 employees_save.jsp 열어서 코드분석 해보자
<%@ page import="org.apache.commons.logging.*" %>
<%@ page import="com.tobesoft.xplatform.data.*" %>
<%@ page import="com.tobesoft.xplatform.tx.*" %>
<%@ page import = "java.util.*" %>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.io.*" %>
<%@ page contentType="text/xml; charset=UTF-8" %>
<%!
// Dataset value
public String dsGet(DataSet ds, int rowno, String colid) throws Exception
{
String value;
value = ds.getString(rowno,colid);
if( value == null )
return "";
else
return value;
}
%>
<%
// PlatformData
// 클라이언트 쪽으로 보낼 데이터 PlatformData
PlatformData o_xpData = new PlatformData();
int nErrorCode = 0;
String strErrorMsg = "START";
// HttpPlatformRequest
HttpPlatformRequest pReq = new HttpPlatformRequest(request);
// XML parsing
// 클라이언트 쪽에서 넘어온 xml데이터를 할당받는 부분
pReq.receiveData();
// PlatformData
// 클라이언트쪽에서 넘어온 데이터를 받기 위한 PlatformData
PlatformData i_xpData = pReq.getData();
// Get
VariableList in_vl = i_xpData.getVariableList();
// 클라이언트 쪽에서 보내준 변수("sVall")를 기술며, 할방받음
String in_var2 = in_vl.getString("sVal1");
// 클라이언트 쪽에서 보내준 dataset이름("in_ds")을 기술하며, 할당 받음
DataSet ds = i_xpData.getDataSet("in_ds");
try {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:EX", "study", "study");
stmt = conn.createStatement();
String SQL = "";
int i;
// 클라인트 쪽에서 넘어온 dataset에서 변경된 레코드만 보내주는 :u가 있는데 서버쪽으로 넘// 어오는 데이터 버퍼는 2군대로 나눠지는 delete버퍼와 insert,update버퍼로 나눠진다.
// 삭제된 레코드가 있다면 처리할 구문
for( i = 0 ; i< ds.getRemovedRowCount() ; i++ )
{
String del_id = ds.getRemovedData(i,"EMP_ID").toString();
SQL = "DELETE FROM EMPLOYEES WHERE " +
"EMP_ID = " + "'" + del_id + "'";
rs = stmt.executeQuery(SQL);
}
for(i=0;i<ds.getRowCount();i++)
{
// 클라이언트 쪽에서 넘어온 레코드의 상태를 확인 할수 있음( .getRowType(i))
int rowType = ds.getRowType(i);
if( rowType == DataSet.ROW_TYPE_INSERTED )
{
SQL = "INSERT INTO EMPLOYEES (EMP_ID,FULL_NAME,DEPT_ID,HIRE_DATE,GENDER,MARRIED,SALARY,EMP_MEMO) VALUES ( " +
"'" + dsGet(ds,i,"EMP_ID" ) + "'," +
"'" + dsGet(ds,i,"FULL_NAME" ) + "'," +
"'" + dsGet(ds,i,"DEPT_ID" ) + "'," +
"'" + dsGet(ds,i,"HIRE_DATE" ) + "'," +
"'" + dsGet(ds,i,"GENDER" ) + "'," +
"'" + dsGet(ds,i,"MARRIED" ) + "'," +
"'" + dsGet(ds,i,"SALARY" ) + "'," +
"'" + dsGet(ds,i,"EMP_MEMO") + "' )";
System.out.println(">>> insert : "+SQL);
}
else if( rowType == DataSet.ROW_TYPE_UPDATED )
{
String org_id = ds.getSavedData(i,"EMP_ID").toString();
SQL = "UPDATE EMPLOYEES SET " +
"FULL_NAME = '" + dsGet(ds,i,"FULL_NAME" ) + "'," +
"DEPT_ID = '" + dsGet(ds,i,"DEPT_ID" ) + "'," +
"HIRE_DATE = '" + dsGet(ds,i,"HIRE_DATE" ) + "'," +
"GENDER = '" + dsGet(ds,i,"GENDER" ) + "'," +
"MARRIED = '" + dsGet(ds,i,"MARRIED" ) + "'," +
"SALARY = '" + dsGet(ds,i,"SALARY" ) + "'," +
"EMP_MEMO = '" + dsGet(ds,i,"EMP_MEMO" ) + "' " +
"WHERE EMP_ID = " + "'" + org_id + "'";
}
rs = stmt.executeQuery(SQL);
}
//conn.commit();
} catch (SQLException e) {
// VariableList에 값을 직접 추가
nErrorCode = -1;
strErrorMsg = e.getMessage();
}
if ( stmt != null ) try { stmt.close(); } catch (Exception e) {nErrorCode = -1; strErrorMsg = e.getMessage();}
if ( conn != null ) try { conn.close(); } catch (Exception e) {nErrorCode = -1; strErrorMsg = e.getMessage();}
nErrorCode = 0;
strErrorMsg = "SUCC";
} catch (Throwable th) {
nErrorCode = -1;
strErrorMsg = th.getMessage();
}
// VariableList 참조
VariableList varList = o_xpData.getVariableList();
// VariableList에 값을 직접 추가
varList.add("ErrorCode", nErrorCode);
varList.add("ErrorMsg", strErrorMsg);
// HttpServletResponse를 이용하여 HttpPlatformResponse 생성
HttpPlatformResponse pRes = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML, "UTF-8");
pRes.setData(o_xpData);
// 데이터 송신
pRes.sendData();
%>
4. 입력, 삭제, 저장 버튼에 fn_add, fn_delete, fn_save 이름으로 Onclick 이벤트를 잡아 준다.
5. 입력 function을 작성해보자.
// 입력
function fu_add(obj:Button, e:ClickEventInfo)
{
// 빈 레코드를 추가
ds_employees.addRow();
}
6. 삭제 function을 작성해보자.
// 삭제
function fn_delete(obj:Button, e:ClickEventInfo)
{
// 레코드 삭제
// ds_employees.rowposition : 사용자가 선택한 레코드 위치를 알려줌.
ds_employees.deleteRow(ds_employees.rowposition);
}
7. 저장 function을 작성해보자.
// 저장
function fn_save(obj:Button, e:ClickEventInfo)
{
transaction("trSava" // 트렌젝션의ID
,"DataURL::employees_save.jsp" // 서버측 주소
,"in_ds=ds_employees:u" // input dataset
// 왼쪽은 server측에서 꺼내써야될 dataSet이름으로 맞춰야됨.
// 오른쪽 : 화면의 dataset이름
// :u -> 변경된 내용 서버로 되돌려 보낼때 사용
,"" // ouput dataset
,"sVal1=1" // 서버측으로 보내는 변수값
,"fn_callback"); // callback받는 function
}
// 비동기 통신을 받을 function
// 첫번째 인자는 트렌젝션의 아이디, 두번째는 에러코드값, 세번째는 에러메시지
function fn_callback(trID, nCD, sMSG){
if(trID == "trSava"){
if(nCD < 0){
alert("저장실패");
}else{
alert("저장성공");
}
}
}
8. 화면을 출력하여 입력,삭제,수정,저장을 해보자
글 입력된 화면
글 수정 화면
글 삭제 화면
댓글 없음:
댓글 쓰기