진행에 앞서 설정해줘야 할것이 있다.
pom.xml에 H2데이터베이스 의존성을 추가해주자.
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
</dependencies>
1️⃣ 모델구현(DO) : Student
Student 클래스
[src/main/java] 폴더에 ch09 패키지를 생성 후 Student클래스를 만들어주자.
그리고 아래와 같이 코딩해주자.
package ch09;
import java.sql.Date; //import java.util.Date;
public class Student {
private int id;
private String username;
private String univ;
private Date birth;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUniv() {
return univ;
}
public void setUniv(String univ) {
this.univ = univ;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2️⃣ 모델구현(DAO) : StudentDAO
ch09패키지에 StudentDAO 클래스를 생성해주자.
DB연동을 위한 DAO 클래스로 DB연결·종료 및 CRUD지원을 위한 메서드로 구성된다.
클래스 기본구조 생성
package ch09;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class StudentDAO {
Connection conn = null;
PreparedStatement pstmt;
final String JDBC_DRIVER = "org.h2.Driver";
final String JDBC_URL = "jdbc:h2:tcp://localhost/~/jwbookdb";
}
연결·종료 메서드 구현
DB 작업 요청시 DB에 연결, 종료시 연결도 종료하는 방식으로 구현할것이다.
import java.sql.DriverManager;
public void open() {
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(JDBC_URL, "jwbook", "1234");
}
catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
try {
pstmt.close();
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
학생등록 메서드 구현
학생등록을 위해 Student객체를 인자로 받아 SQL과 데이터를 조합하는 과정이 필요하다.
따라서 PreparedStatement를 이용해 ? 에 해당하는 데이터를 매핑해줄것이다.
public void insert(Student s) {
open();
String sql = "INSERT INTO student(username, univ, birth, email) values(?, ?, ?, ?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, s.getUsername());
pstmt.setString(2, s.getUniv());
pstmt.setDate(3, s.getBirth());
pstmt.setString(4, s.getEmail());
pstmt.executeUpdate();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
close();
}
}
학생목록 메서드 구현
전체 학생 목록은 SELECT문으로 가져올수있지만 ResultSet을 사용해
Student 객체에 데이터를 매핑하고 List에 추가한 후 모든 데이터가 담긴 List 타입을 리턴해야한다.
public List<Student> getAll() {
open();
List<Student> students = new ArrayList<>();
try {
pstmt = conn.prepareStatement("select * from student");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Student s = new Student();
s.setId(rs.getInt("id"));
s.setUsername(rs.getString("username"));
s.setUniv(rs.getString("univ"));
s.setBirth(rs.getDate("birth"));
s.setEmail(rs.getString("email"));
students.add(s);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
close();
}
return students;
}
StudentDao클래스의 전체 코드는 다음과 같다.
package ch09;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class StudentDAO {
Connection conn = null;
PreparedStatement pstmt;
final String JDBC_DRIVER = "org.h2.Driver";
final String JDBC_URL = "jdbc:h2:tcp://localhost/~/jwbookdb";
//연결 종료 메소드
public void open() {
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(JDBC_URL, "jwbook", "1234");
}
catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
try {
pstmt.close();
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
//학생등록 메서드
public void insert(Student s) {
open();
String sql = "INSERT INTO student(username, univ, birth, email) values(?, ?, ?, ?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, s.getUsername());
pstmt.setString(2, s.getUniv());
pstmt.setDate(3, s.getBirth());
pstmt.setString(4, s.getEmail());
pstmt.executeUpdate();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
close();
}
}
//학생목록 메서드 구현
public List<Student> getAll() {
open();
List<Student> students = new ArrayList<>();
try {
pstmt = conn.prepareStatement("select * from student");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Student s = new Student();
s.setId(rs.getInt("id"));
s.setUsername(rs.getString("username"));
s.setUniv(rs.getString("univ"));
s.setBirth(rs.getDate("birth"));
s.setEmail(rs.getString("email"));
students.add(s);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
close();
}
return students;
}
}
3️⃣ 컨트롤러 구현 : StudentController
ch09패키지에서 StudentContorller 서블릿을 생성해주자.
url은 studentControl로 해주자.
package ch09;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/studentControl")
public class StudentController extends HttpServlet {
private static final long serialVersionUID = 1L;
StudentDAO dao;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
dao = new StudentDAO();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String action = req.getParameter("action");
String view = "";
if(req.getParameter("action") == null) {
getServletContext().getRequestDispatcher("/studentControl?action=list")
.forward(req, resp);
}
else {
switch(action) {
case "list": view = list(req, resp); break;
case "insert": view = insert(req, resp); break;
}
getServletContext().getRequestDispatcher("/ch09/"+view).forward(req, resp);
}
}
public String list(HttpServletRequest req, HttpServletResponse resp) {
return "";
}
public String insert(HttpServletRequest req, HttpServletResponse resp) {
return "";
}
}
- list와 insert action 요청 구현
이제 전체 데이터 목록 요청을 위한 list 메서드를 살펴보자.
dao.getAll() 메서드를 호출한 결과를
request scope object의 속성에 students 라는 이름으로 저장후 뷰의 이름을 리턴해준다.
한개의 뷰(studentInfo.jsp)에서 목록 보기와 데이터 추가를 모두 구현해줄것이다.
public String list(HttpServletRequest req, HttpServletResponse resp) {
req.setAttribute("students", dao.getAll());
return "studentInfo.jsp";
}
새로운 학생을 추가하는 insert 메서드는 request.getParameter()을 사용해
모든 입력값을 읽어와 Student객체로 매핑한후 dao.insert() 메서드를 호출후 뷰 페이지로 돌아가야한다.
입력값을 노가다 매핑보다는 Apache Commons Bean Utils을 사용하는것이 좋다.
먼저 pom.xml에 아래와 같이 BeanUtils 라이브러리 의존성을 추가해주자.
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
이제 insert 메서드 내부를 구현해야 한다.
Student 객체를 생성한 후 BeanUtils.populate() 메서드로
파라미터로 전달된 name 속성과 일치하는 Student 클래스의 멤버 변수를 찾아
값이 전잘되도록 한다.
dao.insert()메서드로 새로운 데이터를 저장한후 다시 새로운 목록으로 화면을 표시하기 위해
list()메서드를 호출한 결과를 리턴해줄것이다.
public String insert(HttpServletRequest req, HttpServletResponse resp) {
Student s = new Student();
try {
BeanUtils.populate(s, req.getParameterMap());
}
catch (Exception e) {
e.printStackTrace();
}
dao.insert(s);
return list(req, resp);
}
StudentController의 전체 코드는 아래와 같다.
package ch09;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/studentControl")
public class StudentController extends HttpServlet {
private static final long serialVersionUID = 1L;
StudentDAO dao;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
dao = new StudentDAO();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String action = req.getParameter("action");
String view = "";
if(req.getParameter("action") == null) {
getServletContext().getRequestDispatcher("/studentControl?action=list")
.forward(req, resp);
}
else {
switch(action) {
case "list": view = list(req, resp); break;
case "insert": view = insert(req, resp); break;
}
getServletContext().getRequestDispatcher("/ch09/"+view).forward(req, resp);
}
}
public String list(HttpServletRequest req, HttpServletResponse resp) {
req.setAttribute("students", dao.getAll());
return "studentInfo.jsp";
}
public String insert(HttpServletRequest req, HttpServletResponse resp) {
Student s = new Student();
try {
BeanUtils.populate(s, req.getParameterMap());
}
catch (Exception e) {
e.printStackTrace();
}
dao.insert(s);
return list(req, resp);
}
}
4️⃣ 뷰 구현 : studentInfo
목록 화면과 입력화면을 따로 만들어도 되지만
최대한 간단하게 JDBC 구현을 알아보면서 한개의 화면을 사용할것이다.
[webapp]폴더에 ch09폴더를 만든 후 studentInfo.jsp를 생성해주자.
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" isELIgnored ="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
이제 body에 c:forEach를 사용해서 목록을 만들어주자.
<table border="1">
<tr>
<th>id</th>
<th>이름</th>
<th>대학</th>
<th>생일</th>
<th>이메일</th>
</tr>
<c:forEach items="${students}" var="s">
<tr>
<td>${s.id}</td>
<td>${s.username}</td>
<td>${s.univ}</td>
<td>${s.birth}</td>
<td>${s.email}</td>
</tr>
</c:forEach>
</table>
다음으로 데이터 입력 양식은 HTML <form> 태그를 사용하고
action에는 컨트롤러 호출 url에 action=insert 를 넣어줄것이다.
※ <input>의 name 속성값을 Student 클래스의 멤버 변수 이름과 동일하게 작성해야한다. ※
<form method="post" action="/studentControl?action=insert">
<lable>이름</lable>
<input type="text" name="username"><br>
<lable>대학</lable>
<input type="text" name="univ"><br>
<lable>생일</lable>
<input type="text" name="birth"><br>
<lable>이메일</lable>
<input type="text" name="email"><br>
<button type="submit">등록</button>
</form>
studentInfo.jsp의 전체 코드는 아래와 같다.
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>학생정보</title>
</head>
<body>
<h2>학생정보</h2>[<a href="/studentControl">새로고침</a>]
<hr>
<table border="1">
<tr>
<th>id</th>
<th>이름</th>
<th>대학</th>
<th>생일</th>
<th>이메일</th>
</tr>
<c:forEach items="${students}" var="s">
<tr>
<td>${s.id}</td>
<td>${s.username}</td>
<td>${s.univ}</td>
<td>${s.birth}</td>
<td>${s.email}</td>
</tr>
</c:forEach>
</table>
<hr>
<h2>학생 추가</h2>
<hr>
<form method="post" action="/studentControl?action=insert">
<lable>이름</lable>
<input type="text" name="username"><br>
<lable>대학</lable>
<input type="text" name="univ"><br>
<lable>생일</lable>
<input type="text" name="birth"><br>
<lable>이메일</lable>
<input type="text" name="email"><br>
<button type="submit">등록</button>
</form>
</body>
</html>
이제 톰캣 서버 실행후 테스트해보자
http://localhost:8081/studentControl 에 접속해보자
원래 DB에 등록된 5개 항목과
등록 버튼시 데이터 삽입이 잘되어야 하는데
프로젝트가 이상해서 그런지 작동을 안한다.
코드 자체는 이상이없으니 여기까지 하고 마치도록 하겠다.
다음 글은 이제 진짜 프로젝트이다!
다음글에서 보겠다..
[메인으로 돌아가기]
'Java Spring > 책공부 1 (JSP와 스프링)' 카테고리의 다른 글
18. 모델 구현 (0) | 2022.07.14 |
---|---|
17. 뉴스기사 관리 서비스 설계 (0) | 2022.07.14 |
15. SQL : 학생정보 목록 생성 (0) | 2022.07.12 |
14. 고급 컨트롤러 서블릿 구현 (0) | 2022.07.11 |
13. 컨트롤러 기초 : 계산기 구현 (0) | 2022.07.11 |