EX)

페이지 내에서 키보드 키를 누를 경우 실행하는 함수 지정

document.onkeydown = keyControl;


예제 함수

function keyControl() {

if (event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 17 || event.keyCode == 18 ||

event.keyCode == 112 || event.keyCode == 113 || event.keyCode == 114 || event.keyCode == 115 ||

event.keyCode == 116 || event.keyCode == 117 || event.keyCode == 118 || event.keyCode == 119 ||

event.keyCode == 120 || event.keyCode == 121 || event.keyCode == 122 || event.keyCode == 123 ||

event.keyCode == 91 || event.keyCode == 92) {

alert ("특수키 사용은 불가능합니다.");

return false;

}

}


←(백스패이스) = 8
TAB = 9
ENTER = 13
SHIFT = 16
CTRL = 17
ALT = 18
PAUSEBREAK = 19
CAPSLOOK = 20
한/영 = 21
한자 = 25
ESC = 27

스패이스 = 32
PAGEUP = 33
PAGEDN = 34
END = 35
HOME =36

←(중간) = 37
↑(중간) = 38
→(중간) = 39
↓(중간) = 40

0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
INSERT = 45
DELETE = 46

A = 65
B = 66
C = 67
D = 68
E = 69
F = 70
G = 71
H = 72
I = 73
J = 74
K = 75
L = 76
M = 77
N = 78
O = 79
P = 80
Q = 81
R = 82
S = 83
T = 84
U = 85
V = 86
W = 87
X = 88
Y = 89
Z = 90

윈도우(왼쪽) = 91
윈도우(오른쪽) = 92
기능키 = 93
0(오른쪽) = 96
1(오른쪽) = 97
2(오른쪽) = 98
3(오른쪽) = 99
4(오른쪽) = 100
5(오른쪽) = 101
6(오른쪽) = 102
7(오른쪽) = 103
8(오른쪽) = 104
9(오른쪽) = 105
.(오른쪽) = 110
/(오른쪽) = 111
*(오른쪽) = 106
+(오른쪽) = 107
-(오른쪽) = 109
F1 = 112
F2 = 113
F3 = 114
F4 = 115
F5 = 116
F6 = 117
F7 = 118
F8 = 119
F9 = 120
F10 = 121
F11 = 122
F12 = 123
NUMLOCK = 144
SCROLLLOCK = 145
=(중간) = 187
-(중간) = 189
`(왼쪽콤마) = 192
(중간) = 220

[출처] event.keyCode 표|작성자 세봉



WRITTEN BY
빨강꼬마

,

Struts2, iBatis Framework



iBATIS 2.x와 스트럿츠_2 환경 설정(JAR 파일 포함).rar


iBATIS 2.x와 스트럿츠_2 환경 설정.txt


스트럿츠 2.hwp


아이바티스 프레임 워크.hwp



1. 프로젝트 생성 후에 아래 파일들을 WebContent>WEB-INF>lib 폴더에 복사할 것.


ojdbc14.jar

jstl.jar

standard.jar

ibatis-2.3.4.726.jar


log4j-1.2.15.jar // 콘솔창에서 작업진행상태를 info 로 찍어주는 jar


//이하 스트러츠 환경설정파일.

commons-beanutils-1.7.0.jar

commons-digester-2.0.jar

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

commons-logging-1.0.4.jar

commons-logging-api-1.1.jar

freemarker-2.3.16.jar

ognl-3.0.jar

struts2-core-2.2.1.1.jar

struts2-dojo-plugin-2.2.1.1.jar

struts2-tiles-plugin-2.2.1.1.jar

tiles-api-2.0.6.jar

tiles-core-2.0.6.jar

tiles-jsp-2.0.6.jar

xwork-core-2.2.1.1.jar


javassist-3.7.ga.jar


2. 아래 파일을 Java Resources>src 폴더 하위에 복사할 것.

log4j.properties


3. 수업 자료의 Framework\struts 2\4. 프로그램 작성 방법\iBATIS 2.x와 스트럿츠_2\환경 설정 파일

안에 있는 src 폴더와 WebContent 폴더의 내용을 복사할 것.


4. 이클립스에서 프로젝트 새로고침.




-----------------------------------------------------------------------------------

스트러츠2에서 데이터 전송 테스트(ActionSupport 클래스 이용)


* 실행순서

- struts.properties에서 인코딩 및 url 확장자 설정을 해둠.

- 사용자가 브라우저에 send01.action 입력

- struts.xml 에서 환경설정에 의해 myStruts.xml 를 실행

- myStruts.xml에서 주소창에 입력된 send01.action과 매칭되는 action 엘리먼트를 찾은다음

- result 엘리먼트의 목적 주소인 send01.jsp로 이동함.

- send01.jsp에서 회원가입버튼을 눌렀을때 폼의 action 속성의 목적 주소로 이동

- myStruts.xml에서 주소창에 입력된 send01.jsp의 폼 액션 주소인 receive01.action과 매칭되는 action 엘리먼트를 찾은다음

- class 속성의 액션처리용 java 파일(ActionSupport 상속) 내 오버라이딩한 execute() 를 실행한 후 리턴값이 SUCCESS 일 경우

- result 엘리먼트의 목적 주소인 receive01.jsp로 이동함.

- receive01.jsp 실행(EL표현 사용)


struts.properties -> 사용자 주소 입력 -> struts.xml -> myStruts.xml -> send01.jsp -> myStruts.xml -> TestAction.java -> receive01.jsp




//send01.jsp -> 입력 페이지 역할. 입력된 데이터를 서버로 전송.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트1</h2>

<!-- <form> 에서 action 속성과 method 속성 필수 -->

<form action="receive01.action" method="post">

<!-- JSP에서는 식별자를 name 속성으로 구분 -->

이름 <input type="text" name="name">

전화 <input type="text" name="tel">

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<input type="submit" value="회원가입">

</form>

</div>

</body>

</html>



//receive01.jsp -> 처리, 출력 페이지 역할. 클라이언트가 전송한 데이터 수신 및 처리. 결과 메세지를 클라이언트에게 전송.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트1</h2>

<h3>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. -->

name:${name}, tel:${tel}

</h3>

</div>

</body>

</html>



//TestAction.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;


//스트러츠2에서 사용하는 데이터 전송 전용 객체

public class TestAction extends ActionSupport{


private static final long serialVersionUID = 1L;


//멤버변수 선언

private String name, tel;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}


//execute() 메소드 오버라이딩 할 것.

@Override

public String execute() throws Exception {


//액션 처리 과정 필요. 

//약속된 상수 리턴 필수

//메소드 실행 결과를 스트러츠2에게 알려주는 값

return SUCCESS; //  = "success"

}

}



//struts.xml

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

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

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

<struts>

<!-- Configuration for the default package. -->

<package name="default" extends="struts-default" namespace="">

<global-results>

<result name="error">/exception/error.jsp</result>

</global-results>

</package>

<!-- 스트러츠2 환경 설정 파일 등록 -->

<include file="myStruts.xml"></include>


</struts>




//MyStruts.xml

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

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

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

<struts>


<!-- package 엘리먼트에서 name 속성은 유일하게 작성할 것 -->

<!-- package 엘리먼트에서 namespace 속성은 빈칸으로 처리 -->

<package name="temp01" extends="struts-default" namespace="" >


<!-- 서블릿 주소 분석 과정을 추가할 것 -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 되며, 확장자는 .action으로 설정되어 있다. -->

<action name="send01">

<!-- result 엘리먼트는 JSP 페이지 연결시 사용 -->

<result>/send01.jsp</result>

</action>

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스 지정할 때 사용 -->

<action name="receive01" class="com.test.TestAction">

<result>/receive01.jsp</result>

</action>


</package>

</struts>




//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml.


-----------------------------------------------

스트러츠2에서 데이터 전송 테스트2(도메인 오브젝트 클래스 이용)


//send02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript">

function myFunc(obj) {

//데이터 검사

//이름, 전화번호가 비어있는지 검사하는 과정 추가

//이름, 전화번호가 채워진 경우만 데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>데이터 송수신 테스트2</h2>

<!-- <form> 태그에서 action, method 속성 필수 -->

<form action="receive02.action" method="post">

<!-- 식별자 name 속성에서 dto.변수명 형태로 작성 -->

이름 <input type="text" name="dto.name"><br>

전화 <input type="text" name="dto.tel"><br>

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<!-- <input type="submit" value="회원가입"><br> -->

<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->

<input type="button" value="회원가입"

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>

</form>

</div>

</body>

</html>





//receive02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2</h2>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. --> 

<h3>name:${dto.name}, tel:${dto.tel}</h3>

</div>

</body>

</html>





//UserDTO.java

package com.test;


//스트러츠2에서 사용하는 데이터 저장소 객체

public class UserDTO {

//사용자가 사용하는 식별자와 멤버변수는 동일한 명칭 사용할 것.

private String name, tel;


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getTel() {

return tel;

}


public void setTel(String tel) {

this.tel = tel;

}


}






//TestAction02.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;


//스트러츠2에서 사용하는 데이터 전송 전용 객체

//UserDTO 객체가 별도로 작성된 경우

public class TestAction02 extends ActionSupport {

private static final long serialVersionUID = 1L;

//스트러츠2에서 사용하는 데이터 저장소 객체를 지정하는 부분 추가

//클라이언트가 전송한 데이터를 자동 수신하게 된다.

private UserDTO dto;

public UserDTO getDto() {

return dto;

}

public void setDto(UserDTO dto) {

this.dto = dto;

}


//execute() 메소드 오버라이딩 할 것.

@Override

public String execute() throws Exception {

//액션 처리 과정 필요

//약속된 상수 리턴 필수

//메소드 실행의 결과를 스트러츠2에게 알려주는 값

return SUCCESS;

}

}






//myStruts02.xml

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

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

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

<struts>


<!-- package 엘리먼트에서 name 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="temp02" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<action name="send02">

<!-- result 엘리먼트는 JSP 페이지 연결시 사용 -->

<result>/send02.jsp</result>

</action>

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<action name="receive02" class="com.test.TestAction02">

<result>/receive02.jsp</result>

</action>

</package>

</struts>





//struts.xml

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

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

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

<struts>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


</struts>





//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml




//요청주소

http://localhost:8090/Struts2Test/send02.action



-----------------------------------------------

스트러츠2에서 데이터 전송 테스트3(모델 드리븐 이용)



//send03.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript">

function myFunc(obj) {

//데이터 검사

//이름, 전화번호가 비어있는지 검사하는 과정 추가

//이름, 전화번호가 채워진 경우만 데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>데이터 송수신 테스트3</h2>

<!-- <form> 태그에서 action 속성을 send나 receive가 아닌 통합 식별자로 작성 -->

<form action="sample03.action" method="post">

<!-- 모델 드리븐 방식 이용을 위한 값 지정 -->

<input type="hidden" name="mode" value="insert">

<!-- 식별자 name 속성에서 dto.변수명 형태로 작성 -->

이름 <input type="text" name="dto.name"><br>

전화 <input type="text" name="dto.tel"><br>

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<!-- <input type="submit" value="회원가입"><br> -->

<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->

<input type="button" value="회원가입"

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>

</form>

</div>

</body>

</html>





//receive02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트3</h2>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. --> 

<h3>name:${dto.name}, tel:${dto.tel}</h3>

</div>

</body>

</html>




//UserDTO03.java

package com.test;


//스트러츠2에서 사용하는 데이터 저장소 객체

public class UserDTO03 {

//사용자가 사용하는 식별자와 멤버변수는 동일한 명칭 사용할 것.

private String name, tel;

//모델 드리븐 방식에서 사용하는 전용 멤버변수 추가

private String mode;

public String getMode() {

return mode;

}

public void setMode(String mode) {

this.mode = mode;

}

public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getTel() {

return tel;

}


public void setTel(String tel) {

this.tel = tel;

}


}





//TestAction03.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


public class TestAction03 extends ActionSupport

implements Preparable, ModelDriven<UserDTO03> {

private static final long serialVersionUID = 1L;

//스트러츠2에서 사용하는 데이터 저장소 객체를 지정하는 부분 추가

//클라이언트가 전송한 데이터를 자동 수신하게 된다.

private UserDTO03 dto;

public UserDTO03 getDto() {

return dto;

}

public void setDto(UserDTO03 dto) {

this.dto = dto;

}


@Override

public UserDTO03 getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new UserDTO03();

}

//execute() 메소드 오버라이딩 대신

//사용자 정의 메소드 추가함.

public String sample03() {

if (dto == null

|| dto.getMode() == null

|| dto.getMode().equals("")) {

return INPUT;

}

//액션 코드 추가

return SUCCESS;

}


}





//myStruts03.xml

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

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

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

<struts>


<!-- package 엘리먼트에서 name 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="temp03" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="sample03" class="com.test.TestAction03"

method="sample03">

<!-- result 엘리먼트에서 name 속성은 

메소드 리턴값에 대한 결과 페이지를 결정하는 부분 -->

<result name="input">/send03.jsp</result>

<result name="success">/receive03.jsp</result>

</action>

</package>

</struts>





//struts.xml

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

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

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

<struts>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts03.xml"></include>


</struts>




//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml



//요청주소

http://localhost:8090/Struts2Test/sample03.action


-----------------------------------------

이름과 전화번호를 저장하는 JDBC 프로그램 작성. 

오라클, Struts2, iBatis, JSP 이용.

데이터 입력과 출력을 동시 실행. 


실행 예)

이름 [홍길동        ]

전화번호 [010-123-1234   ]

[ 등록 ]


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------



--------------------------------

//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.

CREATE TABLE member (

mid NUMBER --PK

,name VARCHAR2(10)

,tel VARCHAR2(20)

);


ALTER TABLE member

ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberSeq;



//회원 테이블에 자료 입력. INSERT 쿼리.

//쿼리문의 끝에 ; 표시하지 말것.

//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')


-----------------------------------------


//MemberDTO.java

package com.test;


public class MemberDTO {


private int mid;

private String name, tel;

public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}






//MemberAction.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


import com.util.dao.*;


import java.sql.SQLException;

import java.util.*;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;


public class MemberAction extends ActionSupport

implements Preparable, ModelDriven<MemberDTO> {

private static final long serialVersionUID = 1L;


private MemberDTO dto;


@Override

public MemberDTO getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new MemberDTO();

}

public String member() {

//액션 코드 추가

CommonDAO dao = CommonDAOImpl.getInstance();

//INSERT 쿼리 실행 액션 수행

if (dto.getName() != null

&& !dto.getName().equals("")) {

try {

dao.insertData("mySql.add", dto);

} catch (SQLException e) {

System.out.println(e.toString());

}

}

List<Object> arrayList = dao.getListData("mySql.lists");

HttpServletRequest req = ServletActionContext.getRequest();

req.setAttribute("arrayList", arrayList);

return SUCCESS;

}

}






//member.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>회원 관리</title>


<link rel="stylesheet" type="text/css" href="BasicStyle.css">

<style type="text/css">

.style1 {

text-align: center;

}

</style>


<script type="text/javascript">

function myFunc() {

var obj = document.getElementById("myForm");

//데이터 검사 과정 추가

//데이터 전송

obj.submit();

}

</script>


</head>

<body>

<div>

<div>

<h3>-회원 등록-</h3>

<form method="post" id="myForm">

<table>

<tbody>

<tr>

<td>이름</td>

<td><input type="text" name="name" id="name"></td>

</tr>

<tr>

<td>전화</td>

<td><input type="text" name="tel" id="tel"></td>

</tr>

<tr>

<td></td>

<td>

[<a href="javascript:myFunc()">등록</a>]

<span id="msg" style="font-size:10pt; color:red; display:none;">이름, 전화를 입력해야 합니다.</span>

</td>

</tr>

</tbody>

</table>

</form>

</div>



<div>



<table style="width:400px;" class="style00">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th></tr>

<c:forEach var="dto" items="${arrayList}">

<tr>

<td class="style1">${dto.mid}</td>

<td class="style1">${dto.name}</td>

<td class="style1">${dto.tel}</td>

</tr>

</c:forEach>

</tbody>

</table>

</div>

</div>

</body>

</html>








//struts.xml

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

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

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

<struts>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts03.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="member.xml"></include>


</struts>





//member.xml

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

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

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

<struts>


<!-- package 엘리먼트에서 name 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="member" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="member" class="com.test.MemberAction"

method="member">

<result>/member.jsp</result>

</action>

</package>

</struts>




//sqlMapConfig.xml

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


<!DOCTYPE sqlMapConfig      

    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      

    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">


<sqlMapConfig>


  <settings

    cacheModelsEnabled="false"

    useStatementNamespaces="true"/>


  <!-- Configure a built-in transaction manager.  If you're using an 

       app server, you probably want to use its transaction manager 

       and a managed datasource -->

   <transactionManager type="JDBC" commitRequired="false">

      <dataSource type="SIMPLE">

         <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>

         <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@220.76.176.101:1521:xe"/>

         <property name="JDBC.Username" value="scott"/>

         <property name="JDBC.Password" value="tiger"/>

      </dataSource>

  </transactionManager>


  <!-- List the SQL Map XML files. They can be loaded from the 

       classpath, as they are here (com.domain.data...) -->

  

  <sqlMap resource="com/util/sqlMap/mySqlMap.xml"/>

  

  <!-- List more here...

  <sqlMap resource="com/mydomain/data/Order.xml"/>

  <sqlMap resource="com/mydomain/data/Documents.xml"/>

  -->


</sqlMapConfig>





//mySqlMap.xml

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


<!DOCTYPE sqlMap      

    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      

    "http://ibatis.apache.org/dtd/sql-map-2.dtd">


<!-- sqlMap 엘리먼트에서 namespace의 값을 유일하게 지정할 것 -->    

<sqlMap namespace="mySql">

<!-- id 속성은 쿼리 객체 접근시 식별자로 사용된다. -->

<!-- resultClass 속성은 쿼리 실행 결과를 저장하는 저장소 객체 -->

<!-- SELECT 쿼리의 컬럼 리스트는 MemberDTO의 변수명과 일치해야 한다. -->

<select id="lists" resultClass="com.test.MemberDTO">

SELECT mid, name, tel FROM member ORDER BY mid

</select>

<!-- parameterClass 속성은 외부 데이터를 쿼리에 전달하는 저장소 객체 -->

<!-- #변수명#은 MemberDTO의 변수명과 일치해야 한다. -->

<insert id="add" parameterClass="com.test.MemberDTO">

INSERT INTO member (mid, name, tel) 

VALUES (memberSeq.nextval, #name#, #tel#)

</insert>


</sqlMap>




//요청주소

http://localhost:8090/Struts2Test/member.action



-----------------------------------------------

문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서 

총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성. 

오라클, Struts, iBatis 이용. 

총점 기준 정렬(내림차순) 출력.

ScoreDTO 작성 추가.



판정 기준은

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상

과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격

평균이 60점 미만 -> 불합격


합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.


실행 예)

성적 입력 ----------------

이름 [kim   ]

국어 [80    ]

영어 [90    ]

수학 [80    ]

[ 등록 ]


---------------------------------------

    이름 국어 영어 수학 총점 평균 판정

---------------------------------------

1등 hong 100  100  100  300  100.0 합격

2등 kim   80   90   80  ..    ..   합격

---------------------------------------




//ScoreDTO.java


//ScoreAction.java -> 액션 처리 전용 클래스. 모델 드리븐 방식


//scoreIbatis.xml -> 쿼리문 등록


//scoreStruts.xml -> 서블릿 주소 등록


//sqlMapConfig.xml -> scoreIbatis.xml 파일명 등록


//struts.xml -> scoreStruts.xml 파일명 등록


//Score.jsp -> 인터페이스 JSTL/EL 문법 사용


--------------- 정답 소스

---------------------------------------------

--오라클에 성적 저장용 테이블 생성

CREATE TABLE score (

sid NUMBER --PK, 자동 번호 부여

,name VARCHAR2(10)

,kor NUMBER(3) --CK (0~100)

,eng NUMBER(3) --CK (0~100)

,mat NUMBER(3) --CK (0~100)

);


--제약 조건 추가

ALTER TABLE score

ADD CONSTRAINT score_sid_pk PRIMARY KEY (sid);

ALTER TABLE score

ADD CONSTRAINT score_kor_ck CHECK (kor BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_eng_ck CHECK (eng BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_mat_ck CHECK (mat BETWEEN 0 AND 100);


--자동 번호 부여 시퀀스 객체 생성

CREATE SEQUENCE scoreSeq;



--INSERT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

INSERT INTO score (sid, name, kor, eng, mat)

VALUES (scoreSeq.nextval, 'hong', 100, 100, 100)


--SELECT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

SELECT sid, name, kor, eng, mat

, (kor+eng+mat) AS tot

, (kor+eng+mat)/3 AS ave


--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력

, CASE

WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'

WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'

ELSE '불합격'

END AS grade


FROM score

ORDER BY tot DESC


--scoreView 생성

CREATE OR REPLACE VIEW scoreView

AS

SELECT sid, name, kor, eng, mat

, (kor+eng+mat) AS tot

, (kor+eng+mat)/3 AS ave


--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력

, CASE

WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'

WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'

ELSE '불합격'

END AS grade


FROM score

ORDER BY tot DESC;



--scoreView를 이용한 SELECT 쿼리

SELECT sid, name, kor, eng, mat, tot, ave, grade 

FROM scoreView 

ORDER BY tot DESC


-----------------------------------------

//ScoreDTO.java

package com.test;


public class ScoreDTO {


private String name;

private int kor, eng, mat;


private int tot;

private double ave;

private String grade;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getKor() {

return kor;

}

public void setKor(int kor) {

this.kor = kor;

}

public int getEng() {

return eng;

}

public void setEng(int eng) {

this.eng = eng;

}

public int getMat() {

return mat;

}

public void setMat(int mat) {

this.mat = mat;

}

public int getTot() {

return tot;

}

public void setTot(int tot) {

this.tot = tot;

}

public double getAve() {

return ave;

}

public void setAve(double ave) {

this.ave = ave;

}

public String getGrade() {

return grade;

}

public void setGrade(String grade) {

this.grade = grade;

}

}




//ScoreAction.java -> 액션 처리 전용 클래스. 모델 드리븐 방식.

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


import com.util.dao.*;

import java.sql.*;

import java.util.*;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;


public class ScoreAction extends ActionSupport

implements Preparable, ModelDriven<ScoreDTO> {

private static final long serialVersionUID = 1L;


private ScoreDTO dto;


@Override

public ScoreDTO getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new ScoreDTO();

}

public String score() {

//액션 코드 추가

CommonDAO dao = CommonDAOImpl.getInstance();

//INSERT 쿼리 실행 액션 수행

if (dto.getName() != null

&& !dto.getName().equals("")) {

try {

dao.insertData("score.add", dto);

} catch (SQLException e) {

System.out.println(e.toString());

}

}

List<Object> arrayList = dao.getListData("score.lists");

HttpServletRequest req = ServletActionContext.getRequest();

req.setAttribute("arrayList", arrayList);

return SUCCESS;

}

}





//scoreIbatis.xml -> 쿼리문 등록

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


<!DOCTYPE sqlMap      

    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      

    "http://ibatis.apache.org/dtd/sql-map-2.dtd">


<!-- sqlMap 엘리먼트에서 namespace의 값을 유일하게 지정할 것 -->    

<sqlMap namespace="score">

<!-- id 속성은 쿼리 객체 접근시 식별자로 사용된다. -->

<!-- resultClass 속성은 쿼리 실행 결과를 저장하는 저장소 객체 -->

<!-- SELECT 쿼리의 컬럼 리스트는 ScoreDTO의 변수명과 일치해야 한다. -->

<select id="lists" resultClass="com.test.ScoreDTO">

SELECT sid, name, kor, eng, mat, tot, ave, grade 

FROM scoreView 

ORDER BY tot DESC

</select>

<!-- parameterClass 속성은 외부 데이터를 쿼리에 전달하는 저장소 객체 -->

<!-- #변수명#은 ScoreDTO의 변수명과 일치해야 한다. -->

<insert id="add" parameterClass="com.test.ScoreDTO">

INSERT INTO score (sid, name, kor, eng, mat)

VALUES (scoreSeq.nextval, #name#, #kor#, #eng#, #mat#)

</insert>


</sqlMap>





//scoreStruts.xml -> 서블릿 주소 등록

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

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

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

<struts>


<!-- package 엘리먼트에서 name 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="score" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="score" class="com.test.ScoreAction"

method="score">

<result>/score.jsp</result>

</action>

</package>

</struts>





//sqlMapConfig.xml -> scoreIbatis.xml 파일명 등록

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


<!DOCTYPE sqlMapConfig      

    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      

    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">


<sqlMapConfig>


  <settings

    cacheModelsEnabled="false"

    useStatementNamespaces="true"/>


  <!-- Configure a built-in transaction manager.  If you're using an 

       app server, you probably want to use its transaction manager 

       and a managed datasource -->

   <transactionManager type="JDBC" commitRequired="false">

      <dataSource type="SIMPLE">

         <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>

         <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:xe"/>

         <property name="JDBC.Username" value="scott"/>

         <property name="JDBC.Password" value="tiger"/>

      </dataSource>

  </transactionManager>


  <!-- List the SQL Map XML files. They can be loaded from the 

       classpath, as they are here (com.domain.data...) -->

  

  <sqlMap resource="com/util/sqlMap/scoreIbatis.xml"/>

  

  <!-- List more here...

  <sqlMap resource="com/mydomain/data/Order.xml"/>

  <sqlMap resource="com/mydomain/data/Documents.xml"/>

  -->


</sqlMapConfig>





//struts.xml -> scoreStruts.xml 파일명 등록

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

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

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

<struts>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="scoreStruts.xml"></include>


</struts>




//score.jsp -> 인터페이스

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<style type="text/css">

.subject {

width:80px;

}

.style1 {

text-align: center;

}

.style2 {

text-align: right;

}

</style>


<script type="text/javascript">

function myFunc(obj){

var name = document.getElementById('name');

var kor = document.getElementById('kor');

var eng = document.getElementById("eng");

var mat = document.getElementById("mat");

var msg = document.getElementById("msg");

msg.style.display = "none";

//빈칸 검사

if(name.value == "" || kor.value == "" || eng.value =="" || mat.value==""){

msg.style.display = "inline";

return;

//숫자 검사

if (kor.value.match(/[^0-9]/) || eng.value.match(/[^0-9]/) ||mat.value.match(/[^0-9]/)){

msg.style.display = "inline";

return;

//범위 검사

if(parseInt(kor.value)>100 ||parseInt(eng.value)>100 ||parseInt(mat.value)>100 ){

msg.style.display = "inline";

return;

}

//데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>성적 처리(Struts2, iBatis)</h2>

<form method="post">

이름 <input type="text" name="name" id="name"><br> 

국어 <input type="text" name="kor" id="kor" class="subject"><br>

영어 <input type="text" name="eng" id="eng" class="subject"><br>

수학 <input type="text" name="mat" id="mat" class="subject"><br>

<input type="button" value=" 등록 "

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 국어, 영어, 수학을 입력해야 합니다.<br>국어, 영어, 수학을 0~100 사이의 숫자를 입력해야 합니다.</span>

</form>

<h3>출력 ------------</h3>

<div>

<table border="1" style="width:500px;">

<tbody>

<tr>

<th>등수</th>

<th>이름</th>

<th>국어</th>

<th>영어</th>

<th>수학</th>

<th>총점</th>

<th>평균</th>

<th>판정</th>

</tr>

<c:set var="sid" value="0"></c:set>

<c:forEach var="dto" items="${arrayList}">

<c:set var="sid" value="${sid+1}"></c:set>

<tr>

<td class="style1">${sid}</td>

<td class="style1">${dto.name}</td>

<td class="style2">${dto.kor}</td>

<td class="style2">${dto.eng}</td>

<td class="style2">${dto.mat}</td>

<td class="style2">${dto.tot}</td>

<td><fmt:formatNumber value="${dto.ave}" maxFractionDigits="1"></fmt:formatNumber></td>

<td class="style1">${dto.grade}</td>

</tr>

</c:forEach>

</tbody>

</table>

</div>

</div>

</body>

</html>





//요청주소

http://localhost:8090/Struts2Test/score.action



WRITTEN BY
빨강꼬마

,

예외처리(Exception)


1. 프로그램 실행시 발생하는 오류를 붙잡아주는 기능.


오류 - 문법적인 오류(컴파일 단계에서 체크). 실행 오류(실행 단계에서 체크). 예외(실행 단계에서 체크).


예외 - 탐색기에서 CD드라이브를 더블클릭하는 경우 CD의 내용을 나타나기도 하고(예상 결과), CD를 넣으라는 메시지가 나타나기도(예외 상황) 한다.

예외 처리를 하지 않았다면 CD를 넣지 않은 경우 오류 발생하면서 프로그램이 종료되버린다.


2. Exception 클래스 


- ArithmeticException

- ArrayStoreException

- IndexOutOfBoundsException

- ClassCastException

- NullPointerException


3. 예외 처리 형식


try {


//오류 발생 가능성이 있는 실행문;


} catch(예외종류) {

//처리 방법

}



//Exception 처리 없는 경우

//Sample01.java



//Exception 처리 있는 경우

//Sample02.java






try~catch 구문


1. 예외처리를 담당하는 구문. 예외가 발생할 수 있는 부분을 try 블럭으로 감싸주면 예외처리를 할 수 있다.


2. 형식


형식1 -------

try {

//실행문;

} catch(예외종류) {

//예외처리 

}


형식2 -------

try {

//실행문;

} [catch(하위예외) { //예를들어, FileNotFoundException

//예외처리 

} catch(하위예외) { //예를들어, IOException

//예외처리 

}] catch(상위예외) { //예를들어, Exception

//예외처리 

}



형식3 -------

try {

//실행문;

} catch(예외종류) {

//예외처리 

} [finally {

//예외 발생과 관련없이 항상 실행되는 부분;

}]





//예외가 발생해도 프로그램이 중지되지 않도록 하는 방법-예외 처리

//Sample03.java







예외 발생 가능성 확인

-> 메소드 원형에서 예외 가능성과 종류를 확인할 수 있다.


//Integer.parseInt() 메소드에서 예외 종류 확인

//Sample04.java







throws 구문


1. 예외처리를 담당하는 구문. try~catch는 예외 발생시 try~catch 구문이 처리하지만, throws는 예외 발생시 외부에 예외를 넘기게 된다.


2. 형식


접근지정자 반환자료형 메소드이름(매개변수 리스트)  throws 예외종류 {

//실행문;

//예외 발생 가능성이 있는 문장;

return 값;

}



//예외 처리를 throws 구문으로 처리하는 경우







JDBC (Java DataBase Connectivity)


1. 자바 프로그램이 DBMS에 일관된 방식으로 접근할 수 있도록 제공하는 API.


2. JDBC는 데이터베이스에 접속하기 위해서 한 개의 클래스(java.sql.DriverManager)와 두 개의 인터페이스(java.sql.Driver, java.sql.Connection)을 사용한다.


3. 오라클용 JDBC 드라이버(ojdbc14.jar)를 Java/jdk1.7.XX/jre/lib/ext 폴더와 Java/jre7/lib/ext 폴더에 복사할 것. ojdbc14.jar 파일은 오라클 설치 폴더에서 복사할 수 있음.



//오라클 연결 테스트

//Oracle01.java








//연결 전용 클래스 작성

//DBConn.java



//Oracle02.java








SQL 쿼리 전송 테스트1 (scott 계정)


//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.

CREATE TABLE member (

mid NUMBER --PK

,name VARCHAR2(10)

,tel VARCHAR2(20)

);


ALTER TABLE member

ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberSeq;



//회원 테이블에 자료 입력. INSERT 쿼리.

//쿼리문의 끝에 ; 표시하지 말것.

//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')

//Oracle03.java

package com.test;


import java.sql.*;


public class Oracle03 {


public static void main(String[] args) {

try {

//연결

Connection conn = DBConn.getConnection();

//쿼리 준비

//쿼리 작성시 끝에 ; 표시하지 말것.

String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')");

//쿼리 실행

//Java에서 쿼리를 실행하면 

//내부적으로 COMMIT은 자동 실행됨.

//executeUpdate() 메소드는 DML문인 경우만 실행.

Statement stmt = conn.createStatement();

int count = stmt.executeUpdate(sql);

//결과 출력

System.out.printf("%d개의 행이 입력되었습니다. %n"

, count);

}catch(Exception e) {

System.out.println(e.toString());

}


}


}




//회원 테이블 자료 출력. SELECT 쿼리.

//쿼리문의 끝에 ; 표시하지 말것.

//SELECT mid, name, tel FROM member

//Oracle04.java

package com.test;


import java.sql.*;


public class Oracle04 {


public static void main(String[] args) {

try {

//연결

Connection conn = DBConn.getConnection();

//쿼리 준비

//쿼리 작성시 끝에 ; 표시하지 말것.

String sql = String.format("SELECT mid, name, tel FROM member");

//쿼리 실행

//executeQuery() 메소드는 DQL문인 경우만 실행.

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql); //결과집합

//결과 출력

while(rs.next()) { //row 단위 접근

int mid = rs.getInt("mid"); //column 단위 접근

String name = rs.getString("name");

String tel = rs.getString("tel");

System.out.printf("%d %s %s %n"

, mid, name, tel);

}


//ResultSet 객체 소멸->필수

rs.close();

}catch(Exception e) {

System.out.println(e.toString());

}


}


}






문제) member 테이블의 회원수를 출력하는 프로그램 작성.

//SELECT COUNT(*) AS count FROM member

//Oracle05.java







문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클 이용.

데이터 입력과 INSERT 쿼리 실행을 반복 실행. 입력이 끝나면 SELECT 쿼리와 출력문 실행.


실행 예)

이름 전화번호(1)?홍길동 010-123-1234

이름 전화번호(2)?김길동 010-222-3333

이름 전화번호(3)?-1


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------


//DBConn.java

package com.test;


import java.sql.*;


public class DBConn {

//Singleton pattern

private static Connection dbConn;

public static Connection getConnection()

throws SQLException, ClassNotFoundException {

if (dbConn == null) {


String url = "jdbc:oracle:thin:@localhost:1521:xe";

String user = "scott";

String pw = "tiger";

Class.forName("oracle.jdbc.driver.OracleDriver");

dbConn = DriverManager.getConnection(url, user, pw);


}

return dbConn;

}

public static void close()

throws SQLException {

if (dbConn != null) {

if (!dbConn.isClosed()) {

dbConn.close();

}

}

dbConn = null;

}

}




//Oracle06.java


WRITTEN BY
빨강꼬마

,

- 데이터 타입의 종류
 - 숫자타입: number (정수 및 실수 모두 포함)
          표현범위: number(5) -> -99999 ~ 99999
                    number(3) -> -999 ~ 999
                    number(5,2) -> -999.99 ~ 999.99
                    number(6,3) -> -999.999 ~ 999.999


 - 문자타입
   ①char: 고정형 문자타입
     name char(10) -> name 컬럼에 입력되는 데이터의 크기는 무조건 10Byte로 들어온다. 단, 10Byte가 넘는 데이터는 입력이 불가함.
                          -> 한글의 경우 한글자당 2Byte 영문은 1Byte. (키보드에서 한키로 입력되는 숫자, 영어등은 1Byte. 없는 것은 2Byte)

            ex: '이순신'             -> 10바이트로 고정되서 들어옴
                '김구'               -> 10바이트로 고정되서 들어옴
                '이에리사'           -> 10바이트로 고정되서 들어옴
                '박차고나온애가이뻐' -> 18바이트이므로 입력불가


   ②varchar2: 가변형 문자타입
     name char(10) -> name 컬럼에 입력되는 데이터의 크기는 해당 데이터의 크기만큼 들어온다. 단, 10Byte가 넘는 데이터는 입력이 불가함.

            ex: '이순신'             -> 6바이트로 맞추어 들어옴
                '김구'               -> 4바이트로 맞추어 들어옴
                '이에리사'           -> 8바이트로 맞추어 들어옴
                '박차고나온애가이뻐' -> 18바이트이므로 입력불가

   ③Nchar , Nvarchar2: 크기의 단위가 Byte가 아니라 글자수를 나타냄
            name Nchar(10) -> name 컬럼에 입력되는 데이터의 크기가 유니코드등을 포함하여 글자수 최대 10글자까지 입력됨. 넘으면 당연히 입력 불가

            ex: '이순신'             -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                '김구'               -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                '박차고나온애가이뻐' -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                'John michael'       -> 12개의 글자수(공백포함)이므로 입력불가.
                           
            name Nvarchar2(10) -> name 컬럼에 입력되는 데이터의 크기가 유니코드등을 포함하여 글자수 최대 10글자까지 입력됨. 
                                              넘으면 당연히 입력 불가

            ex: '이순신'             -> 3개의 글자수로 들어옴. -> 6Byte
                '김구'               -> 2개의 글자수로 들어옴. -> 4Byte
                '박차고나온애가이뻐' -> 9개의 글자수로 들어옴. -> 18Byte
                'John michael'       -> 12개의 글자수(공백포함)이므로 입력불가.


 - 날짜타입: date
          date예문:
    select sysdate, current_date from dual;
    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),
    to_char(current_date, 'yyyy-mm-dd hh24:mi:ss')  from dual;

※ 컬럼명에 숫자가 들어온다 하더라도 가장 앞에 숫자 0이 들어올 수 있는 개연성이 있을 경우 number 형이 아닌 문자형으로 지정하여야 한다
※ 문자는 시작과 끝에 반드시 '을 사용해야 함. 사용하지 않을 경우 숫자로 인식함.


- table에 대한 comment 처리문
comment on table [table명] is '[주석내용]';

- table내 각 column에 대한 comment 처리문
comment on column [table명].[table내 주석처리할 column명] is '[주석내용]';


- 특정 테이블에 있는 각 컬럼에 대한 주석확인 처리문

select column_name, comments
from user_col_comments
where table_name = '[table명]';



- 특정 테이블의 컬럼명과 데이터 타입 조회 명령어

describe [table명];
혹은
desc [table명];



- 특정 테이블 데이터 조회
select * from [table명];



- 데이터 입력하기
insert into [table명] values([column1 데이터], [column2 데이터], ~~~~~~~, [마지막 column 데이터]);




※ insert 명령어로 입력한 데이터는 디스크에 기록되는 것이 아닌 메모리에 기록하는 것. commit으로 디스크에 기록함



- 데이터 변경하기
update [table명] set [변경할 컬럼명1] = [변경할 데이터], [변경할 컬럼명2] = [변경할 컬럼명2] + [변경할 데이터] where [변경대상인 컬럼행] = [변경대상의 컬럼 데이터];



※ where 구문이 없을 경우 모든 행의 해당 컬럼이 변경됨
※ 변경 데이터중, X = X + 200 으로 예를 들면 X컬럼에 있는 값과 200을 합산한 결과 데이터를 최종데이터로 치환한다는 의미임
※ update 명령어로 변경한 데이터는 디스크에 기록되는 것이 아닌 메모리에 기록하는 것. commit으로 디스크에 기록함



- 데이터 삭제하기
delete [table명] where [삭제할 컬럼행] = [삭제할 컬럼행에 있는 열 데이터];




※ delete 명령어로 삭제한 데이터는 디스크에서 삭제하는 것이 아닌 메모리에서 삭제하는 것. commit으로 디스크에서 삭제함.



- commit
메모리에 상주된 데이터를 디스크에 기록하는 명령어
ex: commit;

- rollback
메모리에 상주된 데이터를 삭제하는 명령어
ex: rollback;


WRITTEN BY
빨강꼬마

,