- pl/sql
- list
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
- 강좌정보를 누르면 페이지로 이동하는 작업을 해주겠다.
- list.jsp
{{#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 onClick="location.href='/course/read?lcode={{lcode}}'">강좌정보</button></td>
</tr>
{{/each}}
- create new course\read.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/functions"%>
<style>
.title {
background: rgb(53, 120, 196);
color: white;
text-align: center;
}
</style>
<h1>강좌정보</h1>
<form name="frm">
<table>
<tr>
<td class="title" width=100>강좌번호</td>
<td width=100><input name="lcode" value="" size=3 readonly/></td>
<td class="title" width=100>강의실</td>
<td width=100><input name="room" value="" size=3 /></td>
<td class="title" width=100>강의시수</td>
<td width=100><input name="hours" value="" size=3/></td>
</tr>
<tr>
<td class="title" width=100>강좌이름</td>
<td colspan="3"><input name="lname" value="" size=5 /></td>
<td class="title" width=100>최대수강인원</td>
<td width=100><input name="capacity" value="" size=3 /></td>
</tr>
<tr>
<td class="title" width=100>담당교수</td>
<td colspan="3">
<input name="pcode" value="" size=5 />
<input name="pname" value="" size=5 />
</td>
<td class="title" width=100>수강신청인원</td>
<td width=100><input name="persons" value="" size=3 /></td>
</tr>
</table>
<div style="text-align: center; margin-top:10px;">
<input type="submit" value="정보수정" />
<input type="reset" value="수정취소" />
</div>
</form>
<script>
$(frm).on('submit',function(e){
e.preventDefault();
if(!confirm("수정하시겠습니까?"))return;
frm.action="/course/update";
frm.method="post";
frm.submit();
});
</script>
- couservlet.java
@WebServlet(value = { "/course/list", "/course/insert", "/course/read", "/course/update" })
public class CouServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
CouDAO dao = new CouDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
switch (request.getServletPath()) {
case "/course/read":
RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/course/read.jsp");
dis.forward(request, response);
break;
- 강좌 정보를 불러오는 dao를 만들겠다.
- 우선 pname을 가지고 와야하니 couVO 가 proVO를 상속하도록 하겠다.
- CouVO
public class CouVO extends ProVO{
private String lcode;
private String lname;
private int hours;
private String room;
private int capacity;
private int persons;
private String instructor;
- CouDAO
// 4. 강좌 정보를 불러오는 메서드
public CouVO read(String lcode) {
CouVO vo = new CouVO();
try {
String sql = "select * from view_cou where lcode=?";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ps.setString(1, lcode);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
vo.setLcode(rs.getString("lcode"));
vo.setLname(rs.getString("lname"));
vo.setHours(rs.getInt("hours"));
vo.setRoom(rs.getString("room"));
vo.setInstructor(rs.getString("instructor"));
vo.setPname(rs.getString("pname"));
vo.setCapacity(rs.getInt("capacity"));
vo.setPersons(rs.getInt("persons"));
}
} catch (Exception e) {
System.out.println("CouVO read : " + e.toString());
}
return vo;
}
- CouServlet
@WebServlet(value = { "/course/list", "/course/insert", "/course/read", "/course/update" })
public class CouServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
CouDAO dao = new CouDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
switch (request.getServletPath()) {
case "/course/read":
RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/course/read.jsp");
request.setAttribute("vo", dao.read(request.getParameter("lcode")));
dis.forward(request, response);
break;
- read.jsp
<form name="frm">
<table>
<tr>
<td class="title" width=100>강좌번호</td>
<td width=150><input name="lcode" value="${vo.lcode}" size=5 readonly/></td>
<td class="title" width=100>강의실</td>
<td width=150><input name="room" value="${vo.room}" size=5 /></td>
<td class="title" width=100>강의시수</td>
<td width=150><input name="hours" value="${vo.hours}" size=5/></td>
</tr>
<tr>
<td class="title" width=100>강좌이름</td>
<td colspan="3"><input name="lname" value="${vo.lname}" size=60 /></td>
<td class="title" width=100>최대수강인원</td>
<td width=100><input name="capacity" value="${vo.capacity}" size=5 /></td>
</tr>
<tr>
<td class="title" width=100>담당교수</td>
<td colspan="3">
<input name="pcode" value="${vo.instructor}" size=5 />
<input name="pname" value="${vo.pname}" size=5 />
</td>
<td class="title" width=100>수강신청인원</td>
<td width=100><input name="persons" value="${vo.persons}" size=5 /></td>
</tr>
</table>
<div style="text-align: center; margin-top:10px;">
<input type="submit" value="정보수정" />
<input type="reset" value="수정취소" />
</div>
</form>
- pcode 클릭시 search.jsp 가 팝업되는걸로 하자.
$(frm.pcode).on(
'click',
function() {
window.open("/professor/search.jsp", "advisor",
"width=500, height=350,top=200,left=900");
})
- 강좌 수정하는 메서드를 만들겠다.
- CouDAO
// 5. 강좌 수정하는 메서드
public void update(CouVO vo){
try {
String sql = "update courses set lname=?, room=?, capacity=?, hours=?, instructor=? where lcode=?";
PreparedStatement ps= Database.CON.prepareStatement(sql);
ps.setString(1, vo.getLname());
ps.setString(2, vo.getRoom());
ps.setInt(3, vo.getCapacity());
ps.setInt(4, vo.getHours());
ps.setString(5, vo.getInstructor());
ps.setString(6, vo.getLcode());
ps.execute();
} catch (Exception e) {
System.out.println("CouDAO update : "+e.toString());
}
}
- CouServlet
case "/course/update":
dao.update(vo);
response.sendRedirect("/course/list");
break;
}
- 이제 수정하는 것은 완료되었다.
- 특정 교수가 담당하는 목록을 불러오는 메서드를 생성하겠다.
- ProDAO.java
// 6. 특정 교수가 담당하는 목록 불러오는 메서드
public JSONObject cou_list(String pcode){
JSONObject object = new JSONObject();
try {
String sql = "select * from courses where instructor=?";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ps.setString(1, pcode);
ResultSet rs = ps.executeQuery();
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("instructor", rs.getString("instructor"));
obj.put("capacity", rs.getInt("capacity"));
obj.put("persons", rs.getInt("persons"));
array.add(obj);
}
object.put("array", array);
} catch (Exception e) {
System.out.println("ProDAO cou_list : "+e.toString());
}
return object;
}
- 이 메서드를 출력하는 .json servlet을 checkServlet에서 하겠다.
- CheckServlet.java
@WebServlet(value={"/check_lcode","/pro_cou_list.json"})
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
CouDAO cdao = new CouDAO();
ProDAO pdao = new ProDAO(); // new
switch (request.getServletPath()) { // new
case "/check_lcode":
out.println(cdao.check(request.getParameter("lcode")));
break;
case "/pro_cou_list.json": // new
out.println(pdao.cou_list(request.getParameter("pcode")));
break;
}
}
- 이제 json 데이터를 ajax으로 불러와 출려해보도록 하겠다.
<h1>담당강좌</h1>
<table id="ctbl"></table>
<script id="ctemp" type="text/x-handlebars-template">
<tr class="title">
<th width=80>강좌번호</th>
<th width=200>강좌이름</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>{{room}}</td>
<td>{{hours}}</td>
<td>{{capacity}}</td>
<td>{{persons}}</td>
<td><button>강좌정보</button></td>
</tr>
{{/each}}
</script>
<script>
// 담당광좌목록 출력
var pcode = "${vo.pcode}";
$.ajax({
type : 'get',
url : '/pro_cou_list.json',
dataType : 'json',
data : {
"pcode" : pcode
},
success : function(data) {
var temp = Handlebars.compile($('#ctemp').html());
$('#ctbl').html(temp(data));
}
})
$(frm).on('submit', function(e) {
e.preventDefault();
if (!confirm("수정하시겠습니까?"))
return;
frm.action = "/professor/update";
frm.method = "post";
frm.submit();
});
</script>
- 담당학생, 지도학생을 교수정보에 출력해보도록 하겠다.
- ProDAO 에 특정교수가 담당하는 학생 목록을 출력하는 메서드를 가지고 오겠다.
- ProDAO
// 7. 특정 교수가 담당하는 학생 목록 불러오는 메서드
public JSONObject stu_list(String pcode){
JSONObject object = new JSONObject();
try {
String sql = "select * from students where advisor=?";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ps.setString(1, pcode);
ResultSet rs = ps.executeQuery();
JSONArray array = new JSONArray();
while(rs.next()){
JSONObject obj = new JSONObject();
obj.put("lcode", rs.getString("scode"));
obj.put("sname", rs.getString("sname"));
obj.put("dept", rs.getString("dept"));
obj.put("year", rs.getInt("year"));
obj.put("birthday", rs.getString("birthday"));
array.add(obj);
}
object.put("array", array);
} catch (Exception e) {
System.out.println("ProDAO stu_list : "+e.toString());
}
return object;
}
- CheckServlet
@WebServlet(value={"/check_lcode","/pro_cou_list.json","/pro_stu_list.json"})
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
CouDAO cdao = new CouDAO();
ProDAO pdao = new ProDAO();
switch (request.getServletPath()) {
case "/check_lcode":
out.println(cdao.check(request.getParameter("lcode")));
break;
case "/pro_cou_list.json":
out.println(pdao.cou_list(request.getParameter("pcode")));
break;
case "/pro_stu_list.json": // new
out.println(pdao.stu_list(request.getParameter("pcode")));
break;
}
}
- 학생정보란에서 수강신청하는 section을 만들겠다.
- 강좌 목록을 출력하는 메서드를 생성하겠다.
- CouDAO.java
// 6. 강좌 목록 출력하는 메서드
public ArrayList<CouVO> all_list(){
ArrayList<CouVO> list = new ArrayList<CouVO>();
try {
String sql = "select * from view_cou order by lname";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
CouVO vo = new CouVO();
vo.setLcode(rs.getString("lcode"));
vo.setLname(rs.getString("lname"));
vo.setPname(rs.getString("pname"));
list.add(vo);
}
} catch (Exception e) {
System.out.println("CouDAO all_list : "+e.toString());
}
return list;
}
- 학생 서블릿에서 학생정보란에 불러올 수 있도록 하겠다.
- Stuservlet
@WebServlet(value = { "/student/list", "/student/insert","/student/read","/student/update" })
public class StuServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
StuDAO dao = new StuDAO();
CouDAO cdao = new CouDAO();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
switch (request.getServletPath()) {
case "/student/read":
RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
request.setAttribute("pageName", "/student/read.jsp");
request.setAttribute("vo", dao.read(request.getParameter("scode")));
request.setAttribute("list", cdao.all_list()); // new
dis.forward(request, response);
break;
- student\read.jsp
- list에 담은 vo 값을 read page에 출력하도록 하겠다.
<h1>수강신청</h1>
<div>
<table>
<tr>
<td class="title" width=100 height=25>수강신청과목</td>
<td width=640>
<select id="lcode">
<c:forEach items="${list}" var="vo">
<option value="${vo.lcode}">${vo.lcode}/${vo.lname}/
${vo.pname}</option>
</c:forEach>
</select>
<button>수강취소</button>
</td>
</tr>
</table>
</div>
- sql
create view view_enroll_cou as
select e.scode, e.edate, e.grade, c.* ,pname
from enrollments e, courses c, professors p
where e.lcode=c.lcode and pcode=instructor ;
- StuDAO.java
// 6. 특정 학생이 신청한 강좌목록
public JSONObject enroll_cou(String scode){
JSONObject object = new JSONObject();
try {
String sql = "select * from view_enroll_cou where scode=?";
PreparedStatement ps = Database.CON.prepareStatement(sql);
ps.setString(1, scode);
ResultSet rs = ps.executeQuery();
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("edate", rs.getString("edate"));
obj.put("pname", rs.getString("pname"));
obj.put("room", rs.getString("room"));
obj.put("persons", rs.getString("persons"));
obj.put("hours", rs.getInt("hours"));
array.add(obj);
}
object.put("array",array);
} catch (Exception e) {
System.out.println("StuDAO enroll_cou : "+e.toString());
}
return object;
}
- checkservlet.java
@WebServlet(value={"/stu_enroll_list.json","/check_lcode","/pro_cou_list.json","/pro_stu_list.json"})
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
CouDAO cdao = new CouDAO();
ProDAO pdao = new ProDAO();
StuDAO sdao = new StuDAO();
switch (request.getServletPath()) {
case "/stu_enroll_list.json":
out.println(sdao.enroll_cou(request.getParameter("scode")));
break;
-read.jsp
<h1>수강신청</h1>
<table>
<tr>
<td class="title" width=100 height=25>수강신청과목</td>
<td width=640>
<select id="lcode">
<c:forEach items="${list}" var="vo">
<option value="${vo.lcode}">${vo.lcode}/${vo.lname}/
${vo.pname}</option>
</c:forEach>
</select>
<button>수강신청</button>
</td>
</tr>
</table>
<table id="stbl"></table>
<script id="stemp" type="text/x-handlebars-template">
<tr class="title">
<th width=70>강좌번호</th>
<th width=190>강좌이름</th>
<th width=100>수강신청일</th>
<th width=70>담당교수</th>
<th width=70>강의시수</th>
<th width=70>수강인원</th>
<th width=70>수강취소</th>
</tr>
{{#each array}}
<tr class="row">
<td>{{lcode}}</td>
<td>{{lname}}</td>
<td>{{edate}}</td>
<td>{{pname}}</td>
<td>{{hours}}</td>
<td>{{persons}}</td>
<td><button>수강취소</button></td>
</tr>
{{/each}}
</script>
<script>
var scode="${vo.scode}";
$.ajax({
type:'get',
url:'/stu_enroll_list.json',
data:{
'scode':scode
},
dataType:'json',
success:function(data){
var temp = Handlebars.compile($('#stemp').html());
$('#stbl').html(temp(data));
}
})
- 이미 수강신청된 과목은 안되고, 수강신청되면 수강인원 늘어나고(update), 수강신청이 되면 수강신청 란에 넣어주도록(insert) 하겠다.
- 이를 위해 stored procudure 을 이용하겠다.
- pl/sql
CREATE DEFINER=`haksa`@`localhost` PROCEDURE `enroll`(
in i_scode nchar(8),
in i_lcode nchar(4),
out o_count int
)
BEGIN
select count(*) into o_count from enrollments
where scode=i_scode and lcode=i_lcode;
IF (o_count=0)THEN
INSERT INTO enrollments(scode,lcode,edate,grade)
VALUES(i_scode,i_lcode,now(),0);
UPDATE courses SET persons=persons+1 WHERE lcode=i_lcode;
END IF;
END
- 수강신청을 위한 메서드를 생성하겠다.
- StuDAO.java
// 7. 수강신청을 위한 메서드
public int enroll(String lcode, String scode){
int count =0;
try {
String sql ="call enroll(?,?,?)";
CallableStatement cs = Database.CON.prepareCall(sql);
cs.setString(1, scode);
cs.setString(2, lcode);
cs.registerOutParameter(3, java.sql.Types.INTEGER);
cs.execute();
count = cs.getInt(3);
} catch (Exception e) {
System.out.println("StuDAO enroll : "+e.toString());
}
return count;
}
- checkservlet.java
@WebServlet(value={"/enroll","/stu_enroll_list.json","/check_lcode","/pro_cou_list.json","/pro_stu_list.json"})
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
CouDAO cdao = new CouDAO();
ProDAO pdao = new ProDAO();
StuDAO sdao = new StuDAO();
switch (request.getServletPath()) {
case "/enroll":
int count = sdao.enroll(request.getParameter("lcode"), request.getParameter("scode"));
out.println(count); // 0 신청가능, 1 이미신청
break;
- read.jsp
var scode = "${vo.scode}";
$("#enroll").on('click',function(){
var lcode=$('#lcode').val();
if(!confirm(lcode + "을(를) 수강신청하시겠습니까?")) return;
$.ajax({
type:'get',
url:'/enroll',
data:{'scode':scode,'lcode':lcode},
success:function(data){
if(data==0){
alert("수강신청 되었습니다.")
getList();
}else{
alert("이미 수강신청 되어있습니다.")
}
}
})
});
getList();
function getList() {
$.ajax({
type : 'get',
url : '/stu_enroll_list.json',
data : {
'scode' : scode
},
dataType : 'json',
success : function(data) {
var temp = Handlebars.compile($('#stemp').html());
$('#stbl').html(temp(data));
}
})
}
- 수강취소 버튼을 통해서 학생이 신청한 강좌를 삭제해주겠다.
- read.jsp
<table id="stbl"></table>
<script id="stemp" type="text/x-handlebars-template">
<tr class="title">
<th width=70>강좌번호</th>
<th width=190>강좌이름</th>
<th width=100>수강신청일</th>
<th width=70>담당교수</th>
<th width=70>강의시수</th>
<th width=70>수강인원</th>
<th width=70>수강취소</th>
</tr>
{{#each array}}
<tr class="row">
<td class="lcode">{{lcode}}</td>
<td>{{lname}}</td>
<td>{{edate}}</td>
<td>{{pname}}</td>
<td>{{hours}}</td>
<td>{{persons}}</td>
<td><button>수강취소</button></td>
</tr>
{{/each}}
</script>
<script>
var scode = "${vo.scode}";
// 수강취소
$('#stbl').on('click','.row button',function(){
var lcode =$(this).parent().parent().find('.lcode').html();
if(!confirm(lcode + " 을(를) 삭제하시겠습니까?")) return;
})
- pl/sql
CREATE DEFINER=`haksa`@`localhost` PROCEDURE `del_enroll`(
in i_scode char(8),
in i_lcode char(4)
)
BEGIN
DELETE FROM enrollments where lcode=i_lcode and scode=i_scode;
UPDATE courses set persons=persons-1 where lcode=i_lcode;
END
- 수강 신청 취소를 위한 메서드
- StuDAO.java
// 8. 수강신청 취소를 위한 메서드
public void del_enroll(String lcode, String scode){
try {
String sql = "call del_enroll(?,?)";
CallableStatement cs = Database.CON.prepareCall(sql);
cs.setString(1, scode);
cs.setString(2, lcode);
cs.execute();
} catch (Exception e) {
System.out.println("StuDAO del_enroll : "+e.toString());
}
}
- checkservlet.java
@WebServlet(value={"/del_enroll","/enroll","/stu_enroll_list.json","/check_lcode","/pro_cou_list.json","/pro_stu_list.json"})
public class CheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
CouDAO cdao = new CouDAO();
ProDAO pdao = new ProDAO();
StuDAO sdao = new StuDAO();
switch (request.getServletPath()) {
case "/del_enroll":
sdao.del_enroll(request.getParameter("lcode"), request.getParameter("scode"));
break;
'ICIA 수업일지' 카테고리의 다른 글
2021.09.03 수업일지 (Servlet, Spring, MySQL, Template) (0) | 2021.09.03 |
---|---|
2021.09.02 수업일지(Mysql, Servlet, pl/sql) (0) | 2021.09.02 |
2021.08.31 수업일지(Spring, Servlet, MVC, Mysql, PL/SQL, JAVA) (0) | 2021.08.31 |
2021.08.30 수업일지(Servlet, Spring, Mysql) (0) | 2021.08.30 |
2021.08.27 수업일지(Servlet, Spring, Mysql, Selenium) (0) | 2021.08.27 |