JSP Action 태그는 XML 기술을 이용하여 기존의 JSP 문법을 확장하는 메커니즘을 제공하는 태그
웹 브라우저에서 실행되는 것이 아니라, 웹 컨테이너에서 실행되고 결과만 브라우저로 보냄
(JSP의 자바코드처럼)
XML
eXtensible Markup Language의 약자로써 기존 HTML을 확장한 형태의 언어로써 데이터를 교환하기 위한 사용자 정의 태그
태그형태를 이용해서 데이터를 표현한 방식
태그 이름이 key, 태그 사이에 있는 데이터가 value 형식
기존 HTML은 정해진 태그 형태였다면 XML은 데이터를 표현하기 위하여 자유로운 태그형식을 사용하는 방법
ex) <welcome-file>index.html</welcome-file>
-> HTML 태그에는 <welcome-file>
이라는 의미가 가진 태그는 없지만 톰캣에서는 xml 방식을 사용하여
<welcome-file>
이라는 태그 안에 있는 데이터를 가져와서 기본페이지로 활용하도록 시스템을 만들어 놓은것
<%@ include file="파일명" %>
과 쓰임이 동일<%@ include %>
: jsp 파일이 java 파일로 변환될 때 삽입 됨jsp:include
: jsp 파일이 java 파일로 바뀌고 컴파일이 완료 되어 런타임 시에 삽입 됨👨🎓문법 & 예시
<jsp:include page=“파일 명" /> <jsp:include page=“./header.html”/>
👨🎓문법 & 예시
문법 : <jsp:forward page=“파일 명” /> 예시 : <% if( str.equals(“A”)) { %> <jsp:forward page=“./A_Class.jsp”/> <% } else { %> <jsp:forward page=“./B_Class.jsp”/> <% } %>
👨🎓문법 & 예시
문법 : <jsp:useBean id=“객체명” class=“패키지명.클래스명” scope=“범위지정자” /> 예시 : <jsp:useBean id=“m” class=“test.member.model.vo.Member” scope=“request”> <jsp:setProperty name=“m” property=“member_name” value=“김유신”/> <jsp:getProperty name=“m” property=“member_age” /> </jsp:useBean> <jsp:getProperty name=“m” property=“member_id” />
JSP의 기본 객체(4가지)가 제공하는 영역의 속성 사용 가능
집합객체 접근방법 제공
작성 방법 : ${scope.expr}
Member m = new Member(
1,
"mslove",
"1234",
"노땡수",
20,
"mslove@naver.com",
"01012223333",
"경기도 부천시 원미구",
'남',
"등산, 댄스",
new Date(2213112312L),
'N',
"USER"
);
RequestDispatcher view =request.getRequestDispatcher("/views/el/elTest1.jsp");
request.setAttribute("member", m);
view.forward(request, response);
ID : ${requestScope.member.userId }<br>
PW : ${requestScope.member.userPwd }<br>
이름 : ${requestScope.member.userName }<br>
나이 : ${requestScope.member.age }<br>
폰번호 : ${requestScope.member.phone }<br>
주소 : ${member.address }<br>
주소2 : ${member["address"] }<br>
주소3 : ${requestScope["member"]["address"] }<br>
성별 : ${member.gender }<br>
이메일 : ${member.email }<br>
객체 값 : ${member } <br>
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", "user00");
map.put("pw", "9999");
map.put("name", "홍갈동");
HttpSession session = request.getSession();
session.setAttribute("data", map);
response.sendRedirect("/views/el/elTest2.jsp");
ID : ${sessionScope.data.id }<br>
PW : ${sessionScope.data.pw }<br>
이름 : ${sessionScope.data.name }<br>
Member[] m = new Member[2];
m[0]= new Member("mslove11","1234","노땅수",20);
m[1]= new Member("mslove22","2222","노이수",30);
RequestDispatcher view = equest.getRequestDispatcher("/views/el/elTest3.jsp");
request.setAttribute("arr", m);
view.forward(request, response);
<h2>1번째 회원 정보</h2>
ID : ${requestScope.arr[0].userId }<br>
PW : ${requestScope.arr[0].userPwd}<br>
이름 : ${requestScope.arr[0].userName }<br>
나이 : ${requestScope.arr[0].age }<br>
<br>
<h2>2번째 회원 정보</h2>
ID : ${requestScope.arr[1].userId }<br>
PW : ${requestScope.arr[1].userPwd}<br>
이름 : ${requestScope.arr[1].userName }<br>
나이 : ${requestScope.arr[1].age }<br>
ArrayList<Member> list = new ArrayList<Member>();
list.add(new Member("mslove11","1111","노일수",20));
list.add(new Member("mslove22","2222","노이수",30));
list.add(new Member("mslove33","3333","노삼수",40));
RequestDispatcher view = equest.getRequestDispatcher("/views/el/elTest4.jsp");
request.setAttribute("list", list);
view.forward(request, response);
<h2>1번째 회원 정보</h2>
ID : ${list[0].userId }<br>
PW : ${list[0].userPwd }<br>
이름 : ${list[0].userName }<br>
나이 : ${list[0].age }<br>
<h2>2번째 회원 정보</h2>
ID : ${list[1].userId }<br>
PW : ${list[1].userPwd }<br>
이름 : ${list[1].userName }<br>
나이 : ${list[1].age }<br>
<h2>3번째 회원 정보</h2>
ID : ${list[2].getUserId()}<br>
PW : ${list[2].getUserPwd() }<br>
이름 : ${list[2].getUserName() }<br>
나이 : ${list[2].getAge() }<br>
HashMap<String, ArrayList<Member>> map = new HashMap<String, ArrayList<Member>>();
ArrayList<Member> list1 = new ArrayList<Member>();
ArrayList<Member> list2 = new ArrayList<Member>();
list1.add(new Member("mslove11","1111","노일수",10));
list1.add(new Member("mslove22","2222","노이수",20));
list2.add(new Member("mslove33","3333","노삼수",30));
list2.add(new Member("mslove44","4444","노사수",40));
map.put("list1", list1);
map.put("list2", list2);
HttpSession session = request.getSession();
session.setAttribute("data", map);
response.sendRedirect("/views/el/elTest5.jsp");
<h2>1번째 회원정보</h2>
ID : ${sessionScope.data.list1[0].userId }<br>
PW : ${sessionScope.data.list1[0].userPwd }<br>
이름 : ${sessionScope.data.list1[0].userName }<br>
나이 : ${sessionScope.data.list1[0].age }<br>
<h2>2번째 회원정보</h2>
ID : ${sessionScope.data.list1[1].userId }<br>
PW : ${sessionScope.data.list1[1].userPwd }<br>
이름 : ${sessionScope.data.list1[1].userName }<br>
나이 : ${sessionScope.data.list1[1].age }<br>
<h2>3번째 회원정보</h2>
ID : ${sessionScope.data.list2[0].userId }<br>
PW : ${sessionScope.data.list2[0].userPwd }<br>
이름 : ${sessionScope.data.list2[0].userName }<br>
나이 : ${sessionScope.data.list2[0].age }<br>
<h2>4번째 회원정보</h2>
ID : ${sessionScope.data.list2[1].userId }<br>
PW : ${sessionScope.data.list2[1].userPwd }<br>
이름 : ${sessionScope.data.list2[1].userName }<br>
나이 : ${sessionScope.data.list2[1].age }<br>
${2+5 } <br>
${4/5 } <br>
${5 div 6 } <br>
${2 <3 }<br>
${2 gt 3}<br>
${3.1 le 3.2 }<br>
${(5>3) ? 5:3 }<br>
${header["host"] }<br>
${header["user-agent"] }<br>
${header["Cookie"] }<br>
<form action="/views/el/el_param.jsp" method="get">
텍스트 작성 : <input type="text" name="text"><br>
취미 : <br>
<input type="checkbox" name="hobby" value="등산">등산
<input type="checkbox" name="hobby" value="댄스">댄스
<input type="checkbox" name="hobby" value="노래">노래
<input type="submit" value="전송">
</form>
텍스트 : ${param.text }<br>
취미 선택 값 : ${paramValues.hobby[0] },
${paramValues.hobby[1] },
${paramValues.hobby[2] }<br>
<form action="/el/cal.do" method="post">
<input type="text" name="su1">
<select name ="yun">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="su2">
<input type="submit" value="계산하기">
</form>
int su1 = Integer.parseInt(request.getParameter("su1"));
int su2 = Integer.parseInt(request.getParameter("su2"));
char yun = request.getParameter("yun").charAt(0);
String result ="";
switch(yun) {
case '+':result=String.valueOf((su1+su2)); break;
case '-':result=String.valueOf((su1-su2)); break;
case '*':result=String.valueOf((su1*su2)); break;
case '/':result=String.valueOf((su1/(double)su2)); break;
}
RequestDispatcher view = request.getRequestDispatcher("/views/el/cal.jsp");
request.setAttribute("result", result);
view.forward(request, response);
${param.su1 } ${param.yun } ${param.su2 } = ${result }
JSTL을 사용하려면 라이브러리 등록을 해야 함
설정 방법
라이브러리 다운
WebContent/WEB-INF/lib 내에 파일을 등록
jsp 파일에 사용 태그 종류에 맞게 선언
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
페이지 내에서 Database를 연동하고, 필요한 쿼리를 실행할 수 있는 라이브러리
선언 : <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
SQL Tags는 Database를 직접 연동하는 것에는 용이하게 쓸 수 있으나, DataBase 트랜잭션을 별도로 묶어서 관리하는 MVC Model2 방식에는 맞지 않기 때문에 사용 지양
??? | 의미 |
---|---|
set | 변수를 만들어서 값을 저장하는 태그 |
out | 페이지에 값을 출력하는 태그 |
if | 조건문의 if와 비슷, 반드시 test 속성값으로 비교 |
choose | 조건문의 switch문과 비슷, 내부에 <c:when>, <c:otherwise> 태그와 같이 쓰임 |
forEach | 제어문 foreach 문과 비슷, 반복을 수행하는 태그 |
forTokens | StringTokenizer객체와 비슷, token값을 기준으로 문자열을 분할하는 태그 |
url | 변수에 url값과 쿼리스트링 값을 저장하고 호출할 수 있게 하는 태그 |
redirect | 페이지를 재요청하는 태그 |
<c:set> 태그는 변수를 선언하고 나서 그 변수에 초기값을 대입하는 기능의 태그
JSP의 setAttribute와 같은 역할
자바에서 변수를 선언하는 방법과 유사
ex) java 변수 선언 방식
int num = 100;
ex) <c:set> 변수 선언 방식
<c:set var="num" value="100" />
모든 속성의 값 타입은 String형
속성 | 의미 |
---|---|
var="문자" | 값을 저장할 변수명 |
value="값 | 저장할 값 |
target="객체명" | 저장할 객체 대상 |
property="객체멤버변수명" | 저장할 객체의 멤버변수 |
scope="범위" | 범위 (request,session,application) |
<c:set var="num" value="100" />
${num} -> EL 식 안에서 사용 가능
<% int num1=10,num2=20; %>
<c:set var="sum" value="<%= num1+num2 %>" />
${sum}
<c:set var="num1" value="10" scope="page"/>
<!-- scope값이 명시하지 않으면 pageScope -->
<c:set var="num2" value="30" />
<c:set var="num3" value="40" scope="request"/>
<c:set var="num4" value="50" scope="session"/>
num1 : ${pageScope.num1 }<br>
num2 : ${pageScope.num2 }<br>
num3 : ${requestScope.num3 }<br>
num4 : ${sessionScope.num4 }<br>
<c:set>을 이용해서 선언한 변수는 <c:remove> 태그를 이용하여 삭제 할 수 있음
scope를 지정하지 않으면 page,request,session,application 영역에 저장되어 있는 num1이라는 모든 속성을 찾아내 제거 함
속성 | 의미 |
---|---|
value="값" | 출력할 값을 지정하는 속성 (EL도 가능) |
default="값" | 값이 빈값(null)이면 출력될 값을 지정하는 속성 |
escapeXml="false" | 태그형식의 문자를 태그로 출력하게 만드는 속성 (true는 문자 그대로 출력) |
escape
<,>,& 특수 문자를 자동으로 이스케이프 시퀀스로 바꾸어 줌
< : <
> : &ft;
& : &
작성 예시
<!-- 변수 생성 -->
<c:set var="num" value="100" scope="page" />
<!-- 변수값 출력 -->
값 : <c:out value="${pageScope.num }"/><br>
값 : <c:out value="999"/><br>
값 : <c:out value="${pageScope.num2 }" default="값이 없습니다"/>
<hr>
출력 : <c:out value="<h1>헬로우</h1>"/><br/> <!-- 문자 그대로 출력 -->
출력 : <c:out value="<h1>헬로우</h1>" escapeXml="true"/><br/> <!-- 문자 그대로 출력 -->
출력 : <c:out value="<h1>헬로우</h1>" escapeXml="false"/><br/> <!-- HTML 형태로 출력 -->
<c:if> 태그에서 조건식은 test라는 속성의 값으로 지정해야 함
조건식은 반드시 EL 형식으로 기술
작성 예시
<c:if test="${num1>num2}">
num1이 더 큽니다...
</c:if>
속성 | 의미 |
---|---|
test="값"(true/false) | test값을 기준으로 실행여부 결정(조건절) |
var="값" | test결과 값을 저장하는 변수 속성 |
scope="범위" | 범위(request,session,application) |
<form action="./jstl_if.jsp" method="get">
<input type="text" name="value">
<input type="submit" value="전송">
</form>
<h1>EL+JSTL 제어문 결과</h1>
<c:if test="${param.value%2==0 }" var="result1">
<c:out value="짝수입니다."/><br>
</c:if>
<c:if test="${param.value%2==1 }" var="result2">
<c:out value="홀수입니다."/><br>
</c:if>
<c:out value="첫번째 조건에 대한 결과값 : ${result1 }"/><br>
<c:out value="두번째 조건에 대한 결과값 : ${result2 }"/><br>
<form action ="./jstl_choose.jsp" method="get">
<select name="car">
<option value="K3">K3</option>
<option value="K5">K5</option>
<option value="G">Genesis</option>
<option value="V">벤츠</option>
</select>
<input type="submit" value="전송">
</form>
<c:choose>
<c:when test="${param.car.equals('K3') }">
K3의 자동차 금액은 3,000만원 이하입니다.<br>
</c:when>
<c:when test="${param.car.equals('K5') }">
K5의 자동차 금액은 4,000만원 이하입니다.<br>
</c:when>
<c:otherwise>
비싼차<br>
</c:otherwise>
</c:choose>
자바의 for, for-in 문에 해당하는 기능을 제공함
속성 | 의미 |
---|---|
items | 반복할 객체 명(Collection 객체) |
begin | 반복이 시작할 요소 번호 (0...n) / 시작값은 0 |
end | 반복문의 종료값 |
step | 반복문의 증가값 |
var | 현재 반복 횟수에 해당하는 변수의 이름 |
varStatus | 반복 상태 값을 지닌 변수 / varStatus는 forEach의 상태를 알 수 있음 |
ArrayList<Member> list = new ArrayList<Member>();
list.add(new Member("mslove","1234","노땡수",20));
list.add(new Member("user11","2222","홍일동",11));
list.add(new Member("user22","3333","홍이동",22));
list.add(new Member("user33","4444","홍삼동",33));
RequestDispatcher view = request.getRequestDispatcher("/views/JSTL/jstl_forEach.jsp");
request.setAttribute("list", list);
view.forward(request, response);
<table border='1px'>
<tr>
<th>순번</th>
<th>회원 ID</th>
<th>회원 비밀번호</th>
<th>회원 이름</th>
<th>회원 나이</th>
</tr>
<c:forEach items="${requestScope.list }" var="m" varStatus="i">
<c:choose>
<c:when test="${i.first }">
<tr style="background-color: skyblue;">
</c:when>
<c:when test="${i.last }">
<tr style="background-color: grey;">
</c:when>
<c:otherwise>
<tr>
</c:otherwise>
</c:choose>
<td><c:out value="${i.count }"></c:out>
<td><c:out value="${m.userId }"></c:out></td>
<td><c:out value="${m.userPwd }"></c:out></td>
<td><c:out value="${m.userName }"></c:out></td>
<td><c:out value="${m.age }"></c:out></td>
</tr>
</c:forEach>
</table>
문자열에 포함된 구분자를 통해 토큰을 분리해서 반복 처리를 함
items 속성에는 토큰을 포함하는 문자열 지정하고, delims 속성에는 토큰을 분리하는데 사용할 구획 문자를 기술 함
속성은 forEach문의 속성과 동일하게 이용할 수 있고 delims 속성이 추가 됨
<h1>취미 작성해서 보내기 (구분자는 콤마(,)로 표현해주세요) ex. 댄스, 노래</h1>
<form action="./jstl_forTokens.jsp" method="get">
<input type="text" name="hobby" placeholder="취미를 작성하세요(구분자는 , )" size='30'>
<input type="submit" value="전송">
</form>
<c:forTokens items="${param.hobby }" delims=", " var="h" varStatus="i">
${i.count}. ${h}<br>
</c:forTokens>
url 경로를 생성하고, 해당 url의 param 속성을 선언하여 쿼리스트링을 정의할 수 있는 태그
해당 태그를 통해 url 경로와 관련 쿼리스트링의 값을 미리 설정하여 이를 제어할 수 있음
<c:url var="url" value="/board/boardList.do">
<c:param name="currentPage">${requestScope.currentPage }</c:param>
<c:param name="boardNo">${requestScope.boardNo }</c:param>
</c:url>
<a href="${url }">목록</a><br>