- 학사관리 시스템을 만들어보도록 하겠다.
- 기존에 있던 hacksa db에 있던 데이터를 이용해 ER 다이어그램을 만들어보자.
- go to mysql
use haksadb;
# 교수테이블
CREATE TABLE professors (
pcode CHAR(3) NOT NULL PRIMARY KEY,
pname NVARCHAR(15) NOT NULL,
dept NVARCHAR(30),
hiredate DATE,
title NVARCHAR(15),
salary INT
);
desc professors;
CREATE TABLE students (
scode CHAR(8) NOT NULL PRIMARY KEY,
sname NVARCHAR(15) NOT NULL,
dept NVARCHAR(30),
year INT DEFAULT 1,
birthday DATE,
advisor CHAR(3),
FOREIGN KEY (advisor)
REFERENCES professors (pcode)
);
desc students;
CREATE TABLE courses (
lcode CHAR(4) NOT NULL,
lname VARCHAR(50) NOT NULL,
hours INT,
room CHAR(3),
instructor CHAR(3),
capacity INT DEFAULT 0,
persons INT DEFAULT 0,
PRIMARY KEY (lcode),
FOREIGN KEY (instructor)
REFERENCES professors (pcode)
);
desc courses;
CREATE TABLE enrollments (
lcode CHAR(4) NOT NULL,
scode CHAR(8) NOT NULL,
edate DATE,
grade INT DEFAULT 0,
PRIMARY KEY (lcode , scode),
FOREIGN KEY (lcode)
REFERENCES courses (lcode),
FOREIGN KEY (scode)
REFERENCES students (scode)
);
desc enrollments;
commit;
drop table enrollments;
drop table students;
drop table courses;
drop table professors;
insert into professors(pcode,pname,dept,hiredate,title,salary) values('221','이병렬','전산','75/04/03','정교수',3000000);
insert into professors(pcode,pname,dept,hiredate,title,salary) values('228','이재광','전산','91/09/19','부교수',2500000);
insert into professors(pcode,pname,dept,hiredate,title,salary) values('311','강승일','전자','94/06/09','부교수',2300000);
insert into professors(pcode,pname,dept,hiredate,title,salary) values('509','오문환','건축','92/10/14','조교수',2000000);
select * from professors;
insert into students(scode,sname,dept,year,birthday,advisor) values('92414029','서연우','전산',3,'73/10/06','228');
insert into students(scode,sname,dept,year,birthday,advisor) values('92414033','김창덕','전산',4,'73/10/26','221');
insert into students(scode,sname,dept,year,birthday,advisor) values('92514009','이지행','전자',4,'73/11/16','311');
insert into students(scode,sname,dept,year,birthday,advisor) values('92514023','김형명','전자',4,'73/08/29','311');
insert into students(scode,sname,dept,year,birthday,advisor) values('92454018','이원구','건축',3,'74/09/30','509');
insert into students(scode,sname,dept,year,birthday,advisor) values('95454003','이재영','건축',4,'76/02/06','509');
insert into students(scode,sname,dept,year,birthday,advisor) values('95414058','박혜경','전산',4,'76/03/12','221');
insert into students(scode,sname,dept,year,birthday,advisor) values('96414404','김수정','전산',3,'77/12/22','228');
select * from students;
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('C301','파일처리론', 3 ,'506','221',100,80);
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('C401','데이터베이스',3,'414','221',80,80);
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('C421','알고리즘',3,'510','228',80,72);
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('C312','자료구조',2,'510','228',100,60);
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('E221','논리회로',3,'304','311',100,80);
insert into courses(lcode,lname,hours,room,instructor,capacity,persons) values('A109','한국의건축문화',2,'101','509',120,36);
select * from courses;
insert into enrollments(lcode, scode, edate, grade) values('C401','92414033','98/03/02',85);
insert into enrollments(lcode, scode, edate, grade) values('C301','92414033','98/03/02',80);
insert into enrollments(lcode, scode, edate, grade) values('C421','92414033','98/03/02', 0);
insert into enrollments(lcode, scode, edate, grade) values('C401','95414058','98/03/03',90);
insert into enrollments(lcode, scode, edate, grade) values('C301','95414058','98/03/03',80);
insert into enrollments(lcode, scode, edate, grade) values('C312','95414058','98/03/03',80);
insert into enrollments(lcode, scode, edate, grade) values('C401','92514023','98/03/03',70);
insert into enrollments(lcode, scode, edate, grade) values('C301','92514023','98/03/03',70);
insert into enrollments(lcode, scode, edate, grade) values('C421','92514023','98/03/03',70);
insert into enrollments(lcode, scode, edate, grade) values('C301','92414029','98/03/03',90);
insert into enrollments(lcode, scode, edate, grade) values('C421','92414029','98/03/03',0);
insert into enrollments(lcode, scode, edate, grade) values('C312','92414029','98/03/03',70);
insert into enrollments(lcode, scode, edate, grade) values('E221','92414029','98/03/03',75);
insert into enrollments(lcode, scode, edate, grade) values('A109','92414029','98/03/03',90);
insert into enrollments(lcode, scode, edate, grade) values('C301','92514009','98/03/03',70);
insert into enrollments(lcode, scode, edate, grade) values('C401','92514009','98/03/03',85);
insert into enrollments(lcode, scode, edate, grade) values('E221','92514009','98/03/03',85);
insert into enrollments(lcode, scode, edate, grade) values('C301','96414404','98/03/04',75);
insert into enrollments(lcode, scode, edate, grade) values('C401','96414404','98/03/04',75);
insert into enrollments(lcode, scode, edate, grade) values('C421','96414404','98/03/04',75);
insert into enrollments(lcode, scode, edate, grade) values('C312','92454018','98/03/04',90);
insert into enrollments(lcode, scode, edate, grade) values('E221','92454018','98/03/04',90);
insert into enrollments(lcode, scode, edate, grade) values('A109','95454003','98/03/05',85);
insert into enrollments(lcode, scode, edate, grade) values('E221','95454003','98/03/05',85);
SELECT
*
FROM
enrollments;
SELECT
COUNT(*)
FROM
enrollments;
commit;
-- select문 --
# 교수 테이블 검색
select * from professors;
# 교수 테이블에서 교수이름과 학과명을 검색
select pname, dept from professors;
# 교수 테이블에서 교수들이 속학 학과를 중복제거하여 검색
select distinct(dept) from professors;
# 학생 테이블에서 학과가 전산이면서 3학년인 학생 검색
select * from students where dept='전산' and year=3;
# 학생 테이블에서 1학년과 3학년 사이에 있는 학생 검색
select * from students where year between 1 and 3;
# 학생 테이블에서 성이 '이'인 학생 검색
select * from students where sname like '이%';
-- Join문 --
select * from students;
select s.*, p.dept
from students s, professors p
where pcode=advisor;
select c.*, pname
from courses c, professors p
where instructor = pcode;
select e.*, lname, sname
from enrollments e, courses c, students s
where e.lcode=c.lcode and e.scode=s.scode
order by s.sname;
# 강좌별 평균점수
select avg(grade), lcode, lname
from enrollments e, courses c
where e.lcode=c.lcode
group by e.lcode, lname;
# 학생별 평균점수
select avg(grade), e.scode, sname
from enrollments e, students s
where e.scode = s.scode
group by e.scode, sname;
- 테이블을 이용한 뷰를 생성해보자.
# 2021.08.30
select * from professors;
select * from students;
-- 학생의 담당교수 이름과 학과 정보 출력 조인문
select s.*, p.pname , p.dept pdept
from students s, professors p
where p.pcode = s.advisor and s.dept='전산';
-- view로 만들기
create view view_stu as
(select s.*, p.pname , p.dept pdept
from students s, professors p
where p.pcode = s.advisor);
-- 생성한 뷰 확인
select * from view_stu where pname='이병렬';
-- 강좌 테이블 출력
-- 어떤 학과의 어떤 교수가 어떤 수업을 담당하는지 확인하는 view
create view view_cou as
select c.*, p.pname, p.dept
from courses c, professors p
where c.instructor = p.pcode;
-- 생성한 뷰 확인
select * from view_cou;
-- 수강 신청 테이블 출력
-- 학생 테이블의 학생 이름과 강좌 테이블의 강좌 이름
-- 뷰 생성
create view view_enroll as
select e.*,s.sname,c.lname
from enrollments e, students s, courses c
where e.scode = s.scode and e.lcode = c.lcode;
select * from view_enroll;
- Stored Procedures - pl / sql(Procedural Language for SQL) ; 표준 sql을 기반으로 오라클에서 개발한 데이터 조작 언어.
- 목록 출력을 위한 Stored Procedures
CREATE DEFINER=`haksa`@`localhost` PROCEDURE `list`(
in i_table nvarchar(1000),
in i_key nvarchar(50),
in i_word nvarchar(50),
in i_order nvarchar(50),
in i_desc nvarchar(5),
in i_page int,
in i_perPage int
)
BEGIN
set @v_word = concat('%',i_word,'%');
set @v_order = concat(i_order,' ',i_desc);
set @v_start=concat(i_page-1)*i_perPage;
set @v_perPage=i_perPage;
set @v_sql=concat('select * from ',i_table,' where ',i_key,' like ? order by ',@v_order,' limit ?,?');
prepare ps from @v_sql;
execute ps using @v_word, @v_start, @v_perPage;
set @v_sql=concat('select count(*) from ',i_table,' where ',i_key,' like ?');
prepare ps from @v_sql;
execute ps using @v_word;
END
i_table - 이용할 테이블 선택
i_key - 이용할 테이블의 컬럼 선택
i_word - 이용할 테이블의 컬럼의 데이터 선택
@v_sql - 프로시저에서 이용될 데이터 검색 sql문
@v_word - sql문에 '?'에 들어갈 키워드 set
i_order - 이용할 정렬 키워드
i_desc - 내림차순 오름차순 여부
i_page - 페이지 출력 기준
i_perPage - 몇 페이지씩 출력할 것인지
@v_start - 페이지 시작 단위( 5페이지씩 출력한다면 시작페이지가 1, 6, 11과 같이)
v_sql을 여러개 넣으면 그 sql문에 따라서 결과가 나온다.
call list('view_enroll','lname','','lcode','',1,10);
-- 김창덕 학생이 수강신청한 과목중 점수 높은순으로 1,5
call list('view_enroll','sname','김창덕','grade','desc',1,5);
- 이제 교수, 학생, 강좌의 목록과 목록에 데이터를 등록하는 페이지, 서블릿 그리고 이것들을 모아놓을 메인페이지를 만들어 주도록 하겠다.
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>이주성의 학사관리 시스템</title>
<style>
@font-face {
font-family: 'Pretendard-Regular';
src:
url('https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff')
format('woff');
font-weight: 400;
font-style: normal;
}
body {
font-family: 'Pretendard-Regular';
background: white;
}
#container {
width: 960px;
border: 1px solid black;
margin: 0 auto;
padding: 20px;
background: white;
}
#header {
padding: 20px;
border: 1px solid rgb(53, 120, 196);
background: rgb(53, 120, 196);
-webkit-transition: width 2s, height 2s, background-color 2s,
-webkit-transform 2s;
transition: width 2s, height 2s, background-color 2s, transform 2s
}
#center {
padding: 20px;
border: 1px solid black;
margin-top: 10px;
margin-bottom: 10px;
}
#footer {
padding: 20px;
border: 1px solid rgb(53, 120, 196);
color: white;
background: rgb(53, 120, 196);
}
#menu {
overflow: hidden;
border-bottom: 1px dotted black;
background: rgb(53, 120, 196);
}
#menu h4 {
float: left;
width: 130px;
margin-left: 10px;
margin-right: 10px;
text-align: center;
}
h1, h3 {
text-align: center;
}
#content {
border: 1px solid black;
padding: 10px;
margin-top: 10px;
}
a {
text-decoration: none;
color: white;
padding: 10px;
border-radius: 10px;
-webkit-transition: width 0.5s, height 0.5s, background-color 0.5s,
-webkit-transform 1s;
transition: width 0.5s, height 0.5s, background-color 0.5s, transform
0.5s;
}
a:hover {
cursor: pointer;
text-decoration: none;
background: rgb(53, 120, 256);
color: white;
padding: 10px;
border-radius: 10px;
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
}
a:VISITED {
color: white;
}
</style>
</head>
<body>
<div id="container">
<div id="header">
<h1>
<a href="/">학사관리 시스템</a>
</h1>
</div>
<div id="center">
<div id="menu">
<h4>
<a href="/professor/list">교수목록</a>
</h4>
<h4>
<a href="/professor/insert">교수등록</a>
</h4>
<h4>
<a href="/student/list">학생목록</a>
</h4>
<h4>
<a href="/student/insert">학생등록</a>
</h4>
<h4>
<a href="/course/list">강좌목록</a>
</h4>
<h4>
<a href="/course/insert">강좌등록</a>
</h4>
</div>
<div id="content">
<jsp:include page="${pageName}"></jsp:include>
</div>
</div>
<div id="footer">
<h3>Copyright 2021. 이주성의 학사관리 시스템. All rights reserved.</h3>
</div>
</div>
</body>
<script>
var index = ${index};
$("#menu h4:nth-child(" + index + ")").css("border-bottom", '3px solid white');
</script>
</html>
- 고정 클래스를 가지는 객체인 VO를 만들겠다.
- create new SqlVO;
package model;
public class SqlVO {
private String table;
private String key;
private String word;
private String order;
private String desc;
private int page;
private int perPage;
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPerPage() {
return perPage;
}
public void setPerPage(int perPage) {
this.perPage = perPage;
}
@Override
public String toString() {
return "SqlVO [table=" + table + ", key=" + key + ", word=" + word + ", order=" + order + ", desc=" + desc
+ ", page=" + page + ", perPage=" + perPage + "]";
}
}
- 교수관련 리스트와 인서트 dao부터 만들겠다.
- create new ProDAO.java
package model;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.sql.*;
import java.text.SimpleDateFormat;
public class ProDAO {
// 1. 교수목록 메서드
public JSONObject list(SqlVO vo) {
JSONObject object = new JSONObject();
try {
String sql = "call list(?,?,?,?,?,?,?)";
CallableStatement cs = Database.CON.prepareCall(sql);
cs.setString(1, vo.getTable());
cs.setString(2, vo.getKey());
cs.setString(3, vo.getWord());
cs.setString(4, vo.getOrder());
cs.setString(5, vo.getDesc());
cs.setInt(6, vo.getPage());
cs.setInt(7, vo.getPerPage());
cs.execute();
// 1_1 목록 받기
ResultSet rs = cs.getResultSet();
JSONArray array = new JSONArray();
while (rs.next()) {
JSONObject obj = new JSONObject();
obj.put("pcode", rs.getString("pcode"));
obj.put("pname", rs.getString("pname"));
obj.put("dept", rs.getString("dept"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
obj.put("hiredate", sdf.format(rs.getDate("hiredate")));
obj.put("title", rs.getString("title"));
obj.put("salary", rs.getString("salary"));
array.add(obj);
}
object.put("array",array);
} catch (Exception e) {
System.out.println("list : " + e.toString());
}
return object;
}
}
- 해당 메서드를 테스트 해보겠다.
create daotest.java
package model;
public class DAOTest {
public static void main(String[] args) {
ProDAO dao = new ProDAO();
SqlVO vo = new SqlVO();
vo.setTable("professors");
vo.setKey("pcode");
vo.setWord("");
vo.setOrder("pcode");
vo.setDesc("");
vo.setPage(1);
vo.setPerPage(3);
System.out.println(dao.list(vo));
}
}
// 1_2 total 출력
// 결과값을 하나 더 가지고 오라는 메서드
cs.getMoreResults();
rs = cs.getResultSet();
if(rs.next()){
object.put("total", rs.getInt("count(*)"));
}
- 웹으로 데이터를 가지고 오는 REST 서블릿을 따로 만들겠다.
- create new RESTServlet.java
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.ProDAO;
import model.SqlVO;
@WebServlet(value = { "/professor.json" })
public class RESTServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
ProDAO pDao = new ProDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
SqlVO vo = new SqlVO();
vo.setTable("professors");
vo.setKey("pcode");
vo.setWord("");
vo.setOrder("pcode");
vo.setDesc("");
vo.setPage(1);
vo.setPerPage(3);
switch (request.getServletPath()) {
case "/professor.json":
out.println(pDao.list(vo));
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>교수 목록</h1>
<table id="tbl">
</table>
<script id="temp" type="text/x-handlebars-template">
<tr class="title">
<th width=100>교수번호</th>
<th width=100>교수이름</th>
<th width=100>교수학과</th>
<th width=100>교수직급</th>
<th width=100>임용일자</th>
<th width=100>급여</th>
<th width=100>교수정보</th>
</tr>
{{#each array}}
<tr class="row">
<td>{{pcode}}</td>
<td>{{pname}}</td>
<td>{{dept}}</td>
<td>{{title}}</td>
<td>{{hiredate}}</td>
<td>{{salary}}</td>
<td><button>교수정보</button></td>
</tr>
{{/each}}
</script>
<script>
getList();
function getList() {
$.ajax({
type : 'get',
url : '/professor.json',
dataType : 'json',
success : function(data) {
var temp = Handlebars.compile($('#temp').html());
$('#tbl').append(temp(data));
$('#total').html(data.total);
}
})
}
</script>
ㄴ css는 메인에 넣었다.
table {
border-collapse: collapse;
margin: 0px auto;
margin-bottom: 10px;
}
th {
background: rgb(53, 120, 196);
color: white;
}
th, td {
border: 1px solid black;
padding: 10px;
}
- 테이블 상단에 교수번호, 교수이름, 교수학과, 교수직급으로 검색할 수 있는 select tag 및 검색 input을 만들도록 하겠다.
- list.jsp
<h1>교수 목록</h1>
<div id="condition">
<select id="key">
<option value="pcode">교수번호</option>
<option value="pname">교수이름</option>
<option value="dept">교수학과</option>
<option value="title">교수직급</option>
</select> <input type="text" id="word" placeholder="검색어 입력" />
<select id="perPage">
<option value=2>2행</option>
<option value=3>3행</option>
<option value=5>5행</option>
<option value=10>10행</option>
</select>
검색수 : <span id="total"></span>
<select id="order" style="float:right">
<option value="pcode">교수번호</option>
<option value="pname">교수이름</option>
<option value="dept">교수학과</option>
<option value="title">교수직급</option>
</select>
<select id="desc" style="float:right; margin-right: 5px;">
<option value="">오름차순</option>
<option value="desc">내림차순</option>
</select>
</div>
<table id="tbl">
</table>
<div id="pagination">
<button id="prev"><</button>
<span id="page">1</span>
<button id="next">></button>
</div>
ㄴ css는 main,jsp에 넣었다.
#pagination {
text-align: center;
}
#prev, #next {
padding: 5px 20px 5px 20px;
font-size: 15px;
font-weight: bold;
color: white;
border-radius: 5px 5px 5px 5px;
background: rgb(53, 120, 196);
border-radius: 5px 5px 5px 5px;
color: white;
border-radius: 5px 5px 5px 5px;
}
#condition {
margin: 0px 20px 10px 20px;
}
#key, #perPage, #order, #desc {
height: 25px;
}
#word {
height: 20px;
}
- 페이지 이전, 이후 버튼을 만들어주고 각 select toption 조건에 따라서 alert이 뜨게 해보자.
<script>
var page = 1;
$('#prev').on('click', function() {
page--;
getList();
})
$('#next').on('click', function() {
page++;
getList();
})
$('#word').on('keypress', function(e) {
if (e.keyCode==13) {
page = 1;
getList();
}
})
$('#perPage, #order, #desc').on('chage',function(){
page=1;
getList();
})
getList();
function getList() {
var key = $('#key').val();
var word = $('#word').val();
var perPage = $('#perPage').val();
var order = $('#order').val();
var desc = $('#desc').val();
alert(key+"\n"+word+"\n"+perPage+"\n"+order+"\n"+desc+"\n")
$.ajax({
type : 'get',
url : '/professor.json',
dataType : 'json',
data : {
"key" : key,
"word" : word,
"page" : page,
"perPage" : perPage,
"order" : order,
"desc" : desc
},
success : function(data) {
var temp = Handlebars.compile($('#temp').html());
$('#tbl').html(temp(data));
$('#total').html(data.total);
var lastPage = Math.ceil(data.total / perPage)
$('#page').html(page + "/" + lastPage);
if (page == 1) {
$('#prev').attr('disabled', true)
$('#prev').css('background', 'gray')
} else {
$('#prev').attr('disabled', false)
$('#prev').css('background', 'rgb(53, 120, 196)')
}
if (page == lastPage) {
$('#next').attr('disabled', true)
$('#next').css('background', 'gray')
} else {
$('#next').attr('disabled', false)
$('#next').css('background', 'rgb(53, 120, 196)')
}
}
})
}
</script>
- 이제 ajax을 통해서 넘긴 데이터를 RESTServlet에서 받도록 하자.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 한글 깨짐 방지
response.setContentType("text/html;charset=UTF-8");
// 출력 클래스
PrintWriter out = response.getWriter();
SqlVO vo = new SqlVO();
vo.setTable("professors");
vo.setKey(request.getParameter("key"));
vo.setWord(request.getParameter("word"));
vo.setOrder(request.getParameter("order"));
vo.setDesc(request.getParameter("desc"));
vo.setPage(Integer.parseInt(request.getParameter("page")));
vo.setPerPage(Integer.parseInt(request.getParameter("perPage")));
switch (request.getServletPath()) {
case "/professor.json":
out.println(pDao.list(vo));
break;
}
}
- 마찬가지로 student, course를 list 출력해보도록 하겠다.
1. 학생목록
- create new StuDAO.java
package model;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class StuDAO {
// 1. 학생 목록 출력
public JSONObject list(SqlVO vo){
JSONObject object = new JSONObject();
try {
String sql = "call list(?,?,?,?,?,?,?)";
CallableStatement cs = Database.CON.prepareCall(sql);
cs.setString(1, vo.getTable());
cs.setString(2, vo.getKey());
cs.setString(3, vo.getWord());
cs.setString(4, vo.getOrder());
cs.setString(5, vo.getDesc());
cs.setInt(6, vo.getPage());
cs.setInt(7, vo.getPerPage());
cs.execute();
// 1_1 목록 받기
ResultSet rs = cs.getResultSet();
JSONArray array = new JSONArray();
while(rs.next()){
JSONObject obj = new JSONObject();
obj.put("scode", rs.getString("scode"));
obj.put("sname", rs.getString("sname"));
obj.put("dept", rs.getString("dept"));
obj.put("year", rs.getInt("year"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
obj.put("birthday", sdf.format(rs.getDate("birthday")));
obj.put("advisor", rs.getString("advisor"));
obj.put("pname", rs.getString("pname"));
array.add(obj);
}
object.put("array", array);
// 1_2 토탈 받기
cs.getMoreResults();
rs = cs.getResultSet();
if(rs.next()){
object.put("total", rs.getInt("count(*)"));
}
} catch (Exception e) {
System.out.println("student list : "+e.toString());
}
return object;
}
}
- RESTServlet.java
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.ProDAO;
import model.SqlVO;
import model.StuDAO;
@WebServlet(value = { "/professor.json","/student.json" })
public class RESTServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
ProDAO pDao = new ProDAO();
StuDAO sDao = new StuDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 한글 깨짐 방지
response.setContentType("text/html;charset=UTF-8");
// 출력 클래스
PrintWriter out = response.getWriter();
SqlVO vo = new SqlVO();
vo.setKey(request.getParameter("key"));
vo.setWord(request.getParameter("word"));
vo.setOrder(request.getParameter("order"));
vo.setDesc(request.getParameter("desc"));
vo.setPage(Integer.parseInt(request.getParameter("page")));
vo.setPerPage(Integer.parseInt(request.getParameter("perPage")));
switch (request.getServletPath()) {
case "/professor.json":
vo.setTable("professors");
out.println(pDao.list(vo));
break;
case "/student.json":
vo.setTable("view_stu");
out.println(sDao.list(vo));
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
- student\list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>학생 목록</h1>
<div id="condition">
<select id="key">
<option value="scode">학생번호</option>
<option value="sname">학생이름</option>
<option value="dept">학생학과</option>
<option value="year">학년</option>
</select> <input type="text" id="word" placeholder="검색어 입력" /> <select
id="perPage">
<option value=2>2행</option>
<option value=3>3행</option>
<option value=5>5행</option>
<option value=10>10행</option>
</select> 검색수 : <span id="total"></span> <select id="desc" style="float: right;">
<option value="">오름차순</option>
<option value="desc">내림차순</option>
</select> <select id="order" style="float: right; margin-right: 5px;">
<option value="scode">학생번호</option>
<option value="sname">학생이름</option>
<option value="dept">학생학과</option>
<option value="year">학년</option>
</select>
</div>
<table id="tbl">
</table>
<div id="pagination">
<button id="prev"><</button>
<span id="page"></span>
<button id="next">></button>
</div>
<script id="temp" type="text/x-handlebars-template">
<tr class="title">
<th width=100>학생번호</th>
<th width=100>학생이름</th>
<th width=100>학생학과</th>
<th width=100>학년</th>
<th width=100>생년월일</th>
<th width=100>지도교수</th>
<th width=100>학생정보</th>
</tr>
{{#each array}}
<tr class="row">
<td>{{scode}}</td>
<td>{{sname}}</td>
<td>{{dept}}</td>
<td>{{year}}</td>
<td>{{birthday}}</td>
<td>{{advisor}} / {{pname}}</td>
<td><button>학생정보</button></td>
</tr>
{{/each}}
</script>
<script>
var page = 1;
$("#prev").on("click", function() {
page--;
getList();
});
$("#next").on("click", function() {
page++;
getList();
})
$("#word").on("keypress", function(e) {
if (e.keyCode == 13) {
page = 1;
getList();
}
});
$("#perPage, #order, #desc").on("change", function() {
page = 1;
getList();
});
getList();
function getList() {
var key = $('#key').val();
var word = $('#word').val();
var perPage = $('#perPage').val();
var order = $('#order').val();
var desc = $('#desc').val();
$.ajax({
type : 'get',
url : '/student.json',
dataType : 'json',
data : {
"key" : key,
"word" : word,
"page" : page,
"perPage" : perPage,
"order" : order,
"desc" : desc
},
success : function(data) {
var temp = Handlebars.compile($('#temp').html());
$('#tbl').html(temp(data));
$('#total').html(data.total);
var lastPage = Math.ceil(data.total / perPage)
$('#page').html("[ " + page + "/" + lastPage + " ]");
if (page == 1) {
$('#prev').attr('disabled', true)
$('#prev').css('background', 'gray')
} else {
$('#prev').attr('disabled', false)
$('#prev').css('background', 'rgb(53, 120, 196)')
}
if (page == lastPage) {
$('#next').attr('disabled', true)
$('#next').css('background', 'gray')
} else {
$('#next').attr('disabled', false)
$('#next').css('background', 'rgb(53, 120, 196)')
}
}
})
}
</script>
2. 강좌목록
- create new CouDAO.java
package model;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class CouDAO {
// 1. 수강목록 출력
public JSONObject list(SqlVO vo){
JSONObject object = new JSONObject();
try {
String sql = "call list(?,?,?,?,?,?,?)";
CallableStatement cs = Database.CON.prepareCall(sql);
cs.setString(1, vo.getTable());
cs.setString(2, vo.getKey());
cs.setString(3, vo.getWord());
cs.setString(4, vo.getOrder());
cs.setString(5, vo.getDesc());
cs.setInt(6, vo.getPage());
cs.setInt(7, vo.getPerPage());
cs.execute();
// 1_1 목록 받기
ResultSet rs = cs.getResultSet();
JSONArray array = new JSONArray();
while(rs.next()){
JSONObject obj = new JSONObject();
obj.put("lcode", rs.getString("lcode"));
obj.put("lname", rs.getString("lname"));
obj.put("hours", rs.getInt("hours"));
obj.put("room", rs.getString("room"));
obj.put("pname", rs.getString("pname"));
obj.put("persons", rs.getInt("persons"));
obj.put("capacity", rs.getString("capacity"));
array.add(obj);
}
object.put("array", array);
// 1_2 토탈 받기
cs.getMoreResults();
rs = cs.getResultSet();
if(rs.next()){
object.put("total", rs.getInt("count(*)"));
}
} catch (Exception e) {
System.out.println("courses list : "+e.toString());
}
return object;
}
}
- RESTServlet.java
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.CouDAO;
import model.ProDAO;
import model.SqlVO;
import model.StuDAO;
@WebServlet(value = { "/professor.json", "/student.json", "/course.json" })
public class RESTServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
ProDAO pDao = new ProDAO();
StuDAO sDao = new StuDAO();
CouDAO cDao = new CouDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 한글 깨짐 방지
response.setContentType("text/html;charset=UTF-8");
// 출력 클래스
PrintWriter out = response.getWriter();
SqlVO vo = new SqlVO();
vo.setKey(request.getParameter("key"));
vo.setWord(request.getParameter("word"));
vo.setOrder(request.getParameter("order"));
vo.setDesc(request.getParameter("desc"));
vo.setPage(Integer.parseInt(request.getParameter("page")));
vo.setPerPage(Integer.parseInt(request.getParameter("perPage")));
switch (request.getServletPath()) {
case "/professor.json":
vo.setTable("professors");
out.println(pDao.list(vo));
break;
case "/student.json":
vo.setTable("view_stu");
out.println(sDao.list(vo));
break;
case "/course.json":
vo.setTable("view_cou");
out.println(cDao.list(vo));
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
- course\list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>강좌 목록</h1>
<div id="condition">
<select id="key">
<option value="lcode">강좌번호</option>
<option value="lname">강좌이름</option>
<option value="room">강의실</option>
<option value="pname">담당교수</option>
</select> <input type="text" id="word" placeholder="검색어 입력" /> <select
id="perPage">
<option value=2>2행</option>
<option value=3>3행</option>
<option value=5>5행</option>
<option value=10>10행</option>
</select> 검색수 : <span id="total"></span> <select id="desc" style="float: right;">
<option value="">오름차순</option>
<option value="desc">내림차순</option>
</select> <select id="order" style="float: right; margin-right: 5px;">
<option value="lcode">강좌번호</option>
<option value="lname">강좌이름</option>
<option value="room">강의실</option>
<option value="pname">담당교수</option>
</select>
</div>
<table id="tbl">
</table>
<div id="pagination">
<button id="prev"><</button>
<span id="page"></span>
<button id="next">></button>
</div>
<script id="temp" type="text/x-handlebars-template">
<tr class="title">
<th width=100>강좌번호</th>
<th width=220>강좌이름</th>
<th width=80>강의시간</th>
<th width=80>강의실</th>
<th width=80>담당교수</th>
<th width=80>수강인원</th>
<th width=80>최대인원</th>
<th width=80>강좌정보</th>
</tr>
{{#each array}}
<tr class="row">
<td>{{lcode}}</td>
<td>{{lname}}</td>
<td>{{hours}}</td>
<td>{{room}}</td>
<td>{{pname}}</td>
<td>{{persons}}</td>
<td>{{capacity}}</td>
<td><button>강좌정보</button></td>
</tr>
{{/each}}
</script>
<script>
var page = 1;
$("#prev").on("click", function() {
page--;
getList();
});
$("#next").on("click", function() {
page++;
getList();
})
$("#word").on("keypress", function(e) {
if (e.keyCode == 13) {
page = 1;
getList();
}
});
$("#perPage, #order, #desc").on("change", function() {
page = 1;
getList();
});
getList();
function getList() {
var key = $('#key').val();
var word = $('#word').val();
var perPage = $('#perPage').val();
var order = $('#order').val();
var desc = $('#desc').val();
$.ajax({
type : 'get',
url : '/course.json',
dataType : 'json',
data : {
"key" : key,
"word" : word,
"page" : page,
"perPage" : perPage,
"order" : order,
"desc" : desc
},
success : function(data) {
var temp = Handlebars.compile($('#temp').html());
$('#tbl').html(temp(data));
$('#total').html(data.total);
var lastPage = Math.ceil(data.total / perPage)
$('#page').html("[ " + page + "/" + lastPage + " ]");
if (page == 1) {
$('#prev').attr('disabled', true)
$('#prev').css('background', 'gray')
} else {
$('#prev').attr('disabled', false)
$('#prev').css('background', 'rgb(53, 120, 196)')
}
if (page == lastPage) {
$('#next').attr('disabled', true)
$('#next').css('background', 'gray')
} else {
$('#next').attr('disabled', false)
$('#next').css('background', 'rgb(53, 120, 196)')
}
}
})
}
</script>
- 교수 목록에서 급여의 format을 바꾸고 싶다면 다음과 같이 한다.
- ProDAO.java
while (rs.next()) {
JSONObject obj = new JSONObject();
obj.put("pcode", rs.getString("pcode"));
obj.put("pname", rs.getString("pname"));
obj.put("dept", rs.getString("dept"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
obj.put("hiredate", sdf.format(rs.getDate("hiredate")));
obj.put("title", rs.getString("title"));
DecimalFormat df = new DecimalFormat(); // new
obj.put("salary", df.format(rs.getInt("salary"))); // renew
array.add(obj);
}
- 교수 등록을 하겠다.
- 우선 데이터 객체 클래스 VO를 만들겠다.
- create new ProVO.java
package model;
import java.sql.Date;
public class ProVO {
private String pcode;
private String pname;
private String dept;
private String title;
private String hiredate;
private int salaray;
public String getPcode() {
return pcode;
}
public void setPcode(String pcode) {
this.pcode = pcode;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public int getSalaray() {
return salaray;
}
public void setSalaray(int salaray) {
this.salaray = salaray;
}
@Override
public String toString() {
return "ProVO [pcode=" + pcode + ", pname=" + pname + ", dept=" + dept + ", title=" + title + ", hiredate="
+ hiredate + ", salaray=" + salaray + "]";
}
}
- ProDAO.java
- 등록을 위한 insert 메서드를 만들겠다.
// 2. 교수등록 메서드
public void insert(ProVO vo) {
try {
String sql = "insert into professors(pcode,pname,dept,title,hiredate,salary) values(?,?,?,?,?,?)";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ps.setString(1, vo.getPcode());
ps.setString(2, vo.getPname());
ps.setString(3, vo.getDept());
ps.setString(4, vo.getTitle());
ps.setString(5, vo.getHiredate());
ps.setInt(6, vo.getSalaray());
ps.execute();
} catch (Exception e) {
System.out.println("ProDAO insert : " + e.toString());
}
}
- ProServlet에서 vo를 받아 insert 작업을 하겠다.
- ProServlet.java
package controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.ProDAO;
import model.ProVO;
@WebServlet(value = { "/professor/list", "/professor/insert", "/professor/read", "/professor/update",
"/professor/delete" })
public class ProServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
ProDAO pdao = new ProDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
switch (request.getServletPath()) {
case "/professor/list":
RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/professor/list.jsp");
request.setAttribute("index", 1);
dis.forward(request, response);
break;
case "/professor/insert":
dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/professor/insert.jsp");
request.setAttribute("index", 2);
dis.forward(request, response);
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
ProVO vo = new ProVO();
vo.setPcode(request.getParameter("pcode"));
vo.setPname(request.getParameter("pname"));
vo.setDept(request.getParameter("dept"));
vo.setTitle(request.getParameter("title"));
vo.setHiredate(request.getParameter("hiredate"));
vo.setSalaray(Integer.parseInt(request.getParameter("salary")));
switch (request.getServletPath()) {
case "/professor/insert":
pdao.insert(vo);
break;
}
}
}
- professor\insert.jsp에서 입력 폼을 만들겠다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<style>
form{
width:400px;
margin: 0px auto;
}
</style>
<h1>교수 등록</h1>
<form name="frm">
<span>교수코드 : </span><input name="pcode" /><hr/>
<span>교수이름 : </span><input name="pname" /><hr/>
<span>교수학과 : </span>
<select name="dept">
<option value="전산">전산</option>
<option value="전자">전자</option>
<option value="건축">건축</option>
</select>
<hr/>
<span>교수직급 : </span>
<input type="radio" value="정교수" name="title" checked/>정교수
<input type="radio" value="부교수" name="title" />부교수
<input type="radio" value="조교수" name="title" />조교수<hr/>
<span>임용일자 : </span>
<input name="yy" size=4/>년
<input name="mm" size=2/>월
<input name="dd" size=2/>일
<hr />
<span>급여 : </span>
<input name="salary" value="0" /> 원
<hr />
<input type="submit" value="교수등록" />
<input type="reset" value="등록취소" />
</form>
<script>
</script>
- 교수코드의 최대값을 구해 다음 교수 등록시 이용하도록 하겠다.
- ProDAO.java
// 3. 교수코드 등록을 위한 code 최대값 구하기
public String maxCode(){
String code="";
try {
String sql = "select max(pcode) from professors";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()){
code =rs.getString("max(pcode)");
}
} catch (Exception e) {
System.out.println("ProDAO maxCode : "+e.toString());
}
return code;
}
- ProServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
switch (request.getServletPath()) {
case "/professor/list":
RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/professor/list.jsp");
request.setAttribute("index", 1);
dis.forward(request, response);
break;
case "/professor/insert":
dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/professor/insert.jsp");
request.setAttribute("code", pdao.maxCode());
request.setAttribute("index", 2);
dis.forward(request, response);
break;
}
}
- insert.jsp
<h1>교수 등록</h1>
<form name="frm">
<span>교수코드 : </span><input name="pcode" value="${code+1}"/><hr/>
<span>교수이름 : </span><input name="pname" /><hr/>
<span>교수학과 : </span>
- insert.jsp
<span>임용일자 : </span>
<input name="yy" size=4 value="2021"/>년
<input name="mm" size=2 value="08"/>월
<input name="dd" size=2 value="30"/>일
<hr />
- ProServlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
ProVO vo = new ProVO();
vo.setPcode(request.getParameter("pcode"));
vo.setPname(request.getParameter("pname"));
vo.setDept(request.getParameter("dept"));
vo.setTitle(request.getParameter("title"));
String yy = request.getParameter("yy");
String mm = request.getParameter("mm");
String dd = request.getParameter("dd");
vo.setHiredate(yy+"-"+mm+"-"+dd);
vo.setSalaray(Integer.parseInt(request.getParameter("salary")));
switch (request.getServletPath()) {
case "/professor/insert":
pdao.insert(vo);
break;
}
}
- insert.jsp
<script>
$(frm).on("submit",function(e){
e.preventDefault();
var pname=$(frm.pname).val();
if(pname==""){
alert("교수 이름을 입력하세요.")
$(frm.pname).focus();
return;
}
var salary=$(frm.salary).val();
if(salary=="" || salary.replace(/[0-9]/g,'')){
alert("교수 급여를 '숫자로만' 입력하세요.")
$(frm.salary).focus();
return;
}
if(!confirm("등록 하시겠습니까?")) return;
frm.action="/professor/insert";
frm.method="post";
frm.submit();
})
</script>
- 임용일자를 오늘 날짜로 가지고 올 수 있도록 하겠다.
- ProServlet.java
case "/professor/insert":
dis = request.getRequestDispatcher("/main.jsp");
SimpleDateFormat sdf = new SimpleDateFormat("yyyMMdd");
String date = sdf.format(new Date());
request.setAttribute("yy", date.substring(0, 4));
request.setAttribute("mm", date.substring(4, 6));
request.setAttribute("dd", date.substring(6, 8));
request.setAttribute("pageName", "/professor/insert.jsp");
request.setAttribute("code", pdao.maxCode());
request.setAttribute("index", 2);
dis.forward(request, response);
break;
}
- insert.jsp
<span>임용일자 : </span>
<input name="yy" size=4 value="${yy}"/>년
<input name="mm" size=2 value="${mm}"/>월
<input name="dd" size=2 value="${dd}"/>일
<hr />
'ICIA 수업일지' 카테고리의 다른 글
2021.09.01 수업일지(Servlet, Mysql, pl/sql, Template) (0) | 2021.09.01 |
---|---|
2021.08.31 수업일지(Spring, Servlet, MVC, Mysql, PL/SQL, JAVA) (0) | 2021.08.31 |
2021.08.27 수업일지(Servlet, Spring, Mysql, Selenium) (0) | 2021.08.27 |
2021.08.26 수업일지(Servlet, Spring, Mysql) (0) | 2021.08.26 |
2021.08.25 수업일지(Servlet, Spring, Mysql) (0) | 2021.08.25 |