jsp MVC 상품선택 [day38]

stan·2023년 6월 28일
0

jsp

목록 보기
6/15

ProductDAO

package model;

import java.util.ArrayList;

public class ProductDAO {
	//멤버변수
	private ArrayList<ProductVO> datas;
	public ArrayList<ProductVO> getDatas() {
		return datas;
	}
	//생성자[오버로딩]
	public void setDatas(ArrayList<ProductVO> datas) {
		this.datas = datas;
	}

	public ProductDAO() { //상품 직접 추가; ProductVO에서 오버로딩된 생성자 사용 
		datas=new ArrayList<ProductVO>();
		datas.add(new ProductVO(101,"세제",23000));
		datas.add(new ProductVO(102,"헛개수",1500));
		datas.add(new ProductVO(103,"우유",1100));
		datas.add(new ProductVO(104,"박카스",900));
		datas.add(new ProductVO(105,"닭가슴살",11700));
	}
	
	public ArrayList<ProductVO> selectAll(ProductVO pVO){
		return datas;
	}
	public ProductVO selectOne(ProductVO pVO) {
		for(ProductVO v:datas) {
			if(pVO.getNum()==v.getNum()) {
				return v;
			}
		}
		return null;
	}
}

ProductVO

package model;

public class ProductVO {
	private int num;
	private String name;
	private int price;
	
	//생성자 오버로딩중
	public ProductVO() {//기본 생성자를 웹에서 디폴트로 사용하고 있기 때문에 반드시 추가해줘야 함  
		this(0,null,0);
	}
	
	public ProductVO(int num,String name,int price) {//DAO에서 사용중; datas.add(new ProductVO(101,"세제",23000));
		this.num=num;
		this.name=name;
		this.price=price;
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return name+" : "+price+"원";
	}	
}

A 로그인,로그아웃,상품선택

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList,model.ProductVO" %>
<jsp:useBean id="pDAO" class="model.ProductDAO" />

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%--
로그인 로그아웃과 상품선택이 한 페이지에 있을 예정
보통 사이트가 이렇게 되어 있기 때문
 
 --%>
<body> <!-- id="header" 시맨틱테그: 문서의 구조와 의미를 더 명확하게 전달 -->
<div id="header" > <!-- 영역1: 로그인&로그아웃 란 -->
	<%
	//로그인을 안했다면 로그인 버튼을 띄울것임
	//내가 만약 로그인을 했다면 로그아웃 버튼을
	if( session.getAttribute("name") == null ){ //혹시 로그인 안했어? 그럼 로그인 버튼
	//로그인이라는걸 하려면 input아이디, input비밀번호, input버튼 이렇게 넣어야 함
	//input들을 감싸줄 form이 필요함
	//로그인이라는걸 하게 되면 session에 mid값을 저장 하게 됨
	// 로그인 안했어? 라는 건session에 mid값이 저장이 안되어있어?? 와 같은 뜻임
			
	%>
		<form action="d.jsp" method="post">  <!-- 이곳에 아이디 쓰고 로그인 버튼 누르면 진행 할 수 있게 -->
			<%--form 태그에 메서드를 작성 하지 않았기 때문에 get 방식 
									메서드 post는 post--%>
			아이디 <input type="text" name="mid"> 
			비밀번호 <input type="password" name="mpw"> <br>
			<input type="submit" value="로그인">
		</form>
	<% 
	}
	else{ //로그인 했어? 그럼 로그아웃 버튼 
			//로그아웃을 할때 필요한 데이터가 없음 : 보낼 데이터가 없기 때문에 <a 태그로 작업
			//a태그는 전달 방식이 default로 get 입니다
	%>
			<!-- ㅁㅁㅁ님: ㅁㅁㅁ이 session.getAttribute("mid")-->
		<%=session.getAttribute("name")%>, 안녕하세요! :D | <a href="e.jsp">로그아웃</a> 
	<%
	}
	%>
</div>

<hr>
		<!-- 시맨틱태그 content -->
<div id="content"> <!-- 영역2: 상품목록을 출력하고 선택 하는 공간 -->
	<!--  상품목록에서 상품을 하나 고를 예정이니까 -->
	<form action="b.jsp"> <!-- 추가하는건 b.jsp에서 진행 -->
		상품선택 <select name="num"> <!-- 넘겨져서 오는 값은 product인데 pk니까 num으로 세팅 -->
			<%	//<option을 DB에서 꺼내 볼거임. DAO의 datas한테서 부터 꺼내서 볼거라는 것
				//ProductDAO pDAO = new ProductDAO();를 써줘야 하는데 useBean이 대신 해줌 ㅎㅎ 
				ArrayList<ProductVO> datas=pDAO.selectAll(null);//productDAO한테서 불러옴
				//null값으로 줘도 상관이 없는데 DAO의 selectAll에서 기능이 바로 return datas; 해주기 때문에
				//인자인 pVO에 아무거나 줘도 상관 없음. 원래는 모델 selectAll메서드에 기능이 있고 인자가 있으면
				// 발할라의대천사 : selectAll 에서 조건이 하나도 없는 상태여서 뭘 넣어도 return datas; 해주기 때문에 null 넣어도 괜찮은거죠!
				//selectAll(pVO) 이런식으로 줘야함 
				for(ProductVO v:datas){ //만약에 datas가 없으면 NullPointerException에러 뜸
					out.println("<option value='"+v.getNum()+"'>"+v+"</option>"); //이거 누르면 PK보내야 한다고 value=v.getNum()
									//사용자가 선택한 v.getNum(가짜값)을 value(진짜값)로 넘겨줌 그래서 num이 value로 등록된다
				}
			%>
		</select>
		<input type="submit" value="장바구니에 추가하기"><!-- 상품선택 -->
	</form>
</div>

<hr>

<!-- 영역3: 결제 하는 란-->
<a href="c.jsp">결제하기</a> <!-- 마지막 a태그를 누르면 결제화면으로 이동 할 예정 -->


</body>
</html>

B 장바구니에 추가/저장

<!-- 장바구니에 추가하는 로직 -->
<!-- 추가가 완료되면 '추가하였습니다'멘트 뜨고 다시 돌아갈거에용 -->
<!-- 여기도 역시 서비스 되는 화면이 없음 -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.ProductVO,java.util.ArrayList" %>
<jsp:useBean id="pDAO" class="model.ProductDAO" />
<!-- ProductDAO pDAO = new ProductDAO() 객체화 인스턴스화 -->
<jsp:useBean id="pVO" class="model.ProductVO" />
<!-- ProductVO pVO = new ProductVO() -->
<jsp:setProperty property="*" name="pVO" /> <!-- //value가 num으로 넘어옴 그래서 pVO그냥 인자로 줄 수 있음 -->
						  <!-- 자동으로 세팅 -->
<%--사용자가 넘겨주는 태그의 이름을 확인해야 한다 ==>> 그 이름과 같은 VO의 멤버변수가 세팅되기 때문에
==> 근대 뭐로 세팅이 되는가?
==> 이번에는 option 태그에서 값을 넘겨받는데
==> 스크립트는 객체를 넘길수 없습니다. (무조건 string)을 넘겨줌

<%
				ArrayList<ProductVO> datas=pDAO.selectAll(null);
				for(ProductVO v:datas){
					out.println("<option value='"+v.getNum()+"'>"+v+"</option>");
									//사용자가 선택한 v.getNum(가짜값)을 value(진짜값)로 넘겨줌 그래서 num이 value로 등록된다
				}
			%>
			
			 
==> 그래서 다른값을 넘겨줄건데 : v는 객체기 때문에 따로 num을 빼줄 필요가 있다
==> value에다가 num을 넣어서 보낸다. 

VO에 name에 적혀있는것과 같은것이 있어야 한다 

 --%>
<%--    pVO의 모든 setter를 호출하겠다.
   setter에 넣을 값을 request.getParameter()에서 자동으로 매핑해주겠다! 형변환까지 서비스~ --%>
<%	
	//========================================
	/*
	//상품을 받아와서,
	String product = request.getParameter("product"); output이 String이에요 그래서 overriding한거가 와요
	//name+" : " + price + "원" 이게 a.jsp에 있는 v에서 와요 
	
	//그걸 장바구니에 추가하고, 에 해당하는 '그걸' == ProductVO 객체 말하는거야; 그니까 String으로 오는애를 객체로 바꿔야되
	<! --  'ProductVO 객체==그걸' 이라는건 : 
	스트링으로 오는 애를 객체로 바꿔야 되 
	JAVA MVC프로젝트에서 했던거에용~~~
		== selectOne(PK)을 씁니다 (앞으로도 계속, 고정이에요 언어가바뀌어도 selectOne 써요) --!>
			PK를 뷰에서 받아오는게 유리한거에용 ==> 뷰님들아(V) PK로 주샘!이라고 이야기 할거임
	
			
			
	그르면 int num = Integer.parseInt(request.getParameter("num")); <<num이구용 
		헷갈리니까 이름 num으로 맞춤
		그리고 인제 String이 아니라 int이니까 parseInt. 그럼 인제 오는게 PK가 101같은 숫자가 와요
		그다음

			
		ProductVO pVO = new ProductVO();
		pVO.setNum(num);
		
		이 data는 product data일 거고 
		ProductVO data = pDAO.selectOne( pVO ); pVO객체를 줘서 
							
	
	//혹시 장바구니가 없으면 ? 만들어서 넣으면 됨
			
	//사용자한테 ㅁㅁ가 장바구니에 추가 되었습니다! 띄워주고
	//다시 메인으로 이동 
	*/
	//========================================

	//원래는 setPK() 이런거 해서 PK값을 객체에 넘겨줘야한다. 
	//jsp의 setProperty가 모든걸 다 설정 해 주니깡 
	//자동으로 setter를 사용한다. 
	
	//[재활용한거]
	/*
	Product pVO = pDAO.selectOne(pVO)
	*/
	
	//[재활용안한거]
			//data를 새로 만들어줌 
			//장바구니에 넣을수 있는 data
	ProductVO data = pDAO.selectOne( pVO ); //상품값 가져오기 //Product 객체 1개임
					//value가 num으로 setProperty의 pVO로 넘어옴 그래서 pVO그냥 인자로 줄 수 있음
	//pVO를 쓰려면객체가 필요함==> 객체화
			//근데 어디있는줄 모르니까 import=
	
	//int num = Integer.parseInt(request.getParameter("num")); // 강제 형변환을 한 다음에 
	//ProductVO pVO = new ProductVO(PK,"",0) //여기 넣어주고 이거를
	//ProductVO data = pDAO.selectOne( pVO ); 에 넣었음// 인제 다 생략 

	
	//new가 없으니까 여기서 장바구니를 만드는건 아님
	ArrayList<ProductVO> cart=(ArrayList<ProductVO>)session.getAttribute("cart");//"cart"는 변수명 같은건데 get하면 객체정보가 딸려옴
													//세션에서 가져와야함 반환 타입이 Object라 다운캐스팅을 해야함
													
	if(cart == null){//만약장바구니가 비어있다면
		//장바구니를 여기서 만드는거임
		cart=new ArrayList<ProductVO>(); //장바구니 객체를 새로 만들어서 대입해 
		session.setAttribute("cart",cart); //그리고 session에 'cart'라는 이름으로 ProductVO타입의 어레이리스트 객체를 저장해
				//set할때는 "변수명",그리고 객체에 대한정보  ==>> session에 저장
	}
	
	cart.add(data); //그걸 장바구니(카트)에 추가 
%>
<script>
		        //상품이름
	alert('<%=data.getName()%>이(가) 장바구니에 추가되었습니다! :D');
	location.href='a.jsp'; //a.jsp로 이동
</script>

C 결제페이지


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.ProductVO,java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결제 페이지</title>
</head>
<body>


<%
	int total=0;//총합을 담을 공간
%>
<h1><%=session.getAttribute("name")%>님이 구매한 상품들입니다.</h1>
<hr>
<ol>
<%
	ArrayList<ProductVO> cart=(ArrayList<ProductVO>)session.getAttribute("cart");
	//cart가 null이면 에러니까 if문 추가 
	//총합출력
	for(ProductVO v:cart){//반복문 돌려서 목록 출력
		out.println("<li>"+v+"</li>"); //내부객체를 써서 리스트에 넣어준다 li는 ol이랑 세트임; 그래서 ol안에 li가 들어있어야함
		total+=v.getPrice(); //상품가격(v의 금액)을 총합에 더해줌 
	}
//	out.println("<li>총합은 : "+total+"원 입니다</li>"); //ol내부에 있으면 괜찮음
%>
</ol>
<hr><!-- 총 가격이 나올 뷰; 시맨틱 태그 생각 하면 좋음 -->
<h2> 총 금액은 <%=total%>원입니다.</h2>
<hr>
<a href="a.jsp">메인으로 돌아가기</a>

</body>
</html>

D 로그인

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- D페이지 : 로그인 -->
    <%-- 로그인 하고 다시 메인 화면으로 올 예정이기 때문에 서비스될 화면이 없음 
    										 내가 보여줘야 되는 화면이 없음
    
    --%>
<%

	String mid=request.getParameter("mid"); //사용자가 넘겨준 아이디 값을 가져온다. 
											//내가 아까 어떤 이름으로 보냈더라? mid로 보냈었음
											// 로그인 하는 곳 form안의 input에 name이 mid로 적혀있는지 확인 
											//form action에 name = mid로 보냈었음
											
	session.setAttribute("mid", mid); //세션에 "mid"라는 이름으로 id를 저장 하는중
										//이 mid값 request.getParameter로 받아올 수 있음
										//그리고 세션에 mid를 세팅(저장)
	
//session.setAttribute("mid",String mid=request.getParameter("mid")); 이렇게 써도 됨 
	response.sendRedirect("a.jsp");//데이터 유지 안해줘도 되니까 Redirect를 씀 

//아이디를 가져가야 하는데 그걸 session에 저장 했기 때문에 별도로 가져가는건 없음
//가져가야 되는 데이터는 있지만 session에 이미 저장 했기 때문에 신경써야 될 데이터는 없음
%>

E 로그아웃

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//<로그아웃>

	//session.setAttribute("mid", null); //mid를 비워줘
	//session.invalidate(); // 전부 지우기 removeAll임; mpw나 member나 다른것들 다 저장 했었어도 같이 드랍됨
	session.removeAttribute("mid"); //세션지우기; 보통은 이걸로 씀
	
	session.removeAttribute("cart"); //장바구니 지우기
	
	response.sendRedirect("a.jsp"); //다시 a.jsp로 넘어가기; 다시 돌아감
	//forward안씀 : 유지할 데이터 없음; 무거움 데이터 유지 하는게 
%>


[a.jsp]
div id =header
1.로그인과 관련된 기능
2.( session.getAttribute("mid") == null )
→ 로그인이 안되어있다면
<form action="d.jsp">
1.d.jsp로 값을 넘겨주는 폼
2.아이디를 입력받는다.
3.로그인 기능이다.

로그인이 되어있다면
000님 안녕하세요 | 로그아웃(하이퍼링크) → e.jsp

id VS class
아이디는 유일한 값
클래스는 여러개 겹치는거
<hr>
<div id="content">
<form action="b.jsp"> → b로 넘어가는 폼

selectAll :여러개 read  → 배열 리스트에 담아서
for each를 사용해서 출력
<option>
넘어가는것은 실제 value값인데 PK를 담아서 넘김
==================================================
d.jsp

스크립트는 string 값으로 값을 넘겨준다
request.getParameter → 사용자가 넘겨준 아이디를 가져온다.

========================================
장바구니 추가 누르면 → 현재 선택된 option값을 b.jsp

<jsp:useBean id="pDAO" class="test.ProductDAO" />
<jsp:useBean id="pVO" class="test.ProductVO" />

==================================
<jsp:setProperty property="*" name="pVO" />
자동으로 setter를 사용한다.
사용자로부터 넘어온 값을 세팅해주는 역할
사용자가 넘기는 폼의 name을 보고 세팅을 해준다
VO에 name에 적혀있는 것과 같은 것이 있으면
알아서 세팅해준다.
value에 들어있는 값을 넘겨줌 (이놈이 진짜)
사용자가 넘겨주는 태그의 이름을 확인해야한다.
→그 이름과 같은 VO의 멤버변수가 세팅되기 때문에
→근데 뭐로 세팅이되는가?
→이번에는 option 태그에서 값을 넘겨받는데
→스크립트는 객체를 넘길수 없습니다.(스트링)
→v는 객체이기 때문에 따로 num을 빼줄 필요가있다
→value에다가 num을 넣어서 보낸다.
===========================
e.jsp
세션에 저장되어있는 아이디 값을 가져온다
profile
이진 입니다

0개의 댓글