작성일
20231124, 20231130, 20231201, 20231202
하단 Servers 창에서 Tomcat을 설정합니다. 시험에서 주어진 버전은 8입니다.
: [File]-[New]-[Dynamic Web Project]을 클릭한 후 Project name에 프로젝트명으로 HRD_비번호
을 입력하면 됩니다. 이때 비번호는 시험장에서 주어지는 명찰에 해당합니다.
이클립스 상단 바의 [Window-Proference]에서 java, jsp, html, css, text 파일의 기본 인코딩을 UTF-8로 지정하도록 합니다. 해당 환경설정 내용은 시험지에 주어지므로 암기할 필요는 없습니다.
JDBC(Java DataBase Connectivity)는 자바 프로그램에서 관계형 데이터베이스를 연동하기 위해 제공되는 표준 API, java.sqp 패키지를 가리킨다. 이 API를 사용하면 DBMS에 종속되지 않는 프로그램을 개발할 수 있다는 장점이 있다.
그러나 JDBC를 사용하기 위해서는 매번 드라이버 등록, Concection 연결, PreparedStatement 생성, SQL 전송, 연결 해제
과 같은 절차를 파일마다 작성해야 하며, 이는 데이터 중복의 문제와 수정·삭제·조회를 할 시 작업을 여러 번 수행해야 한다는 문제가 발생한다.
때문에 이를 보완하기 위해 우리는 Connection 관련 작업 즉, 특정 데이터베이스로부터 Connection을 획득
하는 별도의 클래스로 분리하여 코드의 재사용성을 높이고자 합니다.
JDBCUtil(Util 클래스)는 시험에서 모두 주어지므로 암기의 대상이 아닙니다. 다만 이 클래스가 무엇을 위한 것인지는 아는 게 전체적인 프로그램 작성의 이해에 도움된다고 생각합니다.
// Util.java
package DBPKG;
import java.sql.*;
public class Util {
public static Connection getConnection() throws Exception {
Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE", "system", "1234");
return con;
}
}
C:\Users\feshe>
sqlplus
SQL*Plus: Release 11.2.0.2.0 Production on 일 10월 22 22:12:07 2023
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Enter user-name:system
Enter password:1234
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL>
CF. cmd 명령어 모음집
모든 계정에 대한 정보 확인 :select * from all_users;
현재 사용자 확인 :show user;
테이블 전체 조회 :select * from tab;
create table member_tbl_02 (
custno number(6) not null primary key,
custname varchar2(20),
phone varchar2(13),
address varchar2(60),
joindate date,
grade char(1),
city char(2)
);
create table money_tbl_02 (
custno number(6),
salenol number(8) not null primary key,
pcost number(8),
amount number(4),
price number(8),
pcode varchar2(4),
sdate date
);
create sequence seq_no
increment by 1
start with 100001;
drop sequence seq_no;
insert into member_tbl_02 values(seq_no.nextval, '김행복', '010-1111-2222', '서울 동대문구 휘경 1동', '20151202', 'A', '01');
insert into member_tbl_02 values(seq_no.nextval, '이축복', '010-1111-3333', '서울 동대문구 휘경 2동', '20151206', 'B', '01');
insert into member_tbl_02 values(seq_no.nextval, '장믿음', '010-1111-4444', '울릉군 울릉읍 독도 1리', '20151001', 'B', '30');
insert into member_tbl_02 values(seq_no.nextval, '최사랑', '010-1111-5555', '울릉군 울릉읍 독도 2리', '20151113', 'A', '30');
insert into member_tbl_02 values(seq_no.nextval, '진평화', '010-1111-6666', '제주도 제주시 외나무골', '20151225', 'B', '60');
insert into member_tbl_02 values(seq_no.nextval, '차공단', '010-1111-7777', '제주도 제주시 감나무골', '20151211', 'C', '60');
insert into member_tbl_02 values(seq_no.nextval, '박아연', '010-1111-8888', '서울 동대문구 휘경 1동', '20150526', 'B', '12');
insert into money_tbl_02 values('100001', '20160001', '500', '5', '2500', 'A001', '20230501');
insert into money_tbl_02 values('100001', '20160002', '1000', '2', '2000', 'A002', '20230521');
insert into money_tbl_02 values('100002', '20160003', '1000', '2', '2000', 'A002', '20230521');
insert into money_tbl_02 values('100003', '20160004', '10000', '5', '50000', 'A007', '20230603');
insert into money_tbl_02 values('100006', '20160005', '1500', '2', '3000', 'A011', '20231201');
commit;
select * from member_tbl_02;
select * from money_tbl_02;
drop table money_tbl_02;
describe member_tbl_02;
describe money_tbl_02;
참고로 JSP와 함께 대표적인 서버에서 사용자 요청을 처리하는 자바 기술로 불리는 서블릿
은 자바 코드 사이에 HTML 디자인이 포함되는 구조라면, JSP
는 HTML 디자인 사이에 자바 코드가 추가되는 구조를 따릅니다. 때문에 서블릿의 단점이었던 화면의 유지보수성을 높여줍니다.
CF. 만약 아래와 같은 에러가 발생할 경우 아래 링크 참조
<!--header.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>header</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<header>
<h1>쇼핑몰 회원관리 ver 1.0</h1>
</header>
<nav>
<ul>
<li><a href="insert.jsp">회원등록</a></li>
<li><a href="member.jsp">회원목록조회/수정</a></li>
<li><a href="price.jsp">회원매출조회</a></li>
<li><a href="index.jsp">홈으로.</a></li>
</ul>
</nav>
</body>
</html>
<!--footer.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>footer</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<footer>
<p>HRDKOREA Copyright©20231201 All rights reserved. Human Resources Development Service of Korea </p>
</footer>
</body>
</html>
<!--index.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>홈페이지(index.jsp)</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<%@ include file="header.jsp"%>
<section>
<h2>쇼핑몰 회원관리 프로그램 </h2><br>
<p>
쇼핑몰 회원정보의 회원매출정보 데이터베이스를 구축하고 회원관리 프로그램을 작성하는 프로그램이다.<br>
프로그램 작성 순서<br>
1. 회원정보 테이블을 생성한다.<br>
2. 매출정보 테이블을 생성한다.<br>
3. 회원정보, 매출정보 테이블에 서시된 문제지의 참조데이터를 추가생성한다.<br>
4. 회원정보 입력 화면 프로그램을 작성한다.<br>
5. 회원정보 조회 프로그램을 작성한다.<br>
6. 회원매출정보 조회 프로그램을 작성한다.<br>
</p>
</section>
<jsp:include page="footer.jsp"></jsp:include>
</body>
</html>
/* style.css*/
@charset "UTF-8";
* {margin:0; padding:0}
a {color:white; text-decoration:none; font-weight: bold;}
header {
color: rgb(100,100,100);
background: ivory;
text-align: center;
padding-top: 50px;
padding-bottom: 50px;
}
nav {
background: rgba(100,0,0,0.5);
text-align: center;
padding-top: 7px;
padding-bottom: 7px;
}
nav ul li {
list-style-type:none;
display: inline-block;
margin-left: 15px;
margin-right: 15px;
}
section {
color: rgb(80,80,80);
background: rgba(100,100,100,0.1);
padding: 50px;
}
section h2 {
text-align: center;
margin-bottom: 40px;
}
footer p {
font-weight: bold;
color:white;
background: rgba(100,0,0,0.5);
text-align: center;
padding-top: 7px;
padding-bottom: 7px;
}
스크립트릿(Scriptlet) 태그 <% %>
jsp 파일에서 java 코드 삽입하기
표현식(Expression) 태그 <%= %>
jsp 파일에서 java 코드를 사용하여 값 출력하기
디렉티브(Directive) 태그 <%@ %>
종류 01. 페이지 디렉티브 <%@ page %>
: 주로 페이지의 언어, 콘텐츠 타입, 인코딩
EX. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
EX. <%@ page import=“java.sql.*” %>
종류 02. 인클루드 디렉티브 <%@ includepage %> : 주로 다른 파일을 삽입할 때 사용
EX. <%@ include file=“header.jsp”%>
<!--member.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--2-3) Util 클래스 임포트-->
<%@ page import="DBPKG.Util"%>
<!--3-2) Util 외의 데이터베이스 관련 패키지 전부 임포트-->
<%@ page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--2-2) Util 클래스 임포트-->
<%@ page import="DBPKG.Util"%>
<!--3-2) Util 외의 데이터베이스 관련 패키지 전부 임포트-->
<%@ page import="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보조회(member.jsp)</title>
<style>
body {margin: 0;}
table {margin: 0 auto; border-color: ivory; text-align: center;}
table tr th, td {padding: 5px;}
</style>
</head>
<body>
<jsp:include page="header.jsp"></jsp:include>
<section>
<h2>회원목록조회/수정</h2>
<form>
<table border="1">
<tr>
<th>회원번호</th>
<th>회원성명</th>
<th>전화번호</th>
<th>주소</th>
<th>가입일자</th>
<th>고객등급</th>
<th>거주지역</th>
</tr>
<!--스크립트릿(Scriptlet, JSP에서 자바 코드 삽입하기)-->
<%
//1) 클라이언트 요청 인코딩 설정하기
request.setCharacterEncoding("utf-8");
//2-3) conn 초기화 필요
Connection conn = null;
//4-2) pstmt 초기화 필요
PreparedStatement pstmt = null;
//5-2) rs 초기화 필요
ResultSet rs = null;
try {
//2-1) 데이터베이스 연결을 위해 Util에서 획득한 Connection 객체 가져오기
conn = Util.getConnection();
//3) 테이블의 전체 데이터를 가져오는 SQL 쿼리문 정의
String sql = "select * from member_tbl_02 order by custno";
//4-1) 얻어온 Connection 클래스를 통해 SQL 쿼리 실행을 위한 Statement 객체 생성
pstmt = conn.prepareStatement(sql);
//4-3) sql 쿼리가 올바르게 생성되었는지 확인하기 위해 출력
System.out.println("SEARCH SQL: " + sql);
//5-1) Statement 객체를 사용하여, SQL 쿼리문 실행을 위한 ResultSet 객체 정의
//ResultSet은 데이터베이스 쿼리의 결과 집함을 나타내는 java 인터페이스로, executeQuery() 메서드를 통해 실행된 select 쿼리의 결과가 ResultSet 객체로 반환된다.
rs = pstmt.executeQuery();
while(rs.next()) {
%>
<tr>
<!--6) 회원번호 : 회원정보 수정링크-->
<!--결과집합에서 어떤 행을 수정할지를 가리키기 위해 URL에 쿼리스트링 방식을 사용-->
<td style="background: rgba(100,0,0,0.5)"><a href="modify.jsp?mod_custno=<%= rs.getString("custno") %> ">
<!--7) 표현식(Expression, JSP에서 자바 코드를 사용하여 값 출력하기)-->
<%=rs.getString("custno") %>
</a></td>
<td><%=rs.getString("custname") %></td>
<td><%=rs.getString("phone") %></td>
<td><%=rs.getString("address") %></td>
<td><%=rs.getString("joindate").substring(0,10)%></td>
<td><%=rs.getString("grade") %></td>
<td><%=rs.getString("city") %></td>
</tr>
<%
}//while
}//try
//8) 예외가 발생하면 콘솔 창에 예외정보 출력
catch(Exception e) {
e.printStackTrace();
}//catch
finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
%>
</table>
</form>
</section>
<jsp:include page="footer.jsp"></jsp:include>
</body>
</html>
<!--modify.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="DBPKG.Util" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보 수정 (modify.jsp)</title>
<link href="style.css" rel="stylesheet" type="text/css">
<style>
table {margin: 0 auto; border-color: ivory; text-align: center;}
table tr th, td {padding: 5px;}
.button {color: white; background:rgba(100,0,0,0.5); padding:5px; border-color:white;}
</style>
<!--10) 자바스크립트 연동-->
<script src="action.js"></script>
</head>
<body>
<%@ include file="header.jsp"%>
<%
//1) 데이터베이스 관련 공통코드 및 변수 초기화
request.setCharacterEncoding("utf-8");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//2) HTTP 요청(렌더링할 회원정보 값을 특정하기 위해)에서 mod_custno라는 파라미터(매개변수)의 값 가져오기
String mod_custno = request.getParameter("mod_custno");
System.out.println("MODIFIED CUSTNO: " + mod_custno);
//7) 각 변수 초기화
String custname = "";
String phone ="";
String address = "";
Date joindate;
String grade ="";
String city="";
String joindateStr="";
try {
//3) 데이터베이스 관련 공통코드
conn = Util.getConnection();
//4) 1개의 행의 데이터(1명의 회원정보)를 가져오는 SQL 쿼리문
String sql = "SELECT * FROM member_tbl_02 WHERE custno = " + mod_custno ;
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
//5) 처음에는 ResultSet의 커서가 첫 번째 행의 이전에 위치하므로, rs.next()를 호출한 후에야 첫 번째 행에 이동
rs.next();
//6) 수정하기 전 기존의 값을 렌더링하기 위해 ResultSet에서 각각의 값을 가져와 변수에 저장
mod_custno = rs.getString("custno");
custname = rs.getString("custname");
phone = rs.getString("phone");
address = rs.getString("address");
joindate= rs.getDate("joindate");
grade = rs.getString("grade");
city = rs.getString("city");
//7) 데이터베이스에서 가져온 날짜 데이터를 원하는 형식으로 변환하는 자바 코드
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//8) 위에서 날짜 포맷 변환을 통해 얻은 문자열
joindateStr = dateFormat.format(joindate);
}catch (Exception e) {
e.printStackTrace();
}
%>
<section>
<h2>홈쇼핑 회원 정보 수정</h2>
<!--11) 사용자로부터 데이터를 수집하는 데에 사용되는 form 태그를 사용하며, 서버로 수정된 데이터를 전송하는 데에 목적을 두기 때문에 해당 form 태그에서 사용되는 HTTP 메서드를 method 속성으로 정의했다. 또한 해당 폼이 submit될 때 데이터가 전송될 URL(mode.jsp)을 action 속성으로 지정하였다.-->
<form method="post" action="mode.jsp" name="frm">
<input type="hidden" name="mode" value="modify">
<table border="1">
<tr>
<th>회원번호</th>
<!--name 속성은 폼이 서버로 제출될 때 해당 입력 필드의 이름과 값이 함께 전송되며, 서버에서는 이 이름을 사용하여 해당 필드의 값을 식별하고 request.getParameter("custno")를 통해 접근하게 된다-->
<td><input type="text" name="custno" value="<%=mod_custno %>" readonly></td>
</tr>
<tr>
<th>회원성명</th>
<td><input type="text" name="custname" value="<%=custname %>"></td>
</tr>
<tr>
<th>회원전화</th>
<td><input type="text" name="phone" value="<%=phone %>"></td>
</tr>
<tr>
<th>회원주소</th>
<td><input type="text" name="address" value="<%=address %>"></td>
</tr>
<tr>
<th>가입일자</th>
<td><input type="text" name="joindate" value="<%=joindateStr %>"></td>
</tr>
<tr>
<th>고객등급 [A:VIP B:일반 C:직원]</th>
<td><input type="text" name="grade" value="<%=grade %>"></td>
</tr>
<tr>
<th>도시코드</th>
<td><input type="text" name="city" value="<%=city %>"></td>
</tr>
<tr>
<td colspan="2">
<!--9) 수정 및 조회 버튼을 눌렀을 때의 동작 함수 지정-->
<input class="button" type="submit" value="수정" onclick="return modify()">
<input class="button" type="button" value="조회" onclick="return search()">
</td>
</tr>
</table>
</form>
</section>
<%@ include file="footer.jsp" %>
</body>
</html>
// action.js
//modify.jsp
function search() {
window.location = "member.jsp";
}
function modify() {
alert("회원정보 수정 성공");
}
//insert.jsp
function check() {
//회원성명이 입력되지 않았으면 alert
if(document.form.custname.value.length==0) {
alert("회원성명이 입력되지 않았습니다");
frm.custname.focus();
}
else if(document.form.phone.value.length==0) {
alert("전화번호가 입력되지 않았습니다");
frm.phone.focus();
}
else if(document.form.address.value.length==0) {
alert("주소가 입력되지 않았습니다");
frm.address.focus();
}
else if(document.form.joindate.value.length==0) {
alert("가입일자가 입력되지 않았습니다");
frm.joindate.focus();
}
else if(document.form.grade.value.length==0) {
alert("고객등급이 입력되지 않았습니다.");
frm.grade.focus();
}
else if(document.form.city.value.length==0) {
alert("도시코드가 되지 않았습니다.");
frm.city.focus();
}
success();
}
function success() {
alert("회원등록에 성공하였습니다.");
}
<!--mode.jsp : 회원정보에 대한 데이터베이스 작업을 처리하는 역할-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="DBPKG.Util"%>
<%@page import="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>action</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String mode = request.getParameter("mode");
String custno = request.getParameter("custno");
String custname = request.getParameter("custname");
String phone = request.getParameter("phone");
String address = request.getParameter("address");
String joindate = request.getParameter("joindate");
String grade = request.getParameter("grade");
String city = request.getParameter("city");
try{
conn = Util.getConnection();
String sql="";
switch(mode) {
case "insert" :
// 최대 custno를 쿼리하는 대신 데이터베이스에서 자동으로 증가하는 열 사용
sql = "INSERT INTO member_tbl_02 VALUES (?, ?, ?, ?, ?, ?, ?)";
System.out.println("INSERT SQL:" + sql);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, custno);
pstmt.setString(2, custname);
pstmt.setString(3, phone);
pstmt.setString(4, address);
pstmt.setString(5, joindate);
pstmt.setString(6, grade);
pstmt.setString(7, city);
pstmt.executeUpdate();
System.out.println("성공");
%>
<jsp:forward page="member.jsp"/>
<%
break;
case "modify" :
sql = "update member_tbl_02 SET " +
"custname=?, phone=?, address=?, joindate=?, grade=?, city=? " +
" where custno=?";
System.out.println("UPDATE SQL:" + sql);
pstmt = conn.prepareStatement(sql); // pstmt 초기화 추가
pstmt.setString(1, custname);
pstmt.setString(2, phone);
pstmt.setString(3, address);
pstmt.setString(4, joindate);
pstmt.setString(5, grade);
pstmt.setString(6, city);
pstmt.setString(7, custno);
pstmt.executeUpdate();
%>
<jsp:forward page="member.jsp"/>
<%
break;
}
}
catch(Exception e){
e.printStackTrace();
}
%>
</body>
</html>
<!--price.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="DBPKG.Util" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원매출조회 (money.jsp)</title>
<link href="style.css" rel="stylesheet" type="text/css">
<style>
table {margin:0 auto; border-color: ivory; }
table tr th, td {padding: 5px 20px 5px 20px; text-align:center; }
</style>
</head>
<body>
<%@ include file="header.jsp" %>
<section>
<h2>회원매출조회</h2>
<form>
<table border="1">
<tr>
<th>회원번호</th>
<th>회원성명</th>
<th>고객등급</th>
<th>매출</th>
</tr>
<%
request.setCharacterEncoding("utf-8");
Connection conn = null;
Statement stmt = null;
//3-2) 변수 grade 초기화
String grade = "";
try {
conn = Util.getConnection();
stmt = conn.createStatement();
//1) 회원별로 매출 구하는 쿼리문 작성
String sql = "select m1.custno, m1.custname, m1.grade, sum(m2.price) as total " +
"from member_tbl_02 m1, money_tbl_02 m2 " +
"where m1.custno = m2.custno " +
"group by m1.custno, m1.custname, m1.grade " +
"order by sum(m2.price) desc";
//2) sql 쿼리문 실행하기 위한 ResultSet 객체
ResultSet rs = stmt.executeQuery(sql);
//3-1) 회원의 등급 String 값 변환하여 출력
while(rs.next()) {
grade = rs.getString("grade");
switch(grade) {
case "A" :
grade="VIP";break;
case "B" :
grade="일반";break;
case "C" :
grade="직원";break;
}//switch
%>
<!--4) 모든 회원에 대해 자동삽입되도록 만들기 위해 while문 내부에 작성-->
<tr>
<td><%=rs.getString("custno") %></td>
<td><%=rs.getString("custname") %></td>
<td><%=grade %></td>
<td><%=rs.getString("total") %></td>
</tr>
<%
}//while
}//try
catch(Exception e) {
e.printStackTrace();
}
%>
</table>
</form>
</section>
<%@ include file="footer.jsp" %>
</body>
</html>
<!--insert.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="DBPKG.Util" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원등록 (insert.jsp)</title>
<link href="style.css" rel="stylesheet" type="text/css">
<style>
table {margin:0 auto; border-color: ivory}
table tr td,th {line-height: 30px;}
table tr td input {margin-left: 5px; margin-right: 50px;}
.button {color: white; background:rgba(100,0,0,0.5); padding:5px; border-color:white;}
</style>
<script src="action.js"></script>
</head>
<body>
<%@ include file="header.jsp" %>
<%
//1) 공통코드 작성
request.setCharacterEncoding("utf-8");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//6-2) 변수 custno 초기화
String custno = "";
// 입력될 코드 변수에 저장
String custname = request.getParameter("custname");
String phone = request.getParameter("phone");
String address = request.getParameter("address");
String joindate = request.getParameter("joindate");
String grade = request.getParameter("grade");
String city = request.getParameter("city");
try {
//2) 공통코드
conn = Util.getConnection();
//3) 회원정보등록 페이지에서 input에 회원번호를 자동입력시키기 위해 가장 큰 회원번호 찾는 쿼리문 정의
String sql = "SELECT MAX(custno)+1 custno FROM member_tbl_02" ;
//4) 가장 큰 custno 찾는 쿼리문을 Statement 객체에 저장
pstmt = conn.prepareStatement(sql);
//5) 쿼리문 실행을 위해 ResultSet 객체 사용
rs = pstmt.executeQuery();
rs.next();
//6-1) 회원등록 페이지에서 회원번호 자동입력을 위해
custno = rs.getString("custno");
}
catch(Exception e) {
e.printStackTrace();
}
%>
<section>
<h2>홈쇼핑 회원 등록</h2>
<form method="post" action="mode.jsp" name="form">
<input type="hidden" name="mode" value="insert">
<table border="1">
<tr>
<th>회원번호(자동발생)</th>
<td><input type="text" name="custno" value="<%=custno %>" readonly></td>
</tr>
<tr>
<th>회원성명</th>
<td><input type="text" name="custname"></td>
</tr>
<tr>
<th>회원전화</th>
<td><input type="text" name="phone" placeholder="010-XXXX-XXXX"></td>
</tr>
<tr>
<th>회원주소</th>
<td><input type="text" name="address" size="40"></td>
</tr>
<tr>
<th>가입일자</th>
<td><input type="text" name="joindate" placeholder="20231202"></td>
</tr>
<tr>
<th>고객등급 [A:VIP B:일반 C:직원]</th>
<td><input type="text" name="grade" placeholder="A,B,C 중 입력"></td>
</tr>
<tr>
<th>도시코드</th>
<td><input type="text" name="city" placeholder="최대 2자리"></td>
</tr>
<tr>
<th colspan="2" style="text-align:center;">
<input type="submit" value="등록" onClick="return check()" class="button"/>
<input type="button" value="조회" onClick="return search()" class="button"/>
</th>
</tr>
</table>
</form>
</section>
<%@ include file="footer.jsp" %>
</body>
</html>
[BOOK]
채규태, 「채쌤의 Servelt&JSP 프로그래밍 핵심」, 쌤즈, 2022
[BLOG]
오라클 포트번호 및 SID 확인방법
https://all-record.tistory.com/77
오라클 IO 오류
https://study-melody.tistory.com/71
[Oracle] 오라클 INSERT문(삽입) 사용법 & 예제
https://coding-factory.tistory.com/424
오라클 시퀀스(Sequence) 사용 및 NEXTVQL 초기화
https://cocodo.tistory.com/12
[Oracle] IO 오류 - The Network Adapter could not establish the connection 해결
https://moonong.tistory.com/50