Controller 통합
Servlet life cycle
진행순서
- url 요청 : http://locatlhost:8080/web/~~
- url 요청이 톰캣에 들어감
- /web (컨텍스트 루트, Context path) : 해당 루트의 web.xml 찾아 스캔 (WEB-INF안에 web.xml)
컨텍스트 루트가 내컴퓨터 기준으로 보면 C드라이브나 D드라이브냐를 지정하는 개념
톰캑은 주소의 컨텍스트 루트를 보고 맞는 것을 선택해서 들어감
한 서버아래 프로젝트 하나 더 추가해서 서버에 올리면 각각 컨텍스트 루트에 따라 다르게 접근함 - web.xml의 <servlet-mapping>을 분석함
- <servlet-mapping>의 <url-pattern>이 요청과 일치하는 패턴의 <servlet-name>값과 동일한 <servlet-name>의 <servlet> 태그를 찾고, 찾은 태그의 <servlet-class> 값의 컨트롤러 클래스를 객체 생성하여 로딩시킨다.
init(), service() 호출
이때, 만약 이미 로딩이 되어있으면 service()만 호출, init()은 처음 로딩때만 호출이 된다. - 컨트롤러 클래스가 하나라면 uri분석하여 맞는 로직, view 처리해줌 (개발자)
표현언어 Expression Language EL
• 모든 웹에서 사용되는 웹 언어(스크립트 언어)
• 출력문을 더쉽게 간결하게 사용할 수 있는 언어 (대입개념 x, 표현에만 초점)
• null일시 출력하지 않음
EL 기능
- jsp 네가지 내장객체가 제공하는 영역의 속성 사용
- 수치연산, 관계연산, 논리연산자 제공
- 자바 클래스 메소드 호출 기능 제공
- 쿠키 내장객체의 속성 등 jsp를 위한 표현언어의 내장객체 제공
- 람다식 이용한 함수 정의와 실행 (EL 3.0)
- 스트림 API를 통한 컬렉션 처리 (EL 3.0)
- 정적 메소드 실행 (EL 3.0)
EL 구성
스크립트 표현식 | <%= %> |
EL | ${ } |
# JSP의 스크립트태그(스크릿트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용가능
#문자형 홑/겉따옴표 구분 없음
연산자
- 산술, 논리, 비교 등 존재
- 표현언어에는 대입 개념이 없다 ${ a = 10 } ▹ a와 10이 같은지 묻는것, 비교연산으로 인식, == 와 동일한 결과
☑ 산술 연산자
▪ + - * /(div) %(mod) ${ 10 + 5 } ▹ 화면에 15출력
▪ 정수와 실수타입에 대해서만 동작
▪ 숫자+객체(문자) 숫자로 변환해서 연산결과 출력
▪ null ▹ Long 타입의 0으로 연산처리되며, 연산없이 단순 null이면 출력을 아예 안함
Ex)
∙ java : syso("10" + 10) ▹1010
∙ EL : ${ "10" + 10 } ▹ 20
∙ ${ "일" + 10 } ▹ 에러 : 숫자로 변환 불가한 객체
∙ ${ "null" + 10 } ▹ 10
∙ ${ null } ▹ 아무것도 출력안함
☑ 비교 연산자
▪ == 또는 eq 또는 =
▪ != 또는 ne
▪ < 또는 lt
▪ > 또는 gt(then)
▪ <= 또는 le
▪ >= 또는 ge(그라이언트 댄 이퀄즈)
❕ 태그형태의 기호라서 < 잘 인식 못할수도 있기 때문에 영문 연산표기법 알아두기
☑ 논리 연산자
▪ && 또는 and
▪ || 또는 or
▪ ! 또는 not
☑ empty 연산자
▪ empty 변수
▪ 변수가 빈 객체인지 검사할때 사용 (주로 ArrauList나 배열)
▪ 값이 null, 빈문자열, 길이0, 빈 Map, 빈 Collection 객체일 경우 true 리턴
☑ 삼항연사자
▪ ? :
EL 기본객체
☑ 객체종류
📌requestScope | request 내부객체에 저장된 속성 사용가능 |
📌sessionScope | session 내부객체에 저장된 속성 사용가능 |
📌param | 요청 파라미터 사용가능 request.getParameter("파라미터명")의 결과와 동일 |
paramValues | 요청 파라미터 배열 사용가능 String[] request.getParameterValues("파라미터명")의 결과와 동일 |
cookie | request.getCookies() 로 구한 쿠키배열로 매핑된 객체 |
pageContext | pageContext 내부객체와 동일 |
pageScope | pageContext의 속성 사용가능 |
applicationScope | application 내부객체와 동일 |
hearder | request.getHearder() 결과와 동일 |
initParam | 초기화 파라미터 속성 사용가능 |
☑ 객체접근
▪ java : <%= session.getAttrubyte("memId") %>
▪ EL : ${ sessionScope.memId }
* 동일한 속성명(ex. name)이 여러개가 존재하면 xxxScope를 적어주기 속성이 유일하거나 구분이 가능하다면 이름만 기술하여 사용 가능. 동일한 속성명이 여러개 존재하고, xxxScope를 생략하고 이름만 적으면 page, request, session,application 순으로 검색해서 찾음
* cookie : '쿠키이름', Cookie객체 형태
new Cookie("cookieId","java");
c.setMaxAge(60*60*24);
response.addCookie(c);
${cookie.cookieId.value} ▹ java 나온다
JSTL : JSP Standard Tag Library
• JSP에서 사용가능하도록 만들어진 커스텀태그 중에서 많이 사용하는 것들을 모아서 JSTL 이라는 표준을 만듬
• 커스텀태그라고도 부르며 EL과 함께 사용 됨
• HTML코드와 자바 코드가 들어가는 JSP 스크립트 태그등이 섞여 있으면 가독성이 떨어지며 코드 재사용성이 떨어짐
• JSTL을 이용하면 스크립트 코드에서 적용한 기능을 태그로 만들어서 치환 가능 (자바를 태그화)
• XML 기반으로 작성되어 시작태그와 종료태그 쌍으로 이루어져 있음
• 홑태그는 /> 마지막에 닫아주어야함
• 대소문자 구분
라이브러리 배치
https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
jstl-1.2.jar 다운 받아서 WEB-INF > lib 폴더 안에 배치하기
JSTL 태그 종류
📌Core : 가장 기본적인 태그 : 접두어 c : http://java.sun.com/jsp/jstl/core
📌국제화(fmt) : 포매팅, 숫자나 날짜 관련 태그 : 접두어 fmt : http://javasun.com/jsp/jstl/fmt
XML : xml 분리하기 위해 만들어졌으나 이제 사용 안함
데이터베이스 : DB 관련 태그 (우리는 사용 안함 DAO에서 처리)
함수 : 함수처리 (우리는 사용 안함. 모든 연산은 MVC 패턴에 따라 Model 처리)
Core 태그
• Attribute 변수 선언, 삭제 등 변수 관련 작업과 if, for 같은 제어문, url처리 등에 사용
☑ core 태그 선언
▪ 현재 jsp 페이지에서 core 태그를 사용하겠다고 선언해줘야 사용 가능
▪ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
💡
∙ prefix : 태그 라이브러리 호출할때 사용할 접두어 지정. 별칭같은 존재로 core태그 사용한다. (꼭 c가 아니어도 됨)
∙ uri : 라이브러리 uri 작성, 고정값이니까 외우기
☑ 태그 종류
변수지원 : set/remove
흐름제어 : if/choose/forEach/forTokens
URL처리 : import/redirect/url
기타 : catch/out
태그 | 기능 |
set | 변수설정 |
remove | 설정한 변수 제거 |
if | 조건문, 자바 if |
choose | 자바 switch와 비슷 |
forEach | 반복문 |
forTokens | 반복문 |
import | include 와 비슷, url을 사용하여 다른 자원결과 삽입 |
redirect | 지정한 경로로 리다이렉트 (단순이동 = 요청) |
url | url 작성 |
catch | 익셉션처리시 사용 |
out | 출력 |
① c:set
- 변수 생성 (일반변수)
<c:set var="변수명" value="값" />
<c:set var="변수명"> 값 </c:set>
value : 표현식, EL, 정적테스트 사용해 값 지정 가능
- 프로퍼티 값 설정 (객체느낌)
<c:set target="대상" property="프로퍼티명" value="값" />
<c:set target="대상" property="프로퍼티명"> 값 </c:set>
target : 값 설정한 대상 객체. 표현식, EL 사용, 대상 자바빈객체(dto,map)
property : 프로퍼티 이름지정. 타겟이 dto라면 dto안의 변수명 > set()
value : 프로퍼티 값 지정
② c:remove 변수 삭제
③ c:if 조건문 else if 없음
<c:if test="조건EL">조건이 참일경우 실행할 코드</c:if>
test : 속성값은 표현식, EL, 문자열사용 가능 > EL 사용하자
④ c:cjppse, c:when, c:otherwise / switch, if-else 섞은 느낌
<c:choose>
<c:when test="조건EL">
....
</c:when>
<c:when test="조건EL">
....
</c:when>
<c:when test="조건EL">
....
</c:when>
<c:otherwise>
....위 조건에 부합되지 않을 경우 실행할 코드....
</c:otherwise>
</c:choose>
⑤ c:forEach 반복문
- 자바 업그레이드 for문처럼 사용
<c:froEach var="변수" item="아이템EL">
....
${변수사용}
....
</c:forEach>
<!-- ex -->
int[] arr = {1,2,3,4,5}
for(int i : arr){
System.out.println(i); // 1 2 3 4 5
}
- 자바 일반 for문처럼 사용
<c:forEach var="변수" begin="시작값" end="종료값" step="건너뛸값">
....${변수}
</c:forEach>
<c:forEach var="변수" items="아이템EL" varStatus="status">
${변수}
${status.varStatus속성사용}
</c:forEach>
varStatus 속성
.index | 현재 실행중인 index > 0 1 2 ... |
.count | 루프 실행 횟수 > 1 2 3 ... |
.begin | begin 속성값 |
.end | end 속성값 |
.step | step 속성값 |
.first | 현재 실행이 첫번째 실행일 경우 true |
.last | 현재 실행이 마지막 실행인 경우 true |
.current | 컬렉션중 현재 루프에서 사용할 객체 |
⑥ c:forTokens 반복문, 구분자 사용
Token방식으로 잘라서 보여주는 반복문
<c:forTokens var="변수명" items="문자열" delims="구분자">
....${변수}
</c:forTokens>
⑦ c:import include와 비슷
<c:import var="변수명" url="경로" />
${변수명}
⑧ c:redirect 단순이동
<c:redirect url="이동경로" />
⑨ c:url url 생성
http://..../jsp14/main.jsp?id=test
<c:url value="경로">
<c:papam name="파라미터명" value="파라미터값" />
</c:url>
value : 경로는 절대경로와 상대경로 둘다 사용 가능
- 절대경로 : http://localhost:8080/web/jsp13/logonFrom.jsp
- 상대경로 : 웹 어플 내에서 절대경로 : /jsp13/loginFrom.jsp
현 jsp에 대한 상대경로 : ../jsp13/loginFrom.jsp
⑩ c:out 출력
<c:out value="출력EL" />
fmt : 국제화 코드
특정 지역에 맞게 출력하거나 숫자 날짜 관련된 태그
☑ fmt 태그 선언
<%@ taglib prefix="fmt" uri="http://java.sum.com/jsp/jstl/fmt" %>
☑ 태그 종류
✔ 로케일 지정 | |
setLocale | |
requestEncoding | 요청파라미터 캐릭터 인코딩 지정 |
✔ 숫자 및 날짜 포매팅 | |
formatDate | Date 객체 포매팅 |
parseDate | 문자열로 표시된 날짜를 분석해 Date 객체로 변환 |
formatNumber | 숫자 포매팅 |
parseNumber | 문자열로 표시된 날짜를 분석해서 숫자로 변환 |
setTimeZone | 시간대 정보 특정변수에 저장 |
timeZone | 시간대 지정 |
'basic > jsp' 카테고리의 다른 글
JSP 14 [실습1] EL, JSTL-Core 태그 사용해보기 (0) | 2021.07.26 |
---|---|
[jsp 15] MVC - properties 파일 이용한 통합 controller 만들기 (0) | 2021.07.26 |
[jsp13] Web server, WAS, Servlet, MVC 패턴 (0) | 2021.07.21 |
jsp[12] - 회원가입 + 게시판 연결하기 (0) | 2021.06.17 |
jsp[10] - 파일 업로드 (0) | 2021.06.16 |