CREATE DATABASE ADBOOKDB USING CODESET UTF-8 TERRITORY US~ CONNECT TO ADBOOKDB user db2admin using "db2admin"~ CREATE SCHEMA DB2ADMIN AUTHORIZATION DB2ADMIN~ CREATE TABLE DB2ADMIN.ADDRESSBOOK (EMAILID CHARACTER (50) NOT NULL PRIMARY KEY, CONTACTINFO XML) ~위 파일은 10개의 레코드를 데이터베이스에 삽입하는 스크립트를 포함하고 있다. 한 사람의 전자메일 아이디가 주키이며 이는 데이터베이스에 삽입되는 다음의 XML 문자열로부터 주어진다. 한 사람의 전체 연락처 정보는 하나의 XML 문자열 엘리먼트로 전달된다. 아래에 나타나 있는 코드는 입력 스크립트의 한 예이며, XML과 주키간의 1대1 대응관계를 할당하기 위하여 전자메일 아이디가
insert into db2admin.addressbook values ("grace.thomas@yahoo.com","")~ Grace Thomas 9947267690 Grace Villa III Cross Pattom
SELECT * FROM DB2ADMIN.ADDRESSBOOK~
onclick() 이벤트 핸들러는 phonelist와 contactallinfo 뷰를 숨기고 Add New Contact 화면을 보여준다.
onclick() 이벤트 핸들러는 다른 뷰들을 숨기고 listAllContacts() 메소드를 호출한다.messagetext.setText(""); if(phonelist.visible){phonelist.setVisible(false);} if(contactallinfo.visible){contactallinfo.setVisible(false);} newperson.setVisible(true); newperson.resetForm(); newperson.title.setAttribute("text","New Contact");
오픈라즐로의 그리드 컴포넌트는 테이블 형태로 XML 경로내의 데이터를 나열한다. 또한 그리드 컴포넌트는 나열된 어떠한 컬럼에 대해서도 앞단에서 정렬할 수 있도록 해준다.messagetext.setText(""); if(newperson.visible){newperson.setVisible(false);} parent.parent.listAllContacts(); contactallinfo.setVisible(false); phonelist.setVisible(true);
한 사람의 전자메일 아이디를 나타내는 텍스트로부터 ondblclick() 이벤트가 처리된다. 더블클릭 이벤트에서는 getContactdetailsMore() 메소드가 현재 컴포넌트의 텍스트 값을 전달하면서 호출되는데, 이 텍스트 값은 다름 아닌 전자메일 아이디이다. 다음은 이것의 처리과정이다:No First Name Last Name Phone Email Id
listAllContacts() 메소드는phonelist.setVisible(false); contactallinfo.setVisible(true); contactallinfo.getContactdetailsMore(this.text); contactallinfo.setDatapath("contactdetailsDS:/addressbook/person"); contactallinfo.title.setAttribute("text","View/ Update contact details");
datapointer는 listcontactsDS (데이터집합)내의 결과 노드를 가리키며 만약 데이터 집합의 데이터에 어떠한 변경사항이 존재하면 ondata() 이벤트가 트리거 될 것이다. 만약 응용계층에서 예외사항이나 검증 오류가 존재하면 애플리케이션(JSP)은 데이터집합의 결과 노드에 예외사항에 관한 메시지를 집어넣을 것이다. ondata() 이벤트에서는 datapointer가var ds=canvas.datasets.listcontactsDS; var p=new LzParam(); p.addValue("action","getall",true); ds.setQueryString(p); ds.doRequest();
[Contactdetails.lzx]if (this.xpathQuery("listcontactsDS:/addressbook/result[@action="exception"]/text()") == "failure") { messagetext.setText("There is an exception!"); }else{ messagetext.setText(""); }
updateContact() 메소드는:var ds=canvas.datasets.contactdetailsDS; var p=new LzParam(); p.addValue("action","getcontactdetails",true); p.addValue("emailid",email_id, true); ds.setQueryString(p); ds.doRequest();
[newcontact.lzx]setAttribute("emailid",hb_1.email_in.getText()); setAttribute("firstnm",hb_2.fname_in.getText()); setAttribute("lastnm",hb_2.lname_in.getText()); setAttribute("phonenmbr",hb_4.pnumber_in.getText()); var ds=canvas.datasets.contactdetailsDS; var p=new LzParam(); p.addValue("action","updatecontact",true); p.addValue("emailid",emailid, true); p.addValue("firstname",firstnm,true); p.addValue("lastname",lastnm,true); p.addValue("phonenumber",phonenmbr,true); p.addValue("housename",hb_3.hname_in.getText(),true); p.addValue("streetname",hb_3.sname_in.getText(),true); p.addValue("cityname",hb_4.cname_in.getText(),true); ds.setQueryString(p); ds.doRequest();
그런 다음 폼 컴포넌트를 초기화 한다:setAttribute("emailid",hb_1.email_in.getText()); setAttribute("firstnm",hb_2.fname_in.getText()); setAttribute("lastnm",hb_2.lname_in.getText()); setAttribute("phonenmbr",hb_4.pnumber_in.getText()); var ds=canvas.datasets.addnewDS; var p=new LzParam(); p.addValue("action","addnewcontact",true); p.addValue("emailid",emailid, true); p.addValue("firstname",firstnm,true); p.addValue("lastname",lastnm,true); p.addValue("phonenumber",phonenmbr,true); p.addValue("housename",hb_3.hname_in.getText(),true); p.addValue("streetname",hb_3.sname_in.getText(),true); p.addValue("cityname",hb_4.cname_in.getText(),true); ds.setQueryString(p); ds.doRequest();
동일한 기능이 다른 datapointers에서도 제공되는데 여기에서 다시 새로운 연락처 추가 기능에 대한 오류확인이 이루어진다. 만약 메시지가 성공적이면 이것은 데이터집합의 루트를 가리키는 포인터를 얻게 되며 자식 엘리먼트를 탐색하여 폼 컴포넌트에 주어진 값에 텍스트를 설정한다. 그런 다음 그리드의 datapath가 갱신되어 변경된 데이터가 그리드에서 보여지게 된다.hb_1.email_in.setText(""); hb_2.fname_in.setText(""); hb_2.lname_in.setText(""); hb_4.pnumber_in.setText(""); hb_3.hname_in.setText(""); hb_3.sname_in.setText(""); hb_4.cname_in.setText("");
[datasets.lzx]if (this.xpathQuery("result[@action="addnewcontact"]/text()") == "success") { messagetext.setText("Contact details successfully Inserted"); var dp = canvas.datasets.listcontactsDS.getPointer(); dp.selectChild(2); dp.addNodeFromPointer(dp); dp.setNodeAttribute("email",classroot.emailid); dp.selectChild(); dp.setNodeText(classroot.firstnm); dp.selectNext(); dp.setNodeText(classroot.lastnm); dp.selectNext(); dp.setNodeText(classroot.phonenmbr); Debug.write("classroot.emailidentifier",classroot.emailid); parent.setVisible(false); canvas.mainwindow.listAllContacts(); phonelist.setVisible(true); contactsgrid.datapath.updateData(); } else if (this.xpathQuery("result[@action="addnewcontact"]/text()") == "failure") { messagetext.setText("Update failed !"); }else if (this.xpathQuery("result[@action="exception"]/text()") == "failure") { messagetext.setText("There is an exception!"); }else{ messagetext.setText(""); }
[xmlfetcher.jsp]
if (action.equals("getall")) { pstmt = connection.prepareStatement("XQuery이 기능에서는 한 사람의 모든 정보가 검색되어 클라이언트로 리턴된다. 그 사람의 전자메일 아이디는 요청 파라미터 값으로 전자메일 아이디가 JSP로 전달된다.{ ( for $person in db2-fn:xmlcolumn("DB2ADMIN.ADDRESSBOOK.CONTACTINFO")/person"+ "return "); rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); out.print(rs.getString(1)); } }{($person/firstname), ($person/lastname),($person/phone)} )}
if (action.equals("getcontactdetails")) { String pk = request.getParameter("emailid"); String sql="values(xmlquery(" for $person in db2-fn:xmlcolumn(\"DB2ADMIN.ADDRESSBOOK.CONTACTINFO\")/person"+ " where $person/@email eq $emailid " + " return이 기능에서는 새로운 연락처 정보가 데이터베이스에 저장된다. 정보는 요청 파라미터로부터 파싱되어 CONTACTINFO 컬럼으로 들어가기 전에 XML 문자열로 변환된다. 생산 환경에서는 이것은 애플리케이션 프레임워크에 포함된 XML 생성기 유틸리티에 의해 처리될 것이다.{($person)} " "+ " passing cast(? AS varchar(50) ) as \"emailid\" ))"; pstmt = connection.prepareStatement(sql); pstmt.setString(1,pk); rs= pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); out.print(rs.getString(1)); }
if (action.equals("addnewcontact")) { String pk = request.getParameter("emailid"); String fname = request.getParameter("firstname"); String lname = request.getParameter("lastname"); String hname = request.getParameter("housename"); String sname = request.getParameter("streetname"); String cname = request.getParameter("cityname"); String phnumber = request.getParameter("phonenumber"); String finalString="updatecontact 기능에서는 사용자의 변경된 정보들이 데이터베이스에 갱신된다. 이전의 경우에서처럼 XML 문자열이 생성되어 DB XML 컬럼이 새로운 문자열로 갱신된다. 이 상황에서는 표현 계층에서 동일한 XML이 만들어져 파라미터의 값으로 전달됨으로써 전과 동일한 결과가 발생할 수 있을지에 대해서도 고려해 보아야 한다. 그런데 이것은 대부분의 경우 바람직한 일이 아닐 수도 있는데 왜냐하면 표현계층으로부터 전달되는 데이터에 대한 비즈니스 로직의 수행은 그것이 데이터베이스에 저장되기 이전에 이루어져야 할 필요가 있기 때문이다."; String sql="INSERT INTO DB2ADMIN.ADDRESSBOOK(EMAILID ,CONTACTINFO)values(""+pk+"",""+finalString+"")"; stmt = connection.createStatement(); stmt.executeUpdate(sql); out.print(" "+fname+ " "+lname+" "+ phnumber+" "+hname+" "+ sname+" "+cname+" "); } success
if (action.equals("updatecontact")) { String pk = request.getParameter("emailid"); String fname = request.getParameter("firstname"); String lname = request.getParameter("lastname"); String hname = request.getParameter("housename"); String sname = request.getParameter("streetname"); String cname = request.getParameter("cityname"); String phnumber = request.getParameter("phonenumber"); String finalString="예외사항이 잡히는 곳의 catch 블록은 XML 문자열에 등록되어 클라이언트로 전송된다. 예외사항에 대한 메시지는"; String sql="UPDATE DB2ADMIN.ADDRESSBOOK SET CONTACTINFO=""+ finalString+ "" WHERE EMAILID=""+pk +"""; stmt = connection.createStatement(); stmt.executeUpdate(sql); out.print(" "+fname +" "+lname+" "+ phnumber+" "+hname+" "+ sname+" "+cname+" "); System.out.println(" success "); } success
} catch (Exception e) { e.printStackTrace(); out.print("결론"); } finally { System.out.println("executing finally "); try { System.out.println("Closing the statement and connection"); if(null!=rs){ rs.close(); } if(null != pstmt){ pstmt.close(); } connection.close(); System.out.println("closing the connection"); } catch (Exception e) { System.out.println("There is exception in the finally block"); e.printStackTrace(); } } failure
이전 글 : 아파치 httpd 로그를 Syslog로 보내기
다음 글 : 윈도우 파워쉘 사용을 위한 10가지 팁
최신 콘텐츠