자주 쓰는 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로 내려주는 것이 가장 좋습니다.


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>

다수의 조건문으로 출력 (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에서 디버깅 모드로 객체에 어떤 변수가 있는지 확인 후 출력해야 합니다.

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