자주 쓰는 JSP 정리 / EL 문법 / JSTL 문법
자주 쓰는 JSP
HTML 파일을 JSP로 바꾸는 법
1. HTML 파일 확장자를 .jsp로 변경합니다.
2. <html> 태그 위에 아래의 코드 중 사용할 taglib를 추가합니다.
header에 추가해도 header가 포함된 페이지들에 공통 적용되지 않아서, 각 jsp에 개별적으로 추가해 줘야 합니다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
각 페이지에 공통 헤더 jsp include 방법
<jsp:include page="../common/layout/header.jsp"/>
header.jsp 예시
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>프로젝트타이틀</title>
<link rel="stylesheet" href="/파일경로/공통.css">
<script src="/파일경로/공통.js"></script>
</head>
<body>
// loading, 상단 메뉴 등 공통 요소
</body>
EL 문법
javascript에서 출력 예시
if ('${modelObject명.하위변수명}' == '') {
return;
}
Spring 컨트롤러에서 Model에 저장된 데이터를 JSP의 Javascript에서 출력하여 사용할 수 있습니다.
HTML에서 출력 예시
'${modelObject명}'
param 파라미터 사용 예시
<input type="hidden" name="bokNm" value="${param['파라미터명']}" />
또는
<input type="hidden" name="bokNm" value="${param.파라미터명}" />
컨트롤러의 HttpServletRequest 객체에 담긴 parameter를 EL 문법 param 객체로 쉽게 사용할 수 있습니다.
하지만, param 객체를 남용하면 여러 페이지를 타고 들어갔을 때 파라미터의 출발지를 디버깅하기 어렵고, 데이터 위변조가 가능하다는 단점이 있습니다.
클라이언트에서 pk와 fk만 form으로 전달하고, 컨트롤러에서 필요한 데이터를 새로 DB 조회하여 Attribute로 내려주는 것이 가장 좋습니다.
변수 내 텍스트 줄바꿈 처리
${fn:replace(VO명.변수명, '\\n', '<br>')}
HTML 렌더링 시 \n은 줄바꿈으로 인식되지 않으므로, 변수 내 텍스트에 \n이 있으면 <br>으로 변경합니다.
JSTL 문법
EL 변수 저장 예시
<c:set var="EL변수명" value="${attribute명}"/>
서버에서 Model에 담아준 Attribute 값을 EL로 조회하고, 다른 EL 변수를 생성하여 저장하는 예시입니다.
이렇게 저장된 EL 변수는 해당 JSP 페이지 내에서 사용할 수 있습니다.
단일 조건문으로 출력 예시 (if)
<c:if test="${EL변수명1 eq '값' and (EL변수명2 eq '값1' or EL변수명2 eq '값2')}">
// 출력할 HTML 코드
</c:if>
변수가 비어있지 않으면 출력
<c:if test="${not empty VO명.변수명}">
// 출력할 HTML 코드
</c:if>
다수의 조건문으로 출력 (choose)
<c:choose>
<c:when test="${EL변수명 eq 값1}">
// 출력할 HTML 코드
</c:when>
<c:when test="${EL변수명 ne 값1}">
// 출력할 HTML 코드
</c:when>
<c:when test="${EL변수명 > 값2}">
// 출력할 HTML 코드
</c:when>
<c:otherwise>
// 출력할 HTML 코드
</c:otherwise>
</c:choose>
위에서부터 조건식 비교하여 일치하면 출력하고, 그 아래 조건문들은 비교하지 않습니다.
List<dto 객체> 출력 예시
<c:forEach var="testUser" items="${testUsers}">
${testUser.userName}
</c:forEach>
객체 전체 출력은 불가해서, java에서 디버깅 모드로 객체에 어떤 변수가 있는지 확인 후 출력해야 합니다.
VO 변수 순차 출력
<p class="txt">
<c:forEach var="field" items="${['VO변수명1', 'VO변수명2', 'VO변수명3', 'VO변수명4']}" varStatus="status">
<c:if test="${not empty ResultSet명.VO명[field]}">
<c:if test="${!status.first}"> </c:if>
${ResultSet명.VO명[field]}
</c:if>
</c:forEach>
</p>
forEach문의 items에 VO 변수명들을 지정하면, 해당 값들을 순차 출력할 수 있습니다.
List<Map> 출력 예시
<select id="contentType" name="contentType">
<option value="">전체</option>
<c:forEach var="type" items="${contentTypeList}">
<option value="${type.cd}">${type.name}</option>
</c:forEach>
</select>
공통코드 테이블에서 가져온 contentTypeList를 Controller의 model에 addAttribute 한 뒤 출력하는 방법입니다.
Controller 코드 참고
@GetMapping("")
public String getListPage(@RequestParam Map<String,Object> params, Model model) throws Exception {
model.addAttribute("contentTypeList", codeService.getCodeListByGroupId("2"));
return "content/list";
}
리스트 개수 출력
<c:out value="${fn:length(리스트명)}" />
Java에서 mav.addObject(“리스트명”, 리스트); 로 담아준 리스트의 원소 수를 출력합니다.
Leave a comment