카테고리 없음
jsp 사용 회원가입창 만들기/ DB연결 / ojdbc6 위치(WEB-INF /lib)
장꾸꾸
2020. 11. 11. 18:58
* txt 파일은 엑셀에서 ctl로 다시 저장할 수 있다
* 서버문제 500 뜨는 경우 ojdbc 경로가 잘못됐을 경우를 생각해봐야함
특히 web의 META-INF에 오라클을 자동으로 불러오는 xml파일을 작성하는 경우 꼭 넣어줘야 함
jerryjerryjerry.tistory.com/57
[Oracle] Oracle DB(11g)와 Eclipse (JDBC) 연동하기
* Oracle DB와 Eclipse 연동을 해보자 - 필자의 Oracle version은 11g 버전입니. 다른 버전은 이 포스팅과 조금 다를수도 있으므로 참고하길 바랍니다. - 이 포스팅을 따라하기 위해선 Oracle 11g version과 SQLDe..
jerryjerryjerry.tistory.com
* 서버문제 500 뜨는 경우 ojdbc 경로가 잘못됐을 경우를 생각해봐야함
특히 web의 META-INF에 오라클을 자동으로 불러오는 xml파일을 작성하는 경우 꼭 넣어줘야 함
* 데이터 흐름
register.html |
registerProc.jsp | registerInsert.jsp |
아이디중복체크 > #sid > idCheck.jsp - ,jQueryAjax이용 - #idok 를 jsp로 가져가서 글자크기와 문구를 바꿔줌 비밀번호 일치여부 > jQuery이용 필수입력 체크 > registerCheck.js ID/PASS1,2/NAME >register.heml의 "regForm"을 registerCheck.js에서 체크한 뒤 submit |
회원가입 정보 확인 > submit해서 registerInsert.jsp로 데이터를 보냄 |
회원정보 DB에 저장 > |
RegisterEntity.java - 회원정보 Entity - Setter/Getter |
* ZIPCODE (우편번호 넣기)
GUIDELINE
※ 오라클 우편번호 넣기
(1)콘솔창에서 우편번호스키마만들기
$ sqlplus edu/1234
create table zipcode(
seq number(5,0) not null,
zipcode varchar2(7) not null,
sido varchar2(6) not null,
gugun varchar2(30),
dong varchar2(50),
ri varchar2(80),
bunji varchar2(20),
constraint zipcode_pk primary key(seq));
(2) www.zipfinder.co.kr에서 type2를 다운로드
- 엑셀에서 zipcode.txt --> zipcode.csv로 변환한후 c:\에 복사할것
(3)C:\oraclexe\app\oracle\product\11.2.0\server\BIN 밑에
zipcode.ctl 파일을 작성한다 (마지막에 ; 를 넣으면 안됨)
load data
infile 'c:/zipcode.csv'
insert
into table zipcode
fields terminated by ","
TRAILING NULLCOLS
(zipcode,
sido,
gugun,
dong,
ri,
bunji,
seq)
(4) 콘솔창(관리자모드로 실행)을 띄운후
$ cd C:\oraclexe\app\oracle\product\11.2.0\server\BIN
$ sqlldr userid=edu/1234 control=zipcode.ctl log=zipcode.log
[형식]
sqlldr userid=[오라클아이디]/[오라클비번] control=zipcode.ctl log=zipcode.log와 같이 입력함
(5)테스트
SQL> select count(*) from zipcode; -- 52144
* context.xml(META-INF경로)
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/ora"
author="Container"
type="javax.sql.DataSource"
username="edu"
password="1234"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:XE">
</Resource>
</Context>
<!--
커넥션 풀(Connection Pool)
데이터베이스 연결을 미리 해두고 프로그램에서는 미리 연결된 객체를 받아다가 사용하고 반환하는 방법
일반 코드로 데이터베이스 연결과 해제를 직접 관리하는 것은 어려운 작업이기 때문에 이러한 방법을 사용합니다.
특별한 경우를 제외하고는 자바에서 데이터베이스 연동을 할 때는 이 방법을 사용합니다.
스프링이나 마이바티스와 같은 프레임워크도 연결은 이 방법을 사용합니다.
다른 프레임워크를 사용하지 않는 경우에는 연결에 필요한 옵션을 META-INF 폴더의 context.xml 파일에 작성합니다.
공공기관이 아닌 작은 규모의 기업 프로젝트에서는 프레임워크를 사용하지 않는 경우가 종종 있는데 그 경우에는
이 방법을 통해서 데이터베이스 연동을 합니다.
java:comp/env은 모든 설정된 엔트리와 자원(Resource)은
JNDI namespace 의 java:comp/env 부분에 놓이게 되고 자원에 대해
접근하려면 lookup("java:comp/env")을 통해 로컬리소스에 접근한다.
context.xml 작성 요령
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="사용자가 정한 이름"
auth="Container"
type="javax.sql.DataSource"
driverClassName="데이터베이스 종류"
url="데이터베이스 위치"
username="아이디"
password="비밀번호"
factory=
"org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
maxActive="동시 접속 개수"
maxIdle="작업은 수행하지 않고 미리 연결만 해둘 최대 개수" />
</Context>
참고 : http://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html
<Resource
name="jdbc/mysql"
author="Container"
type="javax.sql.DataSource"
username="root"
password="123456"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC">
</Resource>
-->
RegisterEntity.java
package register;
public class RegisterEntity {
private String mem_id;
private String mem_passwd;
private String mem_name;
private String mem_email;
private String mem_phone;
private String mem_zipcode;
private String mem_addr;
public String getMem_zipcode() {
return mem_zipcode;
}
public void setMem_zipcode(String mem_zipcode) {
this.mem_zipcode = mem_zipcode;
}
public String getMem_addr() {
return mem_addr;
}
public void setMem_addr(String mem_addr) {
this.mem_addr = mem_addr;
}
public String getMem_id() {
return mem_id;
}
public void setMem_id(String mem_id) {
this.mem_id = mem_id;
}
public String getMem_passwd() {
return mem_passwd;
}
public void setMem_passwd(String mem_passwd) {
this.mem_passwd = mem_passwd;
}
public String getMem_name() {
return mem_name;
}
public void setMem_name(String mem_name) {
this.mem_name = mem_name;
}
public String getMem_email() {
return mem_email;
}
public void setMem_email(String mem_email) {
this.mem_email = mem_email;
}
public String getMem_phone() {
return mem_phone;
}
public void setMem_phone(String mem_phone) {
this.mem_phone = mem_phone;
}
}
register.html
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="registerCheck.js"></script>
<script>
$(document).ready(function(){
//jQueryAjax이용-----아이디중복체크 (중복여부에 따라 안내문구 #idok 변화)
$('#sid').keyup(function(){
var send="sid="+$('#sid').val();
$.post(
"idCheck.jsp",
send,
function(data){
$('#idok').html(data);
});
});
//jQuery이용---------비밀번호 일치 체크
$("#passwd").keyup(function(){
pw1=$("#passwd").val();
if(pw1 != ""){
$("#pwd1").html("");
}
});
$("#repasswd").keyup(function(){
pw1=$("#passwd").val();
pw2=$("#repasswd").val();
if(pw1==pw2){
$("#pwd2").text("비밀번호가 일치합니다").css({'font-weight':'bold','color':'green'});
}else{
$("#pwd2").text("비밀번호가 일치하지 않습니다").css({'font-weight':'bold','color':'red'});
}
});
});
</script>
</head>
<body>
<form name="regForm" method="post" action="registerProc.jsp">
<table width="80%" align="center" border="0" cellspacing="0" cellpadding="5" >
<tr>
<td align="center" valign="middle" >
<table width="90%" border="1" bgcolor="#FFFFCC" cellspacing="0" cellpadding="2" align="center">
<tr align="center" bgcolor="#996600">
<td colspan="3"><font color="#FFFFFF"><b>회원 가입</b></font></td>
</tr>
<tr>
<td width="24%">*아이디</td>
<td width="35%"> <input type="text" name="mem_id" size="15" id="sid"> </td>
<td width="41%" id="idok">아이디를 적어 주세요.</td>
</tr>
<tr>
<td>*패스워드</td>
<td> <input type="password" name="mem_passwd" size="15" id="passwd"> </td>
<td id="pwd1">패스워드를 적어주세요.</td>
</tr>
<tr>
<td>*패스워드 확인</td>
<td> <input type="password" name="mem_repasswd" size="15" id="repasswd"> </td>
<td id="pwd2">패스워드를 확인합니다.</td>
</tr>
<tr>
<td>*이름</td>
<td> <input type="text" name="mem_name" size="15"> </td>
<td>고객실명을 적어주세요.</td>
</tr>
<tr>
<td>이메일</td>
<td> <input type="text" name="mem_email" size="27"> </td>
<td>이메일을 적어주세요</td>
</tr>
<tr>
<td>전화번호</td>
<td> <input type="text" name="mem_phone" size="20"> </td>
<td>연락처를 적어주세요</td>
</tr>
<tr>
<td>주소</td>
<td colspan="2">
<input type="text" name="post1" size="3" maxlength="3"> -
<input type="text" name="post2" size="3" maxlength="3">
<input type="button" name="search" value="우편번호 검색"
onclick="javascript:window.open('postSearch.jsp','','width=380,height=500,scrollbars=yes')"><br>
<input type="text" name="mem_addr" size="50">
</td>
</tr>
<tr>
<td colspan="3" align="center">
<input type="button" value="회원가입" onclick="check()">
<input type="reset" value="다시쓰기">
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
>> idCheck.jsp (DB접속해서 int n으로 중복여부 표시 #idok 여기서 바꿈)
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- id : <%=request.getParameter("sid")%> --%>
<%
String id=request.getParameter("sid");
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
DataSource ds=null;
/* try{
Context context=new InitialContext();
Context env=(Context)context.lookup("java:comp/env");
ds=(DataSource)env.lookup("jdbc/ora");
//또는 ds=(DataSource)env.lookup("java:comp/env/jdbc/ora");
conn=ds.getConnection();
conn.setAutoCommit(false);
}catch(SQLException e){
e.printStackTrace();
}
*/
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:XE",
"edu", "1234");
conn.setAutoCommit(false);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
//-------------------------------------------------------------------
int n=0; //결과 반환
if(!id.equals("") && id != null){
try{
String sql="SELECT COUNT(ID) FROM MEMBER WHERE ID=?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
rs=pstmt.executeQuery();
if(rs.next()){
n=rs.getInt(1); //컬럼명을 사용할수 없을때는 인덱스번호를 이용
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}catch(SQLException e){}
}
} //end if
if(n > 0){
%>
<span style="color:red;font-weight:bold;">사용중</span>인 아이디 입니다
<%
}else{
%>
<span style="color:green;font-weight:bold;">사용가능</span>한 아이디 입니다
<%
}
%>
</body>
</html>
>>registerCheck.js(*필수입력요소 다 채웠는지 체크)
function check(){
if(regForm.mem_id.value==""){ //or if(document.getElementById("id").value=="")
alert("ID를 입력하시오");
regForm.mem_id.focus();
return;
}
if(regForm.mem_passwd.value==""){
alert("Password를 입력하시오");
regForm.mem_passwd.focus();
return;
}
if(regForm.mem_repasswd.value==""){
alert("Password를 한번 더 입력하시오");
regForm.mem_repasswd.focus();
return;
}
if(regForm.mem_name.value==""){
alert("Name을 입력하시오");
regForm.mem_name.focus();
return;
}
document.regForm.submit();
}
registerProc.jsp(입력정보 확인창)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<html>
<head><title>회원가입 확인</title></head>
<jsp:useBean id="ob" class="register.RegisterEntity" scope="session"/>
<!-- scope="session"는 페이지 이동시 정보가 날아가지 않도록 할당해서 갖고 있기 위한 명령어 -->
<jsp:setProperty property="*" name="ob"/>
<%
String post1=request.getParameter("post1");
String post2=request.getParameter("post2");
ob.setMem_zipcode(post1 + "-" + post2);
%>
<body>
<form name="regForm" method="post" action="registerInsert.jsp">
<table width="80%" align="center" border="0" cellspacing="0" cellpadding="5">
<tr>
<td align="center" valign="middle" >
<table width="90%" border="1"bgcolor="#FFFFCC" cellspacing="0" cellpadding="2"
align="center">
<tr align="center" bgcolor="#996600">
<td colspan="3">
<font color="#FFFFFF"><b>
[<jsp:getProperty property="mem_name" name="ob"/>]회원님이 작성하신 내용입니다. 확인해 주세요</b>
</font>
</td>
</tr>
<tr>
<td width="24%">아이디</td>
<td width="41%"><%=ob.getMem_id()%></td>
</tr>
<tr>
<td>패스워드</td>
<td><%=ob.getMem_passwd()%></td>
</tr>
<tr>
<td>이름</td>
<td><%=ob.getMem_name()%></td>
</tr>
<tr>
<td>이메일</td>
<td><%=ob.getMem_email()%></td>
</tr>
<tr>
<td>전화번호</td>
<td><%=ob.getMem_phone()%></td>
</tr>
<tr>
<td>주소</td>
<td>(<%=ob.getMem_zipcode()%>)<%=ob.getMem_addr()%></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="확인완료">
<input type="button" value="다시쓰기" onClick="history.back()"></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
registerInsert.jsp
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="ob" class="register.RegisterEntity" scope="session"/>
<jsp:setProperty property="*" name="ob"/>
<%
Connection conn=null;
DataSource ds=null;
/*
try{
Context context=new InitialContext();
Context env=(Context)context.lookup("java:comp/env");
ds=(DataSource)env.lookup("jdbc/ora");
//또는 ds=(DataSource)env.lookup("java:comp/env/jdbc/ora");
conn=ds.getConnection();
conn.setAutoCommit(false);
}catch(SQLException e){
e.printStackTrace();
} */
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:XE",
"edu", "1234");
conn.setAutoCommit(false);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
//--------------------------------------------------------------
PreparedStatement pstmt=null;
int n=0;
try{
String sql="INSERT INTO MEMBER VALUES(?,?,?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,ob.getMem_id());
pstmt.setString(2,ob.getMem_passwd());
pstmt.setString(3,ob.getMem_name());
pstmt.setString(4,ob.getMem_email());
pstmt.setString(5,ob.getMem_phone());
pstmt.setString(6,ob.getMem_zipcode());
pstmt.setString(7,ob.getMem_addr());
n=pstmt.executeUpdate();
if(n > 0)
conn.commit();
}catch(SQLException e){
e.printStackTrace();
try{
conn.rollback();
}catch(SQLException e1){}
}finally{
try{
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}catch(SQLException e){}
}
if(n > 0){
%>
<b><%=ob.getMem_name()%></b>님 회원가입 되셨습니다
<%
}
%>
</body>
</html>
register.sql
--테이블명 : member
--id :varchar2(10) primary key
--passwd : varchar2(10)널 허용X
--name : varchar2(20) 널 허용 X
--email : varchar2(30)
--phone : varchar2(15)
--zipcode : varchar2(7)
--addr : varchar2(70)
drop table member purge;
create table member(
id varchar2(10) primary key,
passwd varchar2(10) not null,
name varchar2(20) not null,
email varchar2(30),
phone varchar2(15),
zipcode varchar2(7),
addr varchar2(70));
select * from tab;
select * from member;
select * from zipcode;
update ZIPCODE set ri=' ' where ri is NULL;
update ZIPCODE set bunji=' ' where bunji is NULL;
commit
select * from zipcode where dong like '%신사동%';
SELECT COUNT(*) FROM MEMBER WHERE ID='abcd';
select count(*) from zipcode;