본문 바로가기
CLASS/SPRING,JSTL

#3-1 / coupon insert,select (spring + database)

by hingu 2024. 7. 10.

다시 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="내가넣고싶은이름"

  1.  index : 노드번호 0 시작~
  2. counter : 1부터 시작 번호~
  3. last : 마지막 data인지 여부 (true or false로 출력)
  4. begin : 시작번호 (begin 속성값이 있어야지만 출력)
  5. end : 종료번호 (end 속성값이 있어야지만 출력)
  6. step : 증가값 (step 속성값이 있어야지만 출력)  ex) step="2" 라면 => +=2  (2씩 증가)

 

 

coupon_write.jsp
coupon_list.do

 

 

=> 삭제 : coupon_del.do 로