2. 레코드 입력 부분 작성-3

미려김·2024년 3월 5일

JSP 프로그래밍

목록 보기
5/14
post-thumbnail

2.4 레코드 입력 처리 문서(BoardWriteProc.jsp) 작성

BoardWriteProc.jsp 문서의 작성

  • 아직 파일 업로드나 답변 레코드 작성 학습 X

  • 따라서 JDBC 사용해 DB 연결 → INSERT 질의어 사용 → 입력된 데이터들을 DB 내 존재하는 테이블에 저장하기만 하면 됨

  • 전체코드

// BoardWriteProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
// JDBC를 사용하기 위해 java.sql 패키지의 클래스들 import
<%@ page import="java.sql.*"%>
// BoardWrite.jsp 문서로부터 request 기본객체를 통해 전달된 한글 데이터 출력을 위해 setCharacterEncoding()메소드를 사용해 인코딩할 문자 집합 'UTF-8'로 지정
<%request.setCharacterEncoding("UTF-8");%>

<%
//---------------------- 객체 선언
// DB 연결을 위해 Connection 객체 conn 선언
Connection conn = null;
// 현재 테이블에 존재하는 레코드들의 RcdNo와 GrpNo의 값 중 가장 큰 값을 추추하기 위해 사용되는 Statement 객체 stmt
// JDBC를 이용하여 SQL문 발행할 때 Statement 객체 생성해야 함
Statement stmt = null;
// BoardWrite.jsp 문서에 입력된 데이터를 board 테이블에 저장하는 질의를 수행하기 위해 사용
// PreparedStatement 객체 : Statement 하위 인터페이스로 프리 컴파일(전처리)된 SQL문을 나타내는 객체
PreparedStatement pstmt = null;
// 현재 테이블에 존재하는 레코드들의 RcdNo와 GrpNo의 값 중 가장 큰 값을 추출하기 우해 ResultSet객체 선언
// ResultSet 객체 : Select문의 결과를 저장하는 객체
ResultSet rs = null;

// 질의 수행을 위해서는 Statement 객체나 PreparedStatement 객체 중 어떤 객체를 사용해도 상관 X
// 책에서는 두 객체의 사용 방법을 보이기 위해 두 객체 모두 사용

try{
	
	//----------------------- JDBC 설정
	String jdbcUrl = "jdbc:sqlserver://;(localhost):(port);encrypt=false;DatabaseName=shc;";
	String jdbcId = "id";
	String jdbcPw = "pw";
	
	// DB 연결을 위한 Connection 객체 생성해야 함
	// Class.forName() 메소드를 사용해 MSSQL JDBC 드라이버 로드
	Class.forName("com/microsoft.sqlserver.jdbc.SQLServerDriver");
	// DriverManager.getConnection() 메소드를 사용해 Connection 객체 conn 생성
	conn = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPw);
	
	// 레코드의 각 필드에 데이터를 저장하기 위해 BoardWrite.jsp 문서로부터 request 기본 객체를 통해 전달되는 데이터들을 getParameter() 메소드 사용 -> 추출
	// 변수 이름은 추출하는 필드의 이름과 동일하게 지정함
	//------------------------- 전송된 데이터의 추출
	String name = request.getParameter("name");
	String mail = request.getParameter("mail");
	String subject = request.getParameter("subject");
	String content = request.getParameter("content");
	String pass = request.getParameter("pass");
	
	// RcdNo : 기본키 => 모든 레코드들이 유일한 값 가져야 함, 레코드 식별자
	// GrpNo : 레코드 그룹의 번호, 레코드 그룹 식별자
	// 기존 레코드에 답변 레코드 입력 -> 기본 레코드 : 부모 레코드, 답변 레코드 : 자식 레코드 
	// 레코드 그룹 : 부모 레코드와 자식 레코드들이 이루는 집합
	// 모든 그룹에는 최상위 부모 레코드가 존재
	// 레코드 그룹을 구성하는 레코드들 중 최상위 부모 레코드 : BoardWrite.jsp 문서에 의해 생성
	// 나머지 답변 레코드들 : BoardR eply.jsp 문서에 의해 생성
	// 따라서 최상위 부모 레코드는 다른 그룹 최상위 부모 레코드와 구분 필요 -> 레코드 생성 시점에서 유일한 GrpNo 필드 값 가져야 함
	//-----------------------------  새로운 레코드의 RcdNo와 GrpNo 생성
	// board 테이블에 존재하는 레코드들 중 RcdNo와 GrpNo 필드 값이 가장 큰 레코드의 RcdNo와 GrpNo 값 추출하는 질의
	String Query1 = "SELECT max(RcdNo), max(GrpNo)FROM board";
	// createStatement() 메소드 사용 -> Statement 객체 stmt 생성
	stmt = conn.createStatement();
	// executeQuery() 메소드 사용 -> ResultSet 객체 rs 생성
	rs = stmt.executeQuery(Query1);
	
	// rs 객체의 커서를 증가시켜 첫 번째 레코드를 포인트 함
	rs.next();
	
	// uid, gid : 새로 입력되는 레코드의 RcdNo, GrpNo
	int uid = (rs.getInt(1))+1;
	int gid = (rs.getInt(2))+1;
	
	// board 테이블에 입력할 나머지 필드 값을 생성
	//-------------------------------- 기타 입력 데이터 생성
	// 아직 파일 업로드 기능 작성 X -> 이름은 null, size는 0으로 지정
	String filename = null;
	int filesize = 0;
	// refer : 참조 횟수, UsrRefer 필드의 값은 BoardContent.jsp 문서 통해 -> 게시판 글 읽으면 자동으로 1씩 증가되게 할 것
	int refer = 0;
	// level: 부모 레코드와 자식 레코드들 사이의 계층 구조를 숫자로 표현한 값이 저장되는 RcdLevel 필드에 값을 저장하는 구문
	// BoardWrite.jsp 문서에 의해 입력되는 레코드 = 최상위 부모 레코드 => 0
	int level = 0;
	// RcdOrder 답변 레코드 작성할 때 다룰 것
	int order = 1;
	// 레코드 생성 시각을 UsrDate 필드에 지정하는 구문
	// 웹 어플리케이션에서 날짜나 시간 값을 처리할 때 주로 타임스탬프(timestamp) 사용
	// 입력된 타임스탬프 값 -> BoardList.jsp 문서에서는 문자열로 변환하여 표현
	long now = System.currentTimeMillis();
	

	// 레코드에 입력할 모든 데이터 정의 -> board 테이블에 레코드를 저장하는 질의 수행
	// 레코드에 저장하는 질의의 수행을 위해 PreparedStatement 객체 사용
	//---------------------------------- 입력 질의 수행
	// 레코드를 입력할 질의 생성
	String Query2 = "Insert INTO board VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	// prepareStatement() 메소드 사용 -> pstmt 객체 생성
	pstmt = conn.prepareStatement(Query2);
	// 1~13 : 위치 홀더에 대응하는 값을 지정하는 구문
	pstmt.setInt(1, uid);
	pstmt.setInt(2, gid);
	pstmt.setString(3, name);
	pstmt.setString(4, mail);
	pstmt.setString(5, subject);
	pstmt.setString(6, content);
	pstmt.setString(7, pass);
	pstmt.setString(8, filename);
	pstmt.setInt(9, filesize);
	pstmt.setLong(10, now);
	pstmt.setInt(11, refer);
	pstmt.setInt(12, level);
	pstmt.setInt(13, order);
	
	// executeUpdate() 메소드 사용 -> 질의 수행
	pstmt.executeUpdate();
	} catch (SQLException e) {
		out.print(e);
	} finally {
		// 객체 사용 완료 -> 생성한 객체 제거 -> 메모리 운영체제 반납
		// 객체의 제거 : 생성된 순서로
		//---------------------- 생성된 객체의 제거와 페이지 이동
		rs.close(); // ResultSet 객체 rs 종료
		pstmt.close(); // PreparedStatement 객체 pstmt 종료
		conn.close(); // Connection 객체 conn 종료
		// reponse 기본객체의 sendRedirect() 메소드 사용 
		// -> board 테이블에 존재하는 레코드의 리스트를 출력하는 BoardList.jsp 호출
		response.sendRedirect("BoardList.jsp"); 
	}
%>
profile
안녕하세요.

0개의 댓글