2024. 3. 10. 15:34ㆍ· FRONT-END/└ HTML
환경 : DBeaver, Spring Tool Suite4
(참고) 해당 실습에 사용된 데이터 베이스 코드 : https://ggingggang05.tistory.com/109
(참고) 해당 실습에 대한 Dto / Dao / Mapper 클래스 코드 및 기타 추가 설정 관련 : https://ggingggang05.tistory.com/110
[ 전체 코드 ]
- ProductController.java
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductDao dao;
//목록 및 검색 페이지
// @RequestMapping(value = "/list", method = RequestMethod.GET)
@RequestMapping("/list")
public String list(@RequestParam(required = false) String column,
@RequestParam(required = false) String keyword,
Model model) {
boolean isSearch = column != null && keyword != null;
List<ProductDto> list = isSearch ? dao.selectList(column, keyword) : dao.selectList();
/* List<ProductDto> list;
if(isSearch) {
list = dao.selectList(column, keyword);
} else {
list = dao.selectList();
}
*/
model.addAttribute("isSearch", isSearch);
model.addAttribute("list", list); // list를 넘긴다
return "/WEB-INF/views/Product/list.jsp";
}
}
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <p>는 paragraph --%>
<p>
제품에 대한 페이지입니다.
</p>
<%-- 페이지 제목 --%>
<c:choose>
<c:when test="${isSearch}">
<h1>제품 검색</h1>
</c:when>
<c:otherwise>
<h1>제품 목록</h1>
</c:otherwise>
</c:choose>
<%-- 검색창 --%>
<form action="list" method="get">
<select name="column">
<%--
EL은 문자열도 == 로 비교한다 (물론 equals도 가능)
EL은 문자열을 쌍따옴표로 쓰건 외따옴표로 쓰건 상관하지 않는다
--%>
<c:choose>
<c:when test="${param.column == 'product_name'}">
<option value="product_name" selected>제품명</option>
</c:when>
<c:otherwise>
<option value="product_name">제품명</option>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${param.column == 'product_category'}">
<option value="product_category" selected>제품 종류</option>
</c:when>
<c:otherwise>
<option value="product_category">제품 종류</option>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${param.column == 'product_price'}">
<option value="product_price" selected>제품 가격</option>
</c:when>
<c:otherwise>
<option value="product_price">제품 가격</option>
</c:otherwise>
</c:choose>
</select>
<%-- value="${param.keyword}" : 검색어 유지 --%>
<input type="search" name="keyword" placeholder="검색어 입력" required
value="${param.keyword}">
<button>검색</button>
</form>
<%-- 목록 출력 --%>
<%-- for(EmpDto dto : list) {} --%>
<table border="1">
<thead>
<tr>
<th>제품번호</th>
<th>제품명</th>
<th>제품종류</th>
<th>제품가격</th>
<th>출시일</th>
</tr>
</thead>
<tbody align="center">
<c:forEach var="dto" items="${list}">
<tr>
<td>${dto.productId}</td>
<td>${dto.productName}</td>
<td>${dto.productType}</td>
<td>${dto.productPrice}원</td>
<td>${dto.productRealseDate}</td>
</tr>
</c:forEach>
</tbody>
</table>
[ 코드 설명 ]
//목록 및 검색 페이지
// @RequestMapping(value = "/list", method = RequestMethod.GET)
@RequestMapping("/list")
public String list(@RequestParam(required = false) String column,
@RequestParam(required = false) String keyword,
Model model) {
boolean isSearch = column != null && keyword != null;
List<ProductDto> list = isSearch ? dao.selectList(column, keyword) : dao.selectList();
model.addAttribute("isSearch", isSearch);
model.addAttribute("list", list); // list를 넘긴다
return "/WEB-INF/views/Product/list.jsp";
}
(추가) 위의 리스트 조건문을 풀어 쓰면 아래와 같다 (현재 글의 주제와는 관련 없음)
List<ProductDto> list;
if(isSearch) {
list = dao.selectList(column, keyword);
} else {
list = dao.selectList();
}
- "제품 검색"과 "제품 목록"을 구분 짓기
model.addAttribute("isSearch", isSearch);
<%-- 페이지 제목 --%>
<c:choose>
<c:when test="${isSearch}">
<h1>제품 검색</h1>
</c:when>
<c:otherwise>
<h1>제품 목록</h1>
</c:otherwise>
</c:choose>
(+) 리스트를 넘기는 것처럼 model을 매개체로 활용하여 isSearch의 값을 넘긴다.
그렇게 ProductController에서 가져온 isSearch의 값을 test속성에서 사용하여 isSearch의 값이
참이면 "제품 검색", 거짓이면 "제품 목록"을 출력해준다.
- 사원을 검색하고 그 검색결과를 출력할 때 선택한 옵션이 고정되게 설정하기 (페이지 이동에도 선택한 옵션 태그 고정)
<%-- 검색창 --%>
<form action="list" method="get">
<select name="column">
<c:choose>
<c:when test="${param.column == 'product_name'}">
<option value="product_name" selected>제품명</option>
</c:when>
<c:otherwise>
<option value="product_name">제품명</option>
</c:otherwise>
</c:choose>
<%-- 제품 종류, 제품 가격 생략 --%>
</select>
<input type="search" name="keyword" placeholder="검색어 입력" required value="${param.keyword}">
<button>검색</button>
</form>
(+) EL은 문자열도 '==' 로 비교 (equals도 가능)
(+) EL은 문자열의 따옴표 모양을 신경쓰지 않음
<c:when test="${param.column == 'product_name'}"> 여기선 외부의 쌍따옴표("")와 구분하여 작성하였음
(+) value="${param.keyword}" : 검색어 유지
(+) input 태그에 placehodler를 사용하여 입력에 대한 정보를 사용자에게 보여준다
☆ 인라인으로 위의 코드를 조금 더 간결하게 구현하는 방법은 아래와 같다.
<option value="product_name" ${param.column == 'product_name' ? 'selected' : ''}>제품명</option>
(+) 삼항연산자를 option 태그 안에서 활용한다.
- 표의 형태로 결과값 출력하기
<%-- 목록 출력 --%>
<%-- for(EmpDto dto : list) {} --%>
<table border="1">
<thead>
<tr>
<th>제품번호</th>
<th>제품명</th>
<th>제품종류</th>
<th>제품가격</th>
<th>출시일</th>
</tr>
</thead>
<tbody align="center">
<c:forEach var="dto" items="${list}">
<tr>
<td>${dto.productId}</td>
<td>${dto.productName}</td>
<td>${dto.productType}</td>
<td>${dto.productPrice}</td>
<td>${dto.productRealseDate}</td>
</tr>
</c:forEach>
</tbody>
</table>
(+) 반복될 표의 형태를 <c:forEach> 태그를 안에 넣어준다.
(추가) 가격을 출력할 때 형식을 부여하자
<%-- 그냥 데이터 값을 출력--%>
<td>${dto.productPrice}</td>
<%-- 형식을 지정하여 값을 출력--%>
<td align="right">
<%-- 방법1 --%>
<fmt:formatNumber value="${dto.productPrice}" pattern="#,##0"></fmt:formatNumber>
<%-- 방법2 --%>
<%--<fmt:formatNumber pattern="#,##0">${dto.productPrice}</fmt:formatNumber> --%>
</td>
(+) <fmt:formatNumber> 태그를 사용
(+) pattern 속성을 사용하여 기본 출력 형식을 부여한다.
(+) value 속성을 사용하여 fmt 형식을 지정할 변수를 불러온다
- <p> 태그
<%-- <p>는 paragraph, 문단 태그이다. --%>
<p>
제품에 대한 페이지 입니다.
</p>
(+) <p> 태그, paragrapht는 문단 태그입니다.
개인 공부 기록용입니다:)
'· FRONT-END > └ HTML' 카테고리의 다른 글
[ HTML ] !DOCTYPE html 이해 및 header, footer 구조 (0) | 2024.03.16 |
---|---|
[ HTML ] 특수문자 코드표 (0) | 2024.03.13 |
[ HTML ] 표 만들기 (0) | 2024.03.09 |
[ jsp / html ] 정보 수정 페이지에서 성공/실패 페이지로 (0) | 2024.03.03 |
[ HTML ] <select>, <option> 태그 (0) | 2024.03.01 |