자주 쓰는 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}">&nbsp;</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