다시 maven project 로 돌아옴
👀 이거 순서대로
coupon 만들어서 database에 insert
database select - coupon list 출력
👀 coupon_wirte.jsp -> (coupon_writeok.do) -> coupon_list.do
1. table 만듬
create table coupon(
cidx int(6) not null auto_increment,
cpname varchar(200) not null,
cprate int(2) not null,
cpuse enum('Y','N') not null default 'N',
cpdate date not null default '0001-01-01',
indate datetime not null default current_timestamp,
primary key(cidx)
);
쿠폰종류 - % , 원
쿠폰사용제한금액
쿠폰제한 카테고리
쿠폰 범위 제한 일자
장바구니 전체사용,각 상품별 사용 여부
=> 원래는 이런거 다 신경써서 만들어야함
2. dao 파일 만듬 : setter, gegger - maven repository에서 library다운 해야함 (coupon_dao.java)
package shop;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class coupon_dao {
int cidx,cprate;
String cpname,cpuse,cpdate,indate;
}
-> window - show view 로 getter,setter 잘 만들어졌는지 확인
3. coupon_write.jsp - 3의 dao의 변수명과 동일하게 맞출것!
<body>
<form id="frm">
쿠폰명 : <input type="text" name="cpname"><br>
쿠폰할인율 : <input type="text" name="cprate"><br>
쿠폰활성화 : <input type="radio" name="cpuse" value="Y" checked>사용함<br>
<input type="radio" name="cpuse" value="N">사용안함<br>
쿠폰만료일 : <input type="date" name="cpdate"><br><br>
<input type="button" value="쿠폰생성" onclick="cpwrite()">
</form>
</body>
<script type="text/javascript">
function cpwrite(){
frm.cprate.value = "30"; //기본 30
frm.method = "POST";
frm.action = "./coupon_writeok.do";
frm.submit();
}
</script>
4. controller 만듬 (shop_main.java) : database 정보, dao 정보를 인자값으로 이관
** 새로운 패키지 만들 시 web.xml의 <context:component-scan base-package= "" /> 여기에 ,로 추가해줘야함!
package shop;
//import생략
@Controller
public class shop_main {
@Autowired
BasicDataSource dbInfo;
PrintWriter pw = null;
@RequestMapping(value="/coupon_writeok.do",method=RequestMethod.POST)
public void coupon_writeok(@ModelAttribute("coupon") coupon_dao dao,
HttpServletResponse res) throws Exception{
//void : view page 쓰겠다!
//HttpServletResponse : printwrite 를 쓰기 위함
res.setContentType("text/html;charset=utf-8");
//Module에서 data를 insert시키며 결과값을 return받아서 처리
coupon_insert ci = new coupon_insert();
//database 정보, dao 정보를 인자값으로 이관
String callback = ci.result(dbInfo,dao);
this.pw = res.getWriter();
if(callback == "Y") {
this.pw.write("<script>"
+ "alert('정상적으로 쿠폰이 등록되었습니다.');"
+ "location.href='./coupon_list.do';"
+ "</script>");
}else {
this.pw.write("<script>"
+ "alert('data 오류로 인하여 쿠폰 등록에 실패했습니다.');"
+ "history.go(-1);"
+ "</script>");
}
this.pw.close();
}
}
=> https://dev-eunse.tistory.com/196 에서 연결한 database 사용
from dbconfig.xml
- coupon_insert.java
: 위 shop_main.java와 연결된 coupon 생성 module : database와 연결 한 뒤 insert만 하는 module
( shop_main.java에서 dbInfo 값을 던짐(인자값) , dao를 던짐
=> coupon_insert.java에서 자료형 BasicDataSource 로 dbInfo를 받음, 자료형 coupon_dao로 dao 받음)
package shop;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.apache.commons.dbcp.BasicDataSource;
// coupon 생성 module - database와 연결
public class coupon_insert {
Connection con = null;
PreparedStatement ps = null;
String rs = null; //결과값을 담을 전역 변수
//db정보 및 setter값을 받아서 insert 실행
public String result(BasicDataSource dbinfo,coupon_dao dao) {
try {
this.con = dbinfo.getConnection();
String sql = "insert into coupon values('0',?,?,?,?,now())";
this.ps = this.con.prepareStatement(sql);
ps.setString(1, dao.getCpname());
ps.setInt(2, dao.getCprate());
ps.setString(3, dao.getCpuse());
ps.setString(4, dao.getCpdate());
this.ps.executeUpdate();
rs = "Y";
this.ps.close();
this.con.close();
}catch(Exception e) {
//System.out.println("db 연결 오류");
rs = "N";
}
return this.rs;
}
}
5. coupon_dao에 1차 배열 return하는 함수 추가
package shop;
import java.util.ArrayList;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class coupon_dao {
int cidx,cprate;
String cpname,cpuse,cpdate,indate;
//select(coupon_list)에서 사용할 1차 클래스배열 return하는 메소드 추가
public ArrayList<Object> lists(){
ArrayList<Object> al = new ArrayList<Object>();
al.add(getCidx());
al.add(getCpname());
al.add(getCprate());
al.add(getCpuse());
al.add(getCpdate());
al.add(getIndate());
//원래 6갠데 4개만 set해줘서 빈값(null)은 삭제해줘야함 - 2가지방법
//al.removeAll(Arrays.asList("",null));
al.removeAll(Collections.singletonList(null));
return al;
}
}
6. shop_main.java 에 coupon_list 파트 추가 : @GetMapping("/coupon_list.do")
: sql -> 값 -> model을 이용해 jstl로 던짐
//요걸 하단에 추가
/*-- 쿠폰 list (M: dao, C : coupon_list, V : jstl) --*/
Connection con = null; //원래는 얘네 다 모듈로 빼는게 좋음 - select에서만 사용함
PreparedStatement ps = null;
ResultSet rs = null;
@GetMapping("/coupon_list.do")
public String coupon_list(Model m) throws Exception{
//Model : jstl로 보내야하니까
try {
this.con = dbInfo.getConnection();
String sql = "select cidx,cpname,cprate,cpuse from coupon order by cidx desc";
this.ps = this.con.prepareStatement(sql);
this.rs = this.ps.executeQuery();
//1차배열 및 setter,getter 가 있는 dao 호출
coupon_dao cd = new coupon_dao();
//2차배열
ArrayList<ArrayList<Object>> all = new ArrayList<ArrayList<Object>>();
//ctn 없이 전체 갯수 확인
int ctn = 0;
while(this.rs.next()) {
ctn = this.rs.getRow();
//getString : column명, column번호(1~)
cd.setCidx(Integer.parseInt(this.rs.getString(1)));
cd.setCpname(this.rs.getString(2));
cd.setCprate(Integer.parseInt(this.rs.getString(3)));
cd.setCpuse(this.rs.getString(4));
all.add(cd.lists());
}
//Model을 이용해 jstl로 값 던짐
m.addAttribute("ctn",ctn); //data 총 갯수
m.addAttribute("all_list",all);
}catch(Exception e) {
System.out.println("DB 연결 오류발생!");
}finally {
try {
this.rs.close();
this.ps.close();
this.con.close();
}catch(Exception e) {
}
}
return null;
}
7. coupon_list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="cp" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠폰 리스트</title>
</head>
<body>
<p>쿠폰 등록 데이터 : ${ctn} 개</p>
<table border="1" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>번호</th>
<th>쿠폰이름</th>
<th>할인율</th>
<th>사용가능여부</th>
<th>수정/삭제</th>
</tr>
</thead>
<tbody>
<cp:forEach var="cpdata" items="${all_list}" varStatus="status">
<tr>
<td>${ctn-status.index}</td>
<td>${cpdata.get(1)}</td>
<td>${cpdata.get(2)}</td>
<td>${cpdata.get(3)}</td>
<td>
<input type="button" value="수정" onclick="coupon_modify('${cpdata.get(0)}')">
<input type="button" value="삭제" onclick="coupon_del('${cpdata.get(0)}')">
</td>
</tr>
</cp:forEach>
</tbody>
</table>
</body>
<script>
function coupon_modify(no){
location.href = './coupon_modify.do?cidx='+no;
}
function coupon_del(no){
if(confirm("해당 쿠폰 삭제시 복구되지 않습니다.")){
location.href = './coupon_del.do';
}
}
</script>
</html>
* varStatus : forEach에 대한 정보값을 설정하는 코드 varStatus="내가넣고싶은이름"
- index : 노드번호 0 시작~
- counter : 1부터 시작 번호~
- last : 마지막 data인지 여부 (true or false로 출력)
- begin : 시작번호 (begin 속성값이 있어야지만 출력)
- end : 종료번호 (end 속성값이 있어야지만 출력)
- step : 증가값 (step 속성값이 있어야지만 출력) ex) step="2" 라면 => +=2 (2씩 증가)
=> 삭제 : coupon_del.do 로
'CLASS > SPRING,JSTL' 카테고리의 다른 글
#4-1 / spring + I/O (0) | 2024.07.11 |
---|---|
#3-2 / coupon delete,update (spring + database) (0) | 2024.07.10 |
#2-2 / spring + database 연결,회원가입 JSTL+spring+Datasource (0) | 2024.07.09 |
#2-1 / spring 규칙2, JSTL 사용법 기초 (0) | 2024.07.09 |
#1-2 / @ , spring 규칙1 (0) | 2024.07.08 |