Java Beans를 이용해
뷰페이지와 기능이 있는 부분을 분리한 성적프로그램이다.
디렉토리 구조는 아래와 같다.
1. 함수
Java Resources -> src -> net.sungjuk
SungjukDAO.java | CRUD를 위한 함수들이 담긴 java |
SungjukDTO.java | CRUD를 위한 필드,객체들이 담긴 java |
1) SungjukDAO.java
성적프로그램에 들어가는 기능, 함수들이 모여있는 java파일
여러 메소드들이 있다.
함수들을 담아놓는 페이지
package net.sungjuk;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import net.utility.DBOpen;
import net.sungjuk.SungjukDTO;
//DAO Data Access Object라는 뜻이다.
public class SungjukDAO {
//1) - 1 성적데이터 삽입
public int insert(String uname, int kor, int eng, int mat, int aver, String addr){
int cnt = 0; //초기값 0, cnt는 행의 갯수를 담을 변수이다.
try {
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Insert SQL문 작성
sql.append(" INSERT INTO SUNGJUK(SNO,UNAME,KOR,ENG,MAT,AVER,ADDR,WDATE) ");
sql.append(" VALUES((SELECT NVL(MAX(SNO),0)+1 FROM SUNGJUK) ");
sql.append(",?,?,?,?,?,?,SYSDATE) ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
//4. Value값 불러오기
pstmt.setString(1, uname);
pstmt.setInt(2, kor);
pstmt.setInt(3, eng);
pstmt.setInt(4, mat);
pstmt.setInt(5, aver);
pstmt.setString(6, addr);
//5. 실행
cnt = pstmt.executeUpdate();
} catch(Exception e){
System.out.println("행추가일때: "+e);
}
//6. 행갯수 리턴
return cnt;
}//insert end
//1) - 2 성적데이터 삽입
public int insert(SungjukDTO dto){
int cnt=0;
try{
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Insert SQL문 작성
sql.append(" INSERT INTO SUNGJUK(SNO,UNAME,KOR,ENG,MAT,AVER,ADDR,WDATE) ");
sql.append(" VALUES((SELECT NVL(MAX(SNO),0)+1 FROM SUNGJUK) ");
sql.append(",?,?,?,?,?,?,SYSDATE) ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
//4. Value값 불러오기
pstmt.setString(1, dto.getUname());
pstmt.setInt(2, dto.getKor());
pstmt.setInt(3, dto.getEng());
pstmt.setInt(4, dto.getMat());
pstmt.setInt(5, dto.getAver());
pstmt.setString(6, dto.getAddr());
//5. 실행
cnt = pstmt.executeUpdate();
}catch(Exception e){
System.out.println("행추가일때: "+e);
}
//6. 행갯수 리턴
return cnt;
}
//2) 성적데이터들의 목록
public ArrayList<SungjukDTO> list(){
//자료형확인 잘하기!
//DB에서 가져온 데이터(이름,성적,평균 등)를 list에 모아서 SungjukDTO자료형으로 ArrayList에 담는다.
ArrayList<SungjukDTO> list = null;
//테이블을 온전히 담을 수 있는 자료형을 만들어야한다.
//자료구조 잘 이해하기
try{
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Select SQL문 작성
sql.append(" SELECT sno, uname, kor, eng, mat, aver, addr, wdate");
sql.append(" FROM sungjuk ");
sql.append(" ORDER BY wdate DESC ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
//4. 결과를 rs에 저장, ResultSet은 결과를 저장하는 하나의 집합
ResultSet rs = pstmt.executeQuery();
//5. rs의 내용을 next로 읽기
if(rs.next()){
//6. list에 ArrayList<SungjukDTO>로 차곡차곡 저장
list = new ArrayList<SungjukDTO>(); //전체 저장하기
do {
SungjukDTO dto = new SungjukDTO(); //한 줄씩 저장하기
dto.setSno(rs.getInt("sno"));
dto.setUname(rs.getString("uname"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setAver(rs.getInt("aver"));
dto.setAddr(rs.getString("addr"));
dto.setWdate(rs.getString("wdate"));
list.add(dto);
} while (rs.next());
} else{
list = null;
}// if end
}catch(Exception e){
System.out.println("목록 불러오기 실패!" + e );
}
return list;
}//list() end
//3) 성적데이터의 조회
public SungjukDTO read(int sno){ //매개변수명은 테이블 컬럼명과 일치시키는게 편하다.
SungjukDTO dto = null;
try {
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Select SQL문 작성
sql.append(" SELECT sno,uname,kor,eng,mat,aver,addr,wdate ");
sql.append(" FROM sungjuk ");
sql.append(" WHERE sno=? ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, sno); // ?순서와 ?에 들어갈 자료형 주의
//4. 결과를 rs에 저장
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
do {
dto = new SungjukDTO(); //한 줄씩 저장하기
dto.setSno(rs.getInt("sno"));
dto.setUname(rs.getString("uname"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setAver(rs.getInt("aver"));
dto.setAddr(rs.getString("addr"));
dto.setWdate(rs.getString("wdate"));
} while (rs.next());
} else{
dto = null;
}// if end
} catch(Exception e) {
System.out.println("상세보기실패:" +e);
}
return dto;
}
//4) 성적데이터의 삭제
public int delete(int sno){ //하나의 데이터를 삭제하기 위해 sno를 매개변수로 받아온다.
int cnt = 0;
try {
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Delete SQL문 작성
sql.append(" DELETE FROM sungjuk ");
sql.append(" WHERE sno=? ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, sno); // ?순서와 ?에 들어갈 자료형 주의
//4. 실행된 행갯수 저장
cnt = pstmt.executeUpdate();
} catch(Exception e) {
System.out.println("성적삭제실패!" +e);
}
return cnt;
}
//5) 성적데이터의 수정
public int update(SungjukDTO dto){
int cnt = 0;
try{
//1. DB연결: DBOpen.java와 연결한다.
Connection con=DBOpen.getConnetion();
StringBuilder sql = new StringBuilder();
//2. Update SQL문 작성
sql.append(" UPDATE SUNGJUK ");
sql.append(" SET UNAME=?, KOR=?, ENG=?, MAT=?, AVER=?, ADDR=? ");
sql.append(" WHERE SNO =? ");
//3. SQL문 변환
PreparedStatement pstmt = con.prepareStatement(sql.toString());
//4. dto로 데이터 받아오기
pstmt.setString(1, dto.getUname());
pstmt.setInt(2, dto.getKor());
pstmt.setInt(3, dto.getEng());
pstmt.setInt(4, dto.getMat());
pstmt.setInt(5, dto.getAver());
pstmt.setString(6, dto.getAddr());
pstmt.setInt(7, dto.getSno());
//5. 실행횟수를 cnt에 담기
cnt = pstmt.executeUpdate();
} catch(Exception e){
System.out.println("문제있음: "+e);
}
return cnt;
}
}
2) SungjukDTO.java
성적프로그램에 들어가는 필드들을 모아둔 java파일
package net.sungjuk;
import java.sql.Connection;
import java.sql.PreparedStatement;
import net.utility.DBOpen;
public class SungjukDTO {
//DAO Data Transfer Object라는 뜻이다. 데이터 전송 객체이다.
//Value Object
//SungjukVO, SungjukDataBean
//1) 테이블의 칼럼과 1:1 매칭되는 필드를 Private 속성으로 접근제어 선언하고
//2) getter, setter함수를 작성한다.
//3) Source -> Generate Getters and Setters로 자동추가 alt+shift+s+r
//1) sungjuk 테이블의 칼럼을 기준으로 field를 선언한다.
private int sno; //Primary key인 sno
//함수를 이용해 private 접근.
private String uname;
private int kor;
private int eng;
private int mat;
private int aver;
private String addr;
private String wdate;
public SungjukDTO(){} //생성자함수
//2) 각 field에 접근할 수 있는 getter, setter 함수
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getAver() {
return aver;
}
public void setAver(int aver) {
this.aver = aver;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
//개발자들이 에러 확인용으로 주로 사용
//Source -> Generate toString()...
@Override
public String toString() {
return "SungjukDTO [sno="+ sno +", uname="+ uname +" ,kor=" + kor +
",eng="+ eng +", mat"+ mat +", addr="+ addr +", wdate="+ wdate +"]";
}
}
2. 뷰페이지
성적프로그램의 CRUD 페이지들이다.
sungjukForm.jsp | 성적을 입력할 수 있는 폼양식이 있는 페이지 |
sungjukIns2.jsp | 성적데이터를 insert하는 jsp파일, dto객체를 이용해 전달값을 dto 객체에 담는 역할 |
sungjukList.jsp | 성적데이터들의 목록을 보여주는 페이지 |
sungjukRead.jsp | 성적데이터들을 불러와 한개의 성적데이터의 상세내역을 보여주는 페이지 |
sungjukDelete.jsp | 성적데이터들을 불러와 한개의 성적데이터를 삭제하는 페이지 |
sungjukUpdate.jsp | 성적데이터들을 불러와 한개의 성적데이터를 수정하기 위한 폼 페이지 |
sungjukUpdateProc.jsp | 성적데이터들을 불러와 한개의 성적데이터를 수정하는 기능이 있는 페이지 |
1) sungjukForm.jsp
성적을 입력할 수 있는 폼양식이다.
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>성적 Bean 프로그램</title>
</head>
<body>
<h1>성적 입력 폼</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<form method="post" action="sungjukIns2.jsp">
<table>
<tr>
<th>번호</th>
<td>
<input type="hidden" name="sno">
</td>
</tr>
<tr>
<th>이름</th>
<td>
<input type="text" name="uname" maxlength="20" required autofocus>
</td>
</tr>
<tr>
<th>국어</th>
<td>
<input type="number" name="kor" size="5" min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>영어</th>
<td>
<input type="number" name="eng" size="5" min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>수학</th>
<td>
<input type="number" name="mat" size="5" min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>주소</th>
<td>
<select name="addr">
<option value="Seoul">서울</option>
<option value="Jeju">제주</option>
<option value="Busan">부산</option>
<option value="Suwon">수원</option>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="center" class="bottom">
<input type="submit" value="전송" class="submit">
<input type="reset" value="취소" class="reset">
</tr>
</table>
</form>
</body>
</html>
2) sungjukIns2.jsp
성적데이터를 insert하기 위한 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<title>성적 Bean Insert</title>
</head>
<body>
<h1>성적 결과</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<%
request.setCharacterEncoding("UTF-8");
String uname = request.getParameter("uname").trim();
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int mat = Integer.parseInt(request.getParameter("mat"));
String addr = request.getParameter("addr").trim();
//평균구하기
int aver=(kor+eng+mat)/3;
//1) dto 객체를 사용하기 전
//int cnt = dao.insert(uname, kor, eng, mat, aver, addr); //java class로 만든 메소드 가져오기.
//2) dto 객체를 사용한 경우
//-> 전달값을 모두 dto객체에 담기
dto.setUname(uname);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
dto.setAver(aver);
dto.setAddr(addr);
int cnt = dao.insert(dto);
if(cnt == 0){
out.println("<p>성적입력이 실패했습니다.</p>");
out.println("<p><a href='javascript:history.back()'>다시시도</a></p>");
}else {
out.println("<script>");
out.println("alert('성적이 입력되었습니다.');");
out.println("location.href='sungjukList.jsp';");
out.println("</script>");
}
%>
</body>
</html>
3) sungjukList.jsp
성적데이터들의 목록이 보여지는 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<style>
a{color: inherit; text-decoration:none;}
tr{cursor:pointer; opacity:.8;}
tr:hover {opacity: 1; }
.modify:hover {color: #0050ff;}
.delete:hover {color: red;}
tr:nth-child(even){background: #eee;}
</style>
<title>성적 목록</title>
</head>
<body>
<h1>성적목록</h1>
<div class = "wrap">
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<table border="1">
<tr>
<th>번호</th>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>등록일</th>
</tr>
<%
ArrayList<SungjukDTO> list = dao.list();
if(list == null){
out.println("<tr>");
out.println("<td colspan='5'>글없음!</td>");
out.println("</tr>");
}else{
for(int i=0; i<list.size(); i++){
dto = list.get(i);
%>
<tr>
<td><%=dto.getSno()%></td>
<td><a href="sungjukRead.jsp?sno=<%=dto.getSno()%>"><%=dto.getUname()%></a></td>
<td><%=dto.getKor()%></td>
<td><%=dto.getEng()%></td>
<td><%=dto.getMat()%></td>
<td><%=dto.getWdate()%></td>
</tr>
<%
}//for end
}//if end
%>
</table>
</div>
</body>
</html>
4) sungjukRead.jsp
한 개의 데이터의 상세내역을 보여주는 페이지
페이지 url은 기본키가 될 수 있는 sno(번호)로 생성이 된다.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>sungjukRead.jsp</title>
</head>
<body>
<h1>성적 상세보기</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<%
int sno = Integer.parseInt(request.getParameter("sno"));
dto = dao.read(sno); //read 함수 불러오기. 기본키인 sno(번호)로 불러오기.
if(dto==null){
out.println("해당 성적이 없습니다.");
}else{
%>
<table>
<tr>
<th>번호</th>
<td><%=dto.getSno()%></td>
</tr>
<tr>
<th>이름</th>
<td><%=dto.getUname()%></td>
</tr>
<tr>
<th>국어</th>
<td><%=dto.getKor()%></td>
</tr>
<tr>
<th>영어</th>
<td><%=dto.getEng()%></td>
</tr>
<tr>
<th>수학</th>
<td><%=dto.getMat()%></td>
</tr>
<tr>
<th>평균</th>
<td><%=dto.getAver()%></td>
</tr>
<tr>
<th>주소</th>
<td><%=dto.getAddr()%>
<%
//주소를 한글로 출력하기
switch (dto.getAddr()){
case "Seoul": out.print(", 서울시"); break;
case "Busan": out.print(", 부산시"); break;
case "Jeju": out.print(", 제주시"); break;
case "Suwon": out.print(", 수원시"); break;
}
%>
</td>
</tr>
<tr>
<th>수정/삭제</th>
<td>
<a href="sungjukUpdate.jsp?sno=<%=dto.getSno()%>" class="modify">[수정]</a>
<a href="sungjukDelete.jsp?sno=<%=dto.getSno()%>" class="delete">[삭제]</a>
</td>
</tr>
</table>
<%
}
%>
</body>
</html>
5) sungjukDelete.jsp
한 개의 데이터를 삭제하는 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<title>성적 Bean Delete</title>
</head>
<body>
<h1>성적삭제</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<%
int sno = Integer.parseInt(request.getParameter("sno"));
int cnt = dao.delete(sno);
if(cnt == 0){
out.println("<p>성적입력이 실패했습니다.</p>");
out.println("<p><a href='javascript:history.back()'>다시시도</a></p>");
}else {
out.println("<script>");
out.println("alert('성적이 삭제되었습니다.');");
out.println("location.href='sungjukList.jsp';");
out.println("</script>");
}
%>
</body>
</html>
6) sungjukUpdate.jsp
한 개의 성적데이터를 수정하기 위한 폼페이지 -> 폼에 이 전에 기입했었던 value값이 불러와진 상태이다.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>sungjukRead.jsp</title>
</head>
<body>
<h1>성적 상세보기</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<%
int sno = Integer.parseInt(request.getParameter("sno"));
dto = dao.read(sno);
if(dto==null){
out.println("해당 성적이 없습니다.");
} else {
%>
<form method="post" action="sungjukUpdateProc.jsp">
<table>
<tr>
<th>번호</th>
<td>
<input type="hidden" name="sno" value=<%=dto.getSno()%>>
</td>
</tr>
<tr>
<th>이름</th>
<td>
<input type="text" name="uname" maxlength="20" value=<%=dto.getUname()%> required autofocus>
</td>
</tr>
<tr>
<th>국어</th>
<td>
<input type="number" name="kor" size="5" value=<%=dto.getKor()%> min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>영어</th>
<td>
<input type="number" name="eng" size="5" value=<%=dto.getEng()%> min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>수학</th>
<td>
<input type="number" name="mat" size="5" value=<%=dto.getMat()%> min="0" max="100" placeholder="점수를 입력하세요">
</td>
</tr>
<tr>
<th>주소</th>
<td>
<% String addr = dto.getAddr(); %>
<select name="addr">
<option value="Seoul" <%if(addr.equals("Seoul")){out.print("selected");} %>>서울</option>
<option value="Jeju" <%if(addr.equals("Jeju")){out.print("selected");} %>>제주</option>
<option value="Busan" <%if(addr.equals("Busan")){out.print("selected");} %>>부산</option>
<option value="Suwon" <%if(addr.equals("Suwon")){out.print("selected");} %>>수원</option>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="center" class="bottom">
<input type="submit" value="수정" class="submit">
<input type="reset" value="취소" class="reset">
</tr>
</table>
</form>
<%
}
%>
</body>
</html>
7) sungjukUpdateProc.jsp
성적을 수정하기 위한 기능을 불러오는 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.sungjuk.*" %>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>Insert title here</title>
</head>
<body>
<h1>성적 입력 폼</h1>
<div class = "btn" style="margin:20px;">
<input type="button" value="성적목록" onClick="location.href='sungjukList.jsp'">
<input type="button" value="성적작성" onClick="location.href='sungjukForm.jsp'">
</div>
<%
int sno = Integer.parseInt(request.getParameter("sno"));
String uname = request.getParameter("uname").trim();
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int mat = Integer.parseInt(request.getParameter("mat"));
String addr = request.getParameter("addr").trim();
//1) 평균구하기
int aver=(kor+eng+mat)/3;
//2) 전달값을 모두 dto객체에 담기
dto.setUname(uname);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
dto.setAver(aver);
dto.setAddr(addr);
dto.setSno(sno);
//3) 함수 실행
int cnt = dao.update(dto);
if(cnt == 0){
out.println("<p>성적수정이 실패했습니다.</p>");
out.println("<p><a href='javascript:history.back()'>다시시도</a></p>");
}else {
out.println("<script>");
out.println("alert('성적수정이 성공하였습니다.');");
out.println("location.href='sungjukList.jsp';");
out.println("</script>");
}
%>
</body>
</html>
'Backend' 카테고리의 다른 글
09월 04일 수 | JSP 09 - JSP 미니 프로젝트 Ⅰ- 글쓰기 (DB연결) (0) | 2019.09.04 |
---|---|
09월 03일 화 | JSP 08 - JSP 미니 프로젝트 Ⅰ- 환경설정 (0) | 2019.09.03 |
08월 28일 수 | JSP 06 - JSP Java bean (0) | 2019.08.28 |
08월 27일 화 | JSP 05 - JSP CRUD 게시판 삭제, 수정 (0) | 2019.08.27 |
08월 26일 월 | JSP 04 - JSP CRUD 게시판 생성, 목록, 상세페이지 (1) | 2019.08.26 |
댓글