list, String[]
에 대한 접근 방법을 제공한다EL변수를 사용해서 더 편하게 scope를 사용할 수 있다
pageContext : JSP의 page 기본 객체와 동일하다. pageScope보다 상위. page객체 안에 있는 기능을 쓸 수 있음.
pageScope : page 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
requestScope : request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
sessionScope : session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
applicationScope : application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
param : 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체. String 타입이다.
request.getParameter("파라미터이름")
의 결과와 동일
paramValues : 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체. String[] 타입
request.getParameterValues("파라미터이름")
과 결과 동일
Cookie : <쿠키이름, 쿠키값> 매핑을 저장한 Map 객체.
request.getCookies()
와 동일
initParam : 초기화된 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체
데이터 전송 시 가장 많이 사용하는 형태가 key-value
<%
pageContext.setAttribute("num1", 1);
request.setAttribute("num2", 2);
session.setAttribute("num3", 3);
application.setAttribute("num4", 4);
int number1=(Integer)pageContext.getAttribute("num1");
int number2=(Integer)request.getAttribute("num2");
%>
<p>JSP 변수의 합 : <%=number1+number2 %></p>
<p>page num1 : ${num1 }</p>
<p>request num2 : ${num2 }</p>
<p>session num3 : ${num3 }</p>
<p>application num4 : ${num4 }</p>
EL은 jsp에 자바를 섞은 표기법이다.
객체안에 들어간 값을 jsp 변수로 받아오고 태그<%=%>
로 가져오는 것에서
EL 표기법${}
을 사용해 바로 저장된 값을 가져오게 된다. 단계가 줄어들었다
EL 표기법을 쓰는 이유. 코드가 짧아져서 편리하다!
pageContext.setAttribute("scopeNum", 1);
request.setAttribute("scopeNum", 2);
session.setAttribute("scopeNum", 3);
application.setAttribute("scopeNum", 4);
%>
<p>page scopeNum : ${scopeNum }</p>
<p>request scopeNum : ${scopeNum }</p>
<p>session scopeNum : ${scopeNum }</p>
<p>application scopeNum : ${scopeNum }</p>
다 1 출력됨. 포함관계의 가장 안쪽인 page의 값이 나오는 것이다.
이름은 신중하게 지을 것! 에러가 표시되지않아서 조심해야함
기본적인 연산자는 자바와 동일하고 /
와 div는 동일한 연산자
주로 서버사이드에서 데이터를 가져왔는데 데이터가 비어있을 경우 처리를 해야하는데 데이터가 비어있는지 아닌지 확인할 때 사용한다.
더하기 : +
빼기 : -
몫 : /, 나머지 : mod
같은가? : ${10 eq 10}<br>
다른가? : ${10 != 10}<br>
작은가? : ${10 lt 10}<br>
큰가? : ${10 gt 10}<br>
작거나 같은가? : ${10 le 10 }<br>
크거나 같은가? : ${10 ge 10 }<br>
논리곱 : ${true and false }<br>
논리합 : ${true or false }<br>
논리 부정 : ${not true }<br>
null : ${empty nullStr }<br>
빈 문자열 : ${empty emptyStr }<br>
길이가 0인 배열 : ${empty zeroArray }<br>
빈 ArrayList(collection) : ${empty emptyList }<br>
나머지 경우 : ${empty "문자열" }<br>
not null : ${not empty nullStr }<br>
true/false로 값이 나온다.
${param.파라미터이름}
는
reqeust.getParameter("파라미터이름")
와 같다
마찬가지로 jsp 변수로 받아오는 과정을 생략할 수 있다!
하지만 보통 parameter는 form에서 서버로 데이터를 보낼때만 사용하고 서블릿에서 jsp로 데이터를 보낼땐 param방식을 못쓰기때문에 param은 잘 사용하지않는다
<jsp:useBean id="point" class="edu.web.el01.Point" scope="page"/>
<jsp:setProperty property="x" name="point" value="0.0"/>
<jsp:setProperty property="y" name="point" value="0.0"/>
<p>point의 x,y 좌표값 : ${point.x }. ${point.y }</p>
<p>point의 x,y 좌표값 : ${pageScope.point.x }. ${pageScope.point.y }</p>
el로 클래스 프로퍼티에 접근가능 해당 페이지에서 useBean을 사용했기때문에 pageScope에 포함되는것.
point.x는 getter 메소드와 동일.
VO클래스를 만들어놓고 변수명을 나중에 바꾼다면 에러가 발생할 수 있음. 클래스안에서 변수명만 바꾸고 getter/setter의 메소드명을 바꾸지 않으면 문제가 발생. 변수명을 바꾼다면 메소드명까지 신경쓰거나 다 지워서 다시 만드는게 좋다.
메소드 이름까지 다 바꿨는데 안되는 경우? 서버가 과거의 정보를 가지고 있고 변경된 정보를 반영하지 못했을 때 발생. 서버 clean 후 재시작해야함
jsp 태그 <%%>와 EL 태그는 혼용해서 사용하기 어렵고 EL 태그는 제어문이 없기때문에 JSTL을 이용해 반복문을 사용한다
가독성과 편리함을 위해 JSTL을 사용함
c
x
SQL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="name1" value="고기"></c:set>
<p>name1의 값 : ${name1 }</p>
JSTL을 사용한 값을 EL태그로 가져옴
<c:if test="조건">실행문</c:if>
<c:if test="${param.name=='test' }">
<p>결과값이 true</p>
<p>파라미터 name값은 'test'</p>
</c:if>
param.name
== request.getParameter("name")
<ul>
<c:choose>
<c:when test="${param.flag==0 }"> <!-- 첫번째 조건 -->
<li>파라미터 flag의 값은 0입니다.</li>
</c:when>
<c:when test="${param.flag==1 }">
<li>파라미터 flag의 값은 1입니다.</li>
</c:when>
<c:when test="${param.flag==2 }">
<li>파라미터 flag의 값은 2입니다.</li>
</c:when>
<c:otherwise> <!-- else와 동일 -->
<li>파라미터 flag의 값을 0,1,2 중에 입력하세요</li>
</c:otherwise>
</c:choose>
</ul>
<c:when>
은 if문. <c:otherwise>
는 else 역할
html 태그와 접합해서 가독성있게 사용할 수 있다
자바의 for문, for-each문의 형태
배열, 컬렉션, 맵 등에 저장되어 있는 값을 순차적으로 처리한다.
기본 형태
<c:forEach var="변수" items="아이템" begin="시작값" end="끝값" step="증가값">
${변수}
</c:forEach>
Iterator, Enumeration, Map의 경우 데이터 저장 순서와 읽는 순서가 일치하지않을 수 있어서 begin, end, step 속성을 잘 사용하지 않음.
<c:forEach var="i" begin="2" end="9">
<p>${i }단</p>
<c:forEach var="j" begin="1" end="9">
${i }X${j }=${i*j }<br>
</c:forEach>
</c:forEach>
<%
String[] sports={"야구", "축구", "스쿼시", "테니스"};
request.setAttribute("sports", sports);
%>
<h2>배열에서 데이터 출력</h2>
<c:forEach var="s" items="${sports }" varStatus="status">
<!-- String s -->
현재 인덱스 값 : ${status.index }<br>
문자열 값 : ${s }<br>
루프 실행 횟수 : ${status.count }<br>
begin 값 : ${status.begin }<br>
end 값 : ${status.end }<br>
step 값 : ${status.step }<br>
</c:forEach>
개발의 우선순위.
멋있어보이는 기능을 먼저 구현하면 안됨.
가장 기본적인 기능 먼저 완성하고 거기에 옷을 입혀야 한다!