1. Servlet
- Java 내에 HTML 코드를 작성해서 Response으로 내보내기 위한 형태
- Java Class
2. JSP
- HTML 내에 Java 코드를 작성
- JSP는 실행 시 다시 Servlet으로 변환됨
- Java 코드 작성 방식
1. 스크립틀릿 (예전 기술)
1) <% Java 코드 작성 %> : 스크립틀릿
2) <%= Java의 변수나 값 &> : Java의 변수나 값을 HTML에 출력 (표현식)
3) <%! 변수나 메서드 선언 %> : 선언문
- 같은 JSP 파일 내에 Java 코드와 HTML 코드가 같이 들어가기 때문에 복잡해짐
2. EL(Expression Language) : 출력 전용
- if, for 와 같은 제어문이 없음
- 문법
${scope명.속성명}
- scope명 : 내장 객체의 Life Cycle
--- Request 객체에 저장된 Attribute를 사용하려면 ${requestScope.어트리뷰트명} 사용하면 됨
--- 어트리뷰트명에 해당하는 값을 HTML코드로 렌더링해서 웹브라우저로 Response 해줌
3. JSTL(JSP Standard Tag Library)
- 스크립틀릿을 사용하지 않고 JSP를 작성할 수 있음
- JSTL 태그
1) Core Tag : 변수관리, 제어문 등을 제공
- 접두사(prefix, 태그명) : c
2) Function Tag : 문자열 조작, 문자열 길이등의 함수 제공
- 접두사(prefix, 태그명) : fn
3) Formatting Tag : 숫자, 날짜, 통화단위 등의 포맷 지정 기능 제공
- 접두사(prefix, 태그명) : fmt
4) XML Tag : XML 관련 (요즘에는 안씀)
- 접두사(prefix, 태그명) : x
5) SQL Tag : SQL 관련 (요즘에는 안씀)
- 접두사(prefix, 태그명) : fn
- 사용순서
1) 사용하려는 JSP 선언부에 JSTL 라이브러리 선언
2) JSP 코드 작성부에 선언한 태그를 가지고 작성
설명1. JSTL 사용법
jsp 문서 윗부분에 아래와 같이 JSTL을 사용하겠다고 선언해주면 된다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
위의 코드의 의미는 c태그를 사용해서 java코드를 작성하겠다는 소리이다.
앞으로 jsp문서에 c태그를 사용하면 java코드를 작성할 수 있다.
<c:import url="../template/header.jsp"></c:import>
위와 같이 사용해주면 된다.
3. JSTL - core태그
1. c:import
- HTML 코드를 해당 부분으로 붙여넣음
- 동일한 HTML 코드들을 모듈화 할 수 있음
- 문법
<c:import url="import할 jsp파일의 상대경로"></c:import>
2. c:forEach
- 자바의 for문에 해당
- 문법
1) 숫자를 반복할 때
<c:forEach begin="시작 인덱스" end="끝 인덱스" step="증가할 숫자" var="인덱스 문자"></c:forEach>
- step은 생략 가능, 생략 시 기본값은 1, 음수 불가능
- ex)
Java : for(int i=0;i<10;i++) { }
JSTL : <c:forEach begin="0" end="9" step="1" var="i">
2) Collection 계열을 반복할 때
<c:forEach items="Collection의 속성명" var="DTO를 담을 변수명" varStatus="상태를 담을 변수명">
- 알아서 Collection에 저장된 개수만큼 반복해준다. (자세한 사용법은 설명 참조)
설명1. c:import
header, footer와 같은 모든 jsp 파일에 공통적으로 들어가는 코드를
하나의 jsp파일로 만든다음에 import를 시키면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--Header 시작-->
<header class="header">
<nav class="header_nav_main">
<ul>
<li><a href="/s1/">HOME</a></li>
<li><a href="/s1/notice/list">공지사항</a></li>
<li><a href="/s1/emp/list">사원관리</a></li>
<li><a href="/s1/dept/list">부서관리</a></li>
</ul>
</nav>
<nav class="header_nav_sub">
<ul>
<li><a href="#">로그인</a></li>
<li><a href="#">회원가입</a></li>
</ul>
</nav>
</header>
<!--Header 끝-->
위와같이 header를 따로, jsp파일로 만들어서 template 폴더에 따로 넣어놓는다.
<body>
<c:import url="../template/header.jsp"></c:import>
<div class="sub">
<h1>NOTICE</h1>
</div>
</body>
그리고 header 사용하려는 다른 jsp 파일에 c:import를 통해서 이 파일을 넣어주면 된다.
쉽게 생각하면, 코드를 복사해서 붙여넣어주는 역할을 해준다고 생각하면 된다.
저 부분에 header 소스코드가 통째로 들어간다고 생각하면 된다.
이전에는 일일이 header를 만든다음에 header를 전체를 복사해서 붙여넣기를 했었지만,
이제는 c:import 태그를 이용해서 한줄의 코드로 header를 복사할 수 있다.
그리고 나중에 header를 수정할 일이 생기게 되면,
header파일 하나만 수정하면 나머지도 자동으로 수정되기 때문에 훨씬 간편하다.
설명2. Collection에서 반복문 돌리는 법
NoticeDTO noticeDTO = new NoticeDTO();
noticeDTO.setNum(1);
noticeDTO.setTitle("Title");
noticeDTO.setWriter("Writer");
noticeDTO.setContents("Contents");
noticeDTO.setHit(3);
NoticeDTO noticeDTO2 = new NoticeDTO();
noticeDTO2.setNum(2);
noticeDTO2.setTitle("Title2");
noticeDTO2.setWriter("Writer2");
noticeDTO2.setContents("Contents2");
noticeDTO2.setHit(5);
ArrayList<NoticeDTO> ar = new ArrayList<NoticeDTO>();
ar.add(noticeDTO);
ar.add(noticeDTO2);
이렇게 Attibute 이름이 list인 것에 ArrayList<NoticeDTO>를 담아서 JSP에 표현해본다고 해보자.
<c:forEach items="${requestScope.list}" var="notice" varStatus="state">
<h3>번호 : ${pageScope.notice.num}</h3>
<h3>작성자 : ${pageScope.notice.writer}</h3>
JSP에 이런식으로 작성해주면 된다.
items 속성에는 Collection이 저장된 주소를(참조변수) 넣어주면 된다.
requestScope.list를 하면 Attribute이름이 list인 것의 값, 즉 ArrayList의 주소를 가져오게 된다.
그리고 var 에는 앞으로 이것을 현재 jsp 페이지에서 뭐라고 지칭할 것인지를 명시해주면 된다.
여기서는 "notice" 라고 써놨음으로 내장객체 Page에 notice라는 이름으로 저장이 된다.
그래서, forEach 태그 안에, pageScope.notice.num 을 하면
ArrayList에서 알아서 DTO 객체하나를 하나씩 자동으로 꺼내준다.
그리고 getNum 메서드도 실행시켜서 num 멤버하나를 출력해주게 된다.
이런식으로 사용하면 된다.
설명3. varStatus 문법들 모음
<c:forEach items="${requestScope.list}" var="notice" varStatus="state">
현재 아이템 : ${pageScope.state.current}
인덱스 번호 : ${pageScope.state.index}
순서 번호 : ${pageScope.state.count}
처음인지 : ${pageScope.state.first}
마지막인지 : ${pageScope.state.last}
</c:forEach>
4. EL 문법
1. ${requestScope.어트리뷰트명} : 해당 어트리뷰트 값을 출력함
2. ${requestScope.어트리뷰트명.메서드명()}
- 어트리뷰트의 값이 참조변수일 경우 사용
- get메서드의 경우 ${requestScope.어트리뷰트명.XXX} 으로 줄여 쓰는 것도 가능 (설명 참조)
설명1. ${requestScope.어트리뷰트명.getXXX()}
NoticeDTO noticeDTO = new NoticeDTO();
noticeDTO.setNum(1);
noticeDTO.setTitle("Title");
noticeDTO.setWriter("Writer");
noticeDTO.setContents("Contents");
noticeDTO.setHit(3);
request.setAttribute("dto", noticeDTO);
컨트롤러 클래스에서 이렇게 Attribute에 dto라는 이름으로 noticeDTO 객체 하나를 담아서 넣어놨다.
그리고 이것을 JSP에서 꺼내보려고 한다고 해보자.
noticeDTO는, 참조변수이기 때문에 NoticeDTO객체의 주소를 담고 있다.
즉, NoticeDTO객체의 멤버에 접근하기 위해서는 get메서드가 필요하다.
<h1> 글 제목 : ${requestScope.dto}</h1>
즉, 위와 같은 코드를 작성하면 NoticeDTO 객체의 주소밖에 출력이 되지 않는다.
우리가 각 멤버변수에 접근하기 위해서는 참조변수명.get메서드를 통해서 접근이 가능하지 않았는가?
여기도 똑같다. 이 주소 . 메서드명을 통해 get메서드를 호출해야 멤버변수에 접근을 할 수 있게되는 것이다.
<h1> 글 제목 : ${requestScope.dto.getTitle()}</h1>
이렇게 작성하면 NoticeDTO의 title 멤버변수를 출력해주게 된다.
이는 약식으로
<h1> 글 제목 : ${requestScope.dto.title}</h1>
이렇게 작성할 수 있다.
get메서드의 get부분을 삭제하고, 멤버변수명의 시작인 대문자를 소문자로 바꿔주는 것을
get메서드의 이름이라고 한다. 이 이름만을 써주는 것을 통해서도 호출할 수 있다.
5. EL - Scope명의 생략
- 내장 객체 Life Cycle 의 순서
pageScope -> requestScope -> sessionScope -> applicationScope
- 오른쪽으로 갈 수록 생명주기가 김 (객체를 더 오래 사용 가능)
- Scope명은 생략 가능
- Scope명 생략하고 속성명만 명시하면, pageScope 영역부터 오른쪽으로 해당 속성을 찾기 시작함
- Scope명을 생략하면 안되는 경우 : 서로 다른 Scope에 동일한 속성명이 있는 경우
--- pageScope부터 찾기 시작하기 때문에 왼쪽에 있는 Life Cycle영역부터 찾아지게됨
--- 의도치 않은 Attribute가 선택될 수 있음
--- 다른 영역이더라도 중복된 속성명이 없도록 설계하는 것을 권장
'웹개발 풀스택 과정 > Spring Legacy' 카테고리의 다른 글
| 36일차(2022.02.15) _ Spring 오류처리, 상태 코드 (0) | 2022.02.15 |
|---|---|
| 35일차(2022.02.14) _ DB - Spring - Web 연동, 파라미터를 Java로 보내기, 파라미터 자동 형변환/기본값 설정 (0) | 2022.02.14 |
| 34일차(2022.02.11) _ Request, Response의 기본 개념과 구성 요소 (GET 메서드, 내장 객체, parameter 보내기) (0) | 2022.02.11 |
| 33일차(2022.02.10) _ DI, Annotation (0) | 2022.02.10 |
| 32일차(2022.02.09) _ Spring 기본 개념 (0) | 2022.02.10 |