본문 바로가기

Java 웹 개발

21.10.14 - 웹 개발 입문 44일차

Q. 상품 관리 홈페이지 만들기

(참고)  
최초 페이지를 index.html로 만드는 이유
= 서버 설정에 의해서 주소를 생략할 수 있다
= 서버 설정 중 web.xml(운영설정) 파일에 welcome file list 라는 속성으로 지정되어 있다.

ul(unorder list) 태그 : 같은 항목들을 나열할 때 사용하는 list 태그
ol(order list) 태그 : ul과 동일하지만 순서가 부여되는 list 태그
li(list item) 태그 : ul 안에서 항목을 정의할 때 사용하는 태그 

 

 

(1) 메인 페이지 구현

1-1 메인 페이지 index.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 관리 시스템</h1>

	<h5>
		<a href="/web08/product/insert.html">상품 등록</a>
	</h5>
	<h5>
		<a href="/web08/product/search.txt">상품 조회</a>
	</h5>

	<form action="/web08/product/search.txt">
		<fieldset>

			<legend>상품 검색</legend>

			<select name="column">
				<option value="name">이름</option>
				<option value="type">구분</option>
			</select> <input type="search" name="keyword" required> <input
				type="submit" value="검색">

		</fieldset>
	</form>
	<h5>
		<a href="#">상품 상세보기</a>
	</h5>
	<h5>
		<a href="/web08/product/update.html">상품 수정</a>
	</h5>
	<form action="/web08/product/delete.txt">
		<fieldset>
			<legend>상품 삭제</legend>
			<input type="number" name="no" required placeholder="상품 번호">
			<input type="submit" value="삭제">
		</fieldset>
	</form>

	<ol>
		<li><a href="./product/insert.html">상품 등록</a></li>
		<li><a href="./product/search.txt">상품 조회</a></li>
		<li>
			<form action="./product/search.txt">
				<fieldset>
					<legend>상품 검색</legend>
					<select name="column">
						<option value="name">이름</option>
						<option value="type">구분</option>
					</select> <input type="search" name="keyword" required> <input
						type="submit" value="검색">
				</fieldset>
			</form>
		</li>
		<form action="/web08/product/detail.txt">
			<fieldset>
				<li>
					<form action="./product/detail.txt">
						<fieldset>
							<legend>상품 상세보기</legend>
							<input type="number" name="no" required placeholder="상품번호">
							<input type="submit" value="조회">
						</fieldset>
					</form>
				</li> <input type="number" name="no" required placeholder="상품번호">
				<input type="submit" value="조회">
			</fieldset>
		</form>

		<li><a href="./product/update.html">상품 수정</a></li>
		<li>
			<form action="./product/delete.txt">
				<fieldset>
					<legend>상품 삭제</legend>
					<input type="number" name="no" required placeholder="상품 번호">
					<input type="submit" value="삭제">
				</fieldset>
			</form>
		</li>
	</ol>

</body>
</html>

 

1-2 확인

(2) 삭제 기능 구현

2-1 삭제 번호 입력 메인페이지 index.html에 만들기

	<form action="/web08/product/delete.txt">
		<fieldset>
			<legend>상품 삭제</legend>
			<input type="number" name="no" required placeholder="상품 번호">
			<input type="submit" value="삭제">
		</fieldset>
	</form>

 

2-2 삭제 처리 delete.txt 만들기

package web08.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import web08.beans.ProductDao;

@WebServlet(urlPatterns = "/product/delete.txt")
public class ProductDeleteServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : 상품 번호 - no(int)
			int no = Integer.parseInt(req.getParameter("no"));

			//처리 : ProductDao
			ProductDao productDao = new ProductDao();
			boolean success = productDao.delete(no);

			//출력 : 성공 실패에 따라 각각 redirect 처리
			if(success) {
				resp.sendRedirect("delete_success.html");
				//resp.sendRedirect("/web08/product/delete_success.html");
			}
			else {
				resp.sendRedirect("delete_fail.html");
				//resp.sendRedirect("/web08/product/delete_fail.html");
			}
		}
		catch(Exception e) {
			e.printStackTrace();
			resp.getWriter().println("error");
		}
	}
}

 

2-3 삭제 성공 delete_success.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 삭제 완료</h1>

	<h5><a href="../index.html">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="../">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="/web08/index.html">메인페이지로 이동(절대경로)</a></h5>
	<h5><a href="/web08/">메인페이지로 이동(절대경로)</a></h5>
</body>
</html>

 

2-4 삭제 실패 delete_fail.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 삭제 실패</h1>
	<h3>(존재하지 않는 상품번호)</h3>

	<h5><a href="../index.html">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="../">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="/web08/index.html">메인페이지로 이동(절대경로)</a></h5>
	<h5><a href="/web08/">메인페이지로 이동(절대경로)</a></h5>
</body>
</html>

 

2-5 확인

 

 

(3) 등록 기능 구현

3-1 등록 정보 입력 insert.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>

	<h1>상품 등록 페이지</h1>

<!-- 	<form action="/web08/product/insert.txt"> -->
	<form action="insert.txt">

		상품이름 : <input type="text" name="name" required>

		<br><br>

		상품분류 : 
		<select name="type" required>
			<option value="">분류 선택</option>
			<option>과자</option>
			<option>아이스크림</option>
			<option>사탕</option>
			<option>주류</option>	
		</select>

		<br><br>

		상품가격 : <input type="number" name="price" required value="0" step="100" min="0">

		<br><br>

		제조일자 : <input type="date" name="made" required>

		<br><br>

		유통기한 : <input type="date" name="expire" required>

		<br><br>

		<input type="submit" value="등록">

	</form>

</body>
</html>

 

3-2 등록 처리 insert.txt 만들기

package web08.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import web08.beans.ProductDao;
import web08.beans.ProductDto;

//상품 등록 처리 서블릿
@WebServlet(urlPatterns = "/product/insert.txt")
public class ProductInsertServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : ProductDto(name, type, price, made, expire)
			ProductDto productDto = new ProductDto();
			productDto.setName(req.getParameter("name"));
			productDto.setType(req.getParameter("type"));
			productDto.setPrice(Integer.parseInt(req.getParameter("price")));
			productDto.setMade(req.getParameter("made"));
			productDto.setExpire(req.getParameter("expire"));

			//처리
			ProductDao productDao = new ProductDao();
			productDao.insert(productDto);

			//출력 : 성공 페이지로 redirect
			resp.sendRedirect("insert_success.html");//상대경로
			//resp.sendRedirect("/web08/product/insert_success.html");//절대경로
		}
		catch(Exception e) {
			e.printStackTrace();
			resp.getWriter().println("error");
		}
	}
}

 

3-2 등록 완료 insert_success.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 등록 완료</h1>

	<h5><a href="../index.html">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="../">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="/web08/index.html">메인페이지로 이동(절대경로)</a></h5>
	<h5><a href="/web08/">메인페이지로 이동(절대경로)</a></h5>
</body>
</html>

 

3-3 확인

(4) 수정 기능 구현

(참고)

필드셋(fieldset)은 폼(form) 내부의 구획정리를 위해 사용
입력정보가 여러 종류로 구분될 때 해당 영역을 분리하기 위하여 사용
영역에 제목을 <legend>로 줄 수 있다.

4-1 수정 정보 입력 update.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 정보 수정</h1>

<!-- 	<form action="/web08/product/update.txt"> -->
	<form action="update.txt">

		<fieldset>
			<legend>대상 정보</legend>
			상품번호 : <input type="number" name="no" required>
		</fieldset>

		<fieldset>
			<legend>변경할 정보</legend>

			상품이름 : <input type="text" name="name" required>

			<br><br>

			상품분류 : 
			<select name="type" required>
				<option value="">분류 선택</option>
				<option>과자</option>
				<option>아이스크림</option>
				<option>사탕</option>
				<option>주류</option>	
			</select>

			<br><br>

			상품가격 : <input type="number" name="price" required value="0" step="100" min="0">

			<br><br>

			제조일자 : <input type="date" name="made" required>

			<br><br>

			유통기한 : <input type="date" name="expire" required>

		</fieldset>

		<br>

		<input type="submit" value="수정">

	</form>
</body>
</html>

 

4-2 수정 처리 update.txt 만들기

package web08.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import web08.beans.ProductDao;
import web08.beans.ProductDto;

@WebServlet(urlPatterns = "/product/update.txt")
public class ProductUpdateServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : ProductDto(no, name, type, price, made, expire)
			ProductDto productDto = new ProductDto();
			productDto.setNo(Integer.parseInt(req.getParameter("no")));
			productDto.setName(req.getParameter("name"));
			productDto.setType(req.getParameter("type"));
			productDto.setPrice(Integer.parseInt(req.getParameter("price")));
			productDto.setMade(req.getParameter("made"));
			productDto.setExpire(req.getParameter("expire"));

			//처리 : ProductDao
			ProductDao productDao = new ProductDao();
			boolean success = productDao.update(productDto);

			//출력 : 성공 실패에 따라 각각의 페이지로 redirect
			if(success) {
				resp.sendRedirect("update_success.html");
				//resp.sendRedirect("/web08/product/update_success.html");
			}
			else {
				resp.sendRedirect("update_fail.html");
				//resp.sendRedirect("/web08/product/update_fail.html");
			}
		}
		catch(Exception e) {
			e.printStackTrace();
			resp.getWriter().println("error");
		}
	}
}

 

4-3 수정 성공 update_success.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>상품 수정 완료</h1>

	<h5><a href="../index.html">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="../">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="/web08/index.html">메인페이지로 이동(절대경로)</a></h5>
	<h5><a href="/web08/">메인페이지로 이동(절대경로)</a></h5>
</body>
</html>

 

4-4 수정 실패 update_fail.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리 홈페이지</title>
</head>
<body>
	<h1>존재하지 않는 상품번호</h1>

	<h5><a href="./update.html">다시 수정하러 가기</a></h5>
	<h5><a href="../index.html">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="../">메인페이지로 이동(상대경로)</a></h5>
	<h5><a href="/web08/index.html">메인페이지로 이동(절대경로)</a></h5>
	<h5><a href="/web08/">메인페이지로 이동(절대경로)</a></h5>
</body>
</html>

 

4-5 확인

 

(5) 상품목록, 상품검색 통합 조회 기능 구현

5-1 상품목록, 상품검색 통합 조회 search.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제품 관리 홈페이지</title>
</head>
<body>

	<h1>제품 정보 검색</h1>
	
	<form action="search.txt">	
		
		<select name="column">
			<option value="name">이름</option>
			<option value="type">유형</option>
		</select>
		
		<input type="text" name="keyword" placeholder="검색어" required>
		
		<input type="submit" value="검색">
		
	</form>

</body>
</html>

 

5-2 상품목록, 상품검색 통합 조회 search.txt 만들기

package web08.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import web08.beans.ProductDao;
import web08.beans.ProductDto;

@WebServlet(urlPatterns = "/product/search.txt")
public class ProductSearchServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : column(선택), keyword(선택) : 둘다 있으면 검색, 아니면 목록
			String column = req.getParameter("column");
			String keyword = req.getParameter("keyword");

			//처리 : ProductDao
			boolean search = column != null && keyword != null;
			//List<ProductDto> list = 목록결과 or 검색결과;
			List<ProductDto> list;

			ProductDao productDao = new ProductDao();
			if(search) {
				list = productDao.select(column, keyword);
			}
			else {
				list = productDao.select();
			}

			//출력 : 리다이렉트 불가
			resp.setCharacterEncoding("MS949");
			resp.getWriter().println("데이터개수 : "+list.size());
			for(ProductDto productDto : list) { 
				resp.getWriter().println("+-------------------------------+");
				resp.getWriter().println("| 번호 : " + productDto.getNo() + "");
				resp.getWriter().println("| 이름 : " + productDto.getName() + "");
				resp.getWriter().println("| 구분 : " + productDto.getType() + "");
				resp.getWriter().println("| 가격 : " + productDto.getPrice() + "원");
				resp.getWriter().println("| 제조일 : " + productDto.getMade().substring(0, 10) + "");
				resp.getWriter().println("| 폐기일 : " + productDto.getExpire().substring(0, 10) + "");
				resp.getWriter().println("+-------------------------------+");
				resp.getWriter().println();
			}
		}
		catch(Exception e) {
			e.printStackTrace();
			resp.getWriter().println("error");
		}
	}
}

 

5-3 확인

(6) 상세 조회 기능 구현

6-1 번호 입력 detail.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제품 관리 홈페이지</title>
</head>
<body>

	<h1>제품 정보 상세 조회</h1>
	<form action="detail.txt">
		제품 번호 : <input type="text" name="no" required>
		<input type="submit" value="보기">
	</form>

</body>
</html>

 

6-2 단일 조회 및 출력 detail.txt 만들기

package web08.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import web08.beans.ProductDao;
import web08.beans.ProductDto;

@WebServlet(urlPatterns = "/product/detail.txt")
public class ProductDetailServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : 상품번호(int no)
			int no = Integer.parseInt(req.getParameter("no"));

			//처리 : ProductDao
			ProductDao productDao = new ProductDao();
			ProductDto productDto = productDao.get(no);

			//출력 : 리다이렉트 불가. 직접 출력.
			resp.setCharacterEncoding("MS949");
			if(productDto != null) {
				resp.getWriter().println("+-------------------------------+");
				resp.getWriter().println("| 번호 : " + productDto.getNo() + "");
				resp.getWriter().println("| 이름 : " + productDto.getName() + "");
				resp.getWriter().println("| 구분 : " + productDto.getType() + "");
				resp.getWriter().println("| 가격 : " + productDto.getPrice() + "원");
				resp.getWriter().println("| 제조일 : " + productDto.getMade().substring(0, 10) + "");
				resp.getWriter().println("| 폐기일 : " + productDto.getExpire().substring(0, 10) + "");
				resp.getWriter().println("+-------------------------------+");
				resp.getWriter().println();
			}
			else {
				resp.getWriter().println("존재하지 않는 상품번호");
			}
		}
		catch(Exception e) {
			e.printStackTrace();
			resp.getWriter().println("error");
		}
	}
}

 

6-3 확인

 

 

지금까지 개발한 홈페이지의 문제점

1. 목록페이지에 HTML을 적용할 수 없다(없는건 아니고 불편하다)
2. 페이지의 링크가 정상적으로 연결되어 있지 않다

원인 : HTML에 프로그래밍 코드를 넣을 수 없다
해결 : HTML에 프로그래밍 코드를 넣는 새로운 페이지를 배운다 (JSP)

JSP : Java Server Page = 프로그래밍 코드가 가미된 HTML 페이지

 

 

웹 - JSP 기본


페이지 설정(Directive)
= 형식 - <%@ 이름="값" 이름="값" %>
= language : 페이지에서 사용할 언어(생략 가능)
= contentType : (중요!) 사용자(브라우저)에게 알려줄 페이지의 형태와 특징
= 형태를 MIME-TYPE이라고 부르며, 대분류/소분류 형태로 구성되어 있다.
= pageEncoding : JSP는 내부적으로 Servlet으로 변환되는데 이 때 적용할 글꼴(생략하면 contentType을 따라감)

 

<%-- 사용자에게 보이지 않는 JSP 전용 주석 --%>

<!-- 사용자에게 보이는 HTML 전용 주석 -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Hello JSP!</h1>
</body>
</html>

 


디렉티브(directive)
= 설정을 하고 싶을 때 사용
= 형식은 <%@ 설정 %>

스크립트릿(scriptlet) : 
= 프로그래밍 코드(ex : if, for, 객체생성, ..)를 작성하고 싶을 때 사용.
= 형식은 <%  코드  %>

표현식(expression) : 프로그래밍 값을 출력하고 싶을 때 사용.(ex : System.out.println())
= 형식은 <%= 값 %>

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

<%for(int i=1; i <= 10; i++){ %>
<h1>Hello JSP <%=i%></h1>
<%}%>

 

 


exam 테이블의 데이터들을 조회하여 화면에 HTML 방식으로 출력
= 프로그래밍 조회 코드 + HTML 출력 코드

<%@page import="web09.beans.ExamDto"%>
<%@page import="java.util.List"%>
<%@ page import="web09.beans.ExamDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	//프로그래밍 조회 코드
	ExamDao examDao = new ExamDao();
	List<ExamDto> list = examDao.select();
%>

<!-- HTML 출력코드 : 조회한 list에서 ExamDto의 이름만 출력 -->
<% for(ExamDto examDto : list){ %>
	<h3><%=examDto.getStudent()%></h3>
<% } %>