본문 바로가기
도서/프로그래밍

[09][完] 쉽게 배우는 JSP 웹 프로그래밍

by 신발사야지 2024. 1. 22.

 

9일차

PART 04 JSP 고급 문법

CHAPTER 13 세션

세션은 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법

CHAPTER 14 쿠키

쿠키는 세션과 마찬가지이지만 저장되는 곳이 클라이언트

<get/set> 생략

메소드 반환 유형 설명

Comment() String 설명
Domain() String 유효한 도메인 정보
MaxAge() int 사용 가능 기간
Name() String 이름
Path() String 유효한 디렉터리 정보
Secure() boolean 보안 설정
Value() String 설정된 값
Version() int 버전

02 쿠키 생성

쿠키를 생성한 후에는 반드시 response 내장 객체의 addCookie() 메소드로 쿠키를 설정

Cookie cookie = new Cookie("name", value);
response.addCookie(cookie);

04 쿠키 삭제

cookie.setMaxAge(0); // 유효기간을 0으로 해서 삭제, 별도 삭제기능 X

CHAPTER 15 데이터베이스

MySQL 개발 환경 구축

CHAPTER 16 JDBC로 데이터베이스와 JSP 연동

**JDBC(Java DataBase Connectivity)**는 자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스로, 관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러리입니다. DBMS 종류에 상관없이 데이터베이스 작업을 처리할 수 있습니다.

java.sql.* 패키지에 의해 구현

JDBC를 사용한 JSP와 데이터베이스의 연동

  1. java.sql.* 패키지 임포트
  2. JDBC 드라이버 로딩
  3. 데이터베이스 접속을 위한 Connection 객체 생성
  4. 쿼리문을 실행하기 위한 Statement/PrepareStatement/CallableStatement 객체 생성
  5. 쿼리 실행
  6. 쿼리 실행의 결과 값(int, ResultSet) 사용
  7. 사용된 객체 종료

02 JDBC 드라이버 로딩 및 DBMS 접속

JDBC 드라이버 로딩 > 데이터베이스 연결 > 데이터베이스 연결해제

01 MySql드라이버 로딩

<%
	try {
		Class.forName("com.mysql.jdbc.Driver");
	} catch (SQLException ex) {
	}
%>

또는 WEBINF/web.xml 파일의 init-param 요소에 드라이버 이름을 설정, 이렇게 하면 서블릿을 초기화할 때 로딩됩니다.

<init-param>
	<param-name>jdbcDriver</param-name>
	<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>

-- 드라이버를 로딩하고 나서 
<init-param> 요소에 설정한 드라이버 이름을 사용하면 데이터베이스에 연결됩니다.

java.lang.Class.forName(config.getInitParameter("jdbcDriver"));

02 Connection 객체 생성하기

JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection() 메소드를 사용

static Connection getConnection(String url)
static Connection getConnection(String url, String user, String password)
static Connection getConnection(String url, Properties info)

// url 표현 방식은 jdbc:dbms 이름:주소:포트 번호[데이터베이스 식별자]

Connection conn = null;
try {
	Class.forName("com.mysql.jdbc.Driver");
	conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/JSPBookDB", "root", "1234");
} catch (SQLException ex) {
}

03 데이터베이스 연결 닫기

void close() throws SQLException

} finally {
	if (conn != null) conn.close();
}
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
	Connection conn = null;
	try {
		String url = "jdbc:mysql://localhost:3306/JSPBookDB";
		String user = "root";
		String password = "1234";
		
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(url, user, password);
		out.println("데이터베이스 연결에 성공했습니다.");
	} catch (SQLException ex){
		out.println("데이터베이스 연결이 실패했습니다.<br>");
		out.println("SQLException: " + ex.getMessage()); 
	} finally {
		if (conn != null) {
			conn.close();
		}
	}
%>
</body>
</html>

 

03 데이터베이스 쿼리 실행

Connection 객체를 생성하여 데이터베이스가 연결되었다면 쿼리 실행 객체를 이용하여 쿼리를 실행합니다. 쿼리 실행 객체는 Statement, PreparedStatement, CallableStatement 입니다.

01 Statement 객체로 데이터 접근하기

정적인 쿼리에 사용, 하나의 쿼리만 실행 가능, close() 로 즉시해제

메서드의 종류

  • executeQuery(String sql) : ResultSet (Select 문을 실행할 때 사용)
  • executeUpdate(String sql) : int (삽입, 수정, 삭제와 관련된 SQL 문 실행에 사용한다.)
  • close() : void (Statement 객체를 반환할 때 사용한다.)
<%@ 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>
	<form method="post" action="insert01_process.jsp">
		<p> 아이디: <input type="text" name="id">
		<p> 비밀번호: <input type="password" name="passwd">
		<p> 이름: <input type="text" name="name">
		<p> <input type="submit" value="전송">
	</form>
</body>
</html>
<%@ page import="java.sql.*" %>
<%
Connection conn = null;

String url = "jdbc:mysql://localhost:3306/JSPBookDB";
String user = "root";
String password="1234";

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Database SQL</title>
</head>
<body>
	<%@ include file="dbconn.jsp"%>

	<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String passwd = request.getParameter("passwd");
	String name = request.getParameter("name");

	Statement stmt = null;

	try {
		String sql = "INSERT INTO MEMBER(id, passwd, name) VALUES('" + id + "', '" + passwd + "', '" + name + "')";

		stmt = conn.createStatement();
		stmt.executeUpdate(sql);
		out.println("Member 테이블 삽입에 성공했습니다.");
	} catch (SQLException ex) {
		out.println("Member 테이블 삽입이 실패했습니다.");
		out.println("SQLException: " + ex.getMessage());
	} finally {
		if (stmt != null) {
			stmt.close();
		}
		if (conn != null) {
			conn.close();
		}
	}
	%>
</body>
</html>

 

 

 

 

02 PreparedStatement 객체로 데이터 접근하기

String sql 에 ? 로 넣고 setString(1, “1”) 이런식으로 넣는다. index는 1부터 시작

setString(int parameterIndex, String x)

// String, Int, Long, Double, Float, Object, Date, Timestamp 등을 넣을 수 있음

메서드는 Statement 객체와 동일

04 쿼리문 실행 결과 값 접근

ResultSet 객체의 메소드 종류

메소드 반환 유형 설명

getXxx(int ColumnIndex) XXX 설명 잘 못 써있음
getXxx(String ColumnName) XXX 설명 잘 못 써있음
absolute(int row) boolean 설정한 행으로 커서를 이동한다
beforeFirst() void 첫 번째 행의 이전으로 커서를 이동한다.
afterLast() void 마지막 행의 다음으로 커서를 이동한다.
first() void 첫 번째 행으로 커서를 이동한다.
last() void 마지막 행으로 커서를 이동한다.
next() boolean 다음 행으로 커서를 이동한다.
previous() boolean 현재 행의 이전 행으로 커서를 이동한다.
close() void ResetSet의 커서를 반환 (설명 잘못 써있음)
<%@ 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>
	<%@ include file="dbconn.jsp"%>
	<table width="300" border="1">
		<tr>
			<th>아이디</th>
			<th>비밀번호</th>
			<th>이름</th>
		</tr>
		<%
		ResultSet rs = null;
		Statement stmt = null;

		try {
			String sql = "SELECT * FROM MEMBER";
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);

			while (rs.next()) {
				String id = rs.getString("id");
				String pw = rs.getString("passwd");
				String name = rs.getString("name");
		%>
		<tr>
			<td><%=id%></td>
			<td><%=pw%></td>
			<td><%=name%></td>
		</tr>
		<%
		}
		} catch (SQLException ex) {
		out.println("Member 테이블 호출이 실패했습니다.<br>");
		out.println("SQLException: " + ex.getMessage());
		} finally {
			if (rs != null) {
				rs.close();
			}
			if (stmt != null) {
				stmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		}
		%>

	</table>
</body>
</html>

 

 

CHAPTER 17 JSP 표준태그

01 JSTL의 개요

JSTL은 JSP 페이지에서 스크립트 요소로 인한 코드의 복잡함을 해결하기 위한 일종의 사용자 정의 태그의 표준입니다.

 

CHAPTER 18 웹 MVC

01 MVC의 개요

MVC는 Model, View, Controller의 약자로, 웹 애플리케이션을 비지니스 로직, 프레젠테이션 로직, 데이터로 분리하는 디자인 패턴

 

03 MVC 패턴 구현 방법

01 web.xml 파일에 서블릿 구성하기

<web-app>
<servlet>
	<servlet-name>myController</servlet-name>
	<servlet-class>ch18.com.controller.ControllerServlet</servlet-class>
</servlet>
<servlet-maaping>
	<servlet-name>myController</servlet-name>
	<url-pattern>/ch18/ControllerServlet</url-pattern>
</servlet-maaping>
</web-app>

 

02 컨트롤러 생성하기

package ch18.com.controller;

import java.io.IOException;

import ch18.com.model.LoginBean;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class ControllerServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		
		String id = request.getParameter("id");
		String password = request.getParameter("passwd");
		
		LoginBean bean = new LoginBean();
		bean.setId(id);
		bean.setPassword(password);
		request.setAttribute("bean", bean);
		
		boolean status = bean.validate();
		
		if(status) {
			RequestDispatcher rd = request.getRequestDispatcher("mvc_success.jsp");
			rd.forward(request, response);
		} else {
			RequestDispatcher rd = request.getRequestDispatcher("mvc_error.jsp");
			rd.forward(request, response);
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
}

 

03 모델 생성하기

package ch18.com.model;

public class LoginBean {
	private String id;
	private String password;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public boolean validate() {
		if (password.equals("admin")) {
			return true;
		}
		else {
			return false;
		}
	}
}

 

04 뷰 생성하기

<%@ 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>
	<form method="post" action="ControllerServlet">
		<p> 아이디: <input type="text" name="id">
		<p> 비밀번호: <input type="password" name="passwd">
		<p> <input type="submit" value="보내기">
	</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="ch18.com.model.LoginBean" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<p>로그인 성공했습니다.
	<p>
		<%
		LoginBean bean = (LoginBean) request.getAttribute("bean");
		out.println("아이디: " + bean.getId());
		%>
	
</body>
</html>