JSP & Servlet :: EL과 JSTL 실습
# Test3.jsp
- 기존 데이터 수신 방식과 EL 활용한 데이터 수신 방식 비교
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* setAttribute() 로 넘긴 데이터 수신 실습을 위한 코드 추가 */
request.setAttribute("result", "EL 테스트 및 관찰");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test3.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>EL 관련 실습</h1>
<hr>
</div>
<div>
<form method="post">
정수1 <input type="text" name="su1" class="txt" /><br>
정수2 <input type="text" name="su2" class="txt" /><br>
<br>
<button type="submit" class="bnt">결과 확인</button>
</form>
</div>
<div>
<h2>폼 데이터 수신</h2>
[폼의 데이터를 수신하는 방법 1]
<h3><%=request.getParameter("su1") %></h3>
[폼의 데이터를 수신하는 방법 2]
<h3>${param.su2 }</h3>
</div>
<br><br>
<div>
<h2>폼의 데이터를 받아 연산 수행</h2>
[폼의 데이터를 받아 연산을 수행하는 방법 1]
<%
String s1 = request.getParameter("su1");
String s2 = request.getParameter("su2");
int s=0;
if(s1!=null && s2!=null)
{
s = Integer.parseInt(s1) + Integer.parseInt(s2);
}
%>
<h3>합 : <%=s %></h3>
[폼의 데이터를 받아 연산을 수행하는 방법 2]
<h3>합 : ${param.su1 + param.su2 }</h3>
</div>
<br><br>
<div>
<h2>setAttribute() 로 넘긴 데이터 수신</h2>
[setAttribute() 로 넘긴 데이터를 수신하는 방법1]
<h3><%=(String)request.getAttribute("result") %></h3>
[setAttribute() 로 넘긴 데이터를 수신하는 방법2]
<h3>${result }</h3>
</div>
</body>
</html>
➰체크할 내용➰
1. form 태그 action 속성 생략
- 전송하는 데이터의 수신처는 자기 자신!
2. EL 로 데이터 수신
- 받아오는 값이 없을 경우(초기화면일 경우)에는 null를 나타내지 않는다. 아무것도 보여주지 않음!!
수신할 값이 있을 경우에만 값을 출력해준다!
- param."name" 이렇게 하면 파라미터 수신 알아서!
- request.getParameter("name") 방식으로 수신하면 문자열로 불러와지니까 형 변환 해줘야 하는데
EL 은 필요한 캐스팅도 알아서 자동으로 수행
완전 굳굳👍
# JSTL 코어(Core) if문 실습 - Test4.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test4.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) if문 실습</h1>
<hr>
</div>
<div>
<form method="post">
정수
<input type="text" name="su" class="txt"/>
<br><br>
<button type="submit" class="btn">결과 확인</button>
</form>
</div>
<br><br>
<div>
<c:if test="${!empty param.su }">
<c:if test="${param.su % 2 == 0 }">
<h2>${param.su } : 짝수</h2>
</c:if>
<c:if test="${param.su % 2 != 0 }">
<h2>${param.su } : 홀수</h2>
</c:if>
</c:if>
</div>
</body>
</html>
➰체크할 내용➰
1. JSTL Core if문
- test="" : 조건식 지정
- JSTL Core if에는 if는 있지만 else는 없다!!
# JSTL 코어(Core) 반복문 실습 - Test5.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test5.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) forEach문 실습</h1>
<hr>
</div>
<div>
<table class="table">
<!-- JSTL 코어(Core) 반복문 -->
<c:forEach var="a" begin="1" end="9" step="1">
<tr>
<c:forEach var="b" begin="1" end="9" step="1">
<td style="width: 20px;">
${a*b }
</td>
</c:forEach>
</c:forEach>
</table>
</div>
</body>
</html>
➰체크할 내용➰
1. JSTL Core 반복문
- <c:forEach var="변수" begin="시작값" end="끝값" step="증가값"> </c:forEach>
# JSTL 코어(Core) 반복문 실습 - Test6.jsp
<%@page import="com.test.MyData"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
// Test6.jsp
//-- 사용자 정의 데이터타입을 취하는 자료구조 생성
List<MyData> lists = new ArrayList<MyData>();
MyData ob = new MyData("홍길동", 15);
lists.add(ob);
ob = new MyData("둘리", 23);
lists.add(ob);
ob = new MyData("도우너", 24);
lists.add(ob);
ob = new MyData("또치", 16);
lists.add(ob);
ob = new MyData("고길동", 8);
lists.add(ob);
ob = new MyData("희동이", 17);
lists.add(ob);
request.setAttribute("lists", lists);
%>
<jsp:forward page="Test6_result.jsp"></jsp:forward>
# MyData.java
package com.test;
public class MyData
{
// 주요 속성 구성
private String name;
private int age;
// default 생성자 형태의 사용자 정의 생성자 // 아래 생성자 정의하면 디폴트 생성자 생성 안되니까 정의함.
public MyData()
{
}
// 매개변수 2개 사용자 정의 생성자
public MyData(String name, int age)
{
this.name = name;
this.age = age;
}
// getter / setter 구성
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
# JSTL 코어(Core) set문 실습 - Test7.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test7.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) set문 실습</h1>
<h2>지수승 구하기</h2>
<hr>
</div>
<div>
<!-- 수신처는 자기 자신~!!! -->
<form method="post">
정수1
<input type="text" name="su1" class="txt" /><br>
정수2
<input type="text" name="su2" class="txt" /><br><br>
<button type="submit" class="btn">결과 확인</button>
</form>
</div>
<div>
<c:if test="${!empty param.su1 }">
<c:set var="result" value="1"></c:set>
<c:forEach var="a" begin="1" end="${param.su2 }" step="1">
<c:set var="result" value="${result * param.su1 }"></c:set>
<p>${param.su1 } ^ ${a } = ${result }</p>
</c:forEach>
</c:if>
</div>
</body>
</html>
➰체크할 내용➰
1. <c:set>
- JSP 의 setAttribute() 와 같은 역할을 수행한다.
- page / request / session / application : 범위의 변수(속성)을 설정한다. (scope 속성이 생략될 경우 기본 값은 page)
2. <c:remove>
- JSP 의 removeAttribute() 와 같은 역할을 수행한다.
- page / request / session / application : 범위의 변수(속성)을 제거한다. (scope 속성이 생략될 경우 기본 값은 page)
3. <c:set var="변수" value="값"></c:set>
- 변수의 값을 지정(set)하는 구문
- 해당 스코프에 지정된 변수가 존재하지 않을 경우 : 변수를 새로 선언하여 초기화 하는 기능 수행
- 해당 스코프에 이미 지정된 변수가 존재하는 경우 : 그 변수의 값을 다시 초기화하는(덮어쓰기) 효과 적용
# JSTL 코어(Core) 를 활용한 구구단 출력 - Gugudan.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gugudan.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSP 코어(Core)를 활용한 구구단 출력</h1>
<hr>
</div>
<div>
<form method="post">
원하는 단 입력
<input type="text" name="dan" class="txt"/>
<br><br>
<button type="submit" class="btn">결과 확인</button>
</form>
</div>
<div>
<c:if test="${!empty param.dan }">
<h2>📜${param.dan }단의 구구단 출력 결과 확인</h2>
<c:set var="result" value="1"></c:set>
<c:forEach var="n" begin="1" end="9" step="1">
<c:set var="result" value = "${param.dan *n}"></c:set>
<p>${param.dan } * ${n } = ${result }</p>
</c:forEach>
</c:if>
</div>
<div>
<%-- 다른 방법으로 풀어본 것~! --%>
<c:if test="${!empty param.dan }">
<c:forEach var="n" begin="1" end="9" step="1">
<p>${param.dan } * ${n } = ${param.dan * n }</p>
</c:forEach>
</c:if>
</div>
</body>
</html>
# JSTL 코어(Core) choose문 실습 - Test8.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test8.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) choose문 실습</h1>
<h2>배수 확인하기</h2>
<hr>
</div>
<div>
<form action="" method="post">
정수
<input type="text" name="su" class="txt">
<br><br>
<button type="submit" class="btn">결과 확인</button>
</form>
</div>
<br>
<div>
<c:if test="${!empty param.su }">
<c:choose>
<c:when test="${param.su % 12 == 0 }">
<p>${param.su }은(는) 3과 4의 배수</p>
</c:when>
<c:when test="${param.su % 3 == 0 }">
<p>${param.su }은(는) 3의 배수</p>
</c:when>
<c:when test="${param.su % 4 ==0 }">
<p>${param.su }은(는) 4의 배수</p>
</c:when>
<c:otherwise>
<p>${param.su }은(는) 3 또는 4의 배수가 아님!</p>
</c:otherwise>
</c:choose>
</c:if>
</div>
</body>
</html>
➰체크할 내용➰
1. <c:choose></c:choose> <c:otherwise></c:otherwise>
- JSTL Core 에서 if ~ else 를 대신하여 사용할 수 있는 구문
# JSTL 코어(Core) import문 실습 - Test9.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test9.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) import문 실습</h1>
<hr>
</div>
<!-- 변수 지정 -->
<c:set var="url" value="Gugudan.jsp"></c:set>
<!-- import 를 수행 -->
<c:import url="${url }" var="impt">
<%-- import 를 수행하며 해당 페이지가 필요로하는 파라미터 넘기기 --%>
<c:param name="dan" value="5"></c:param>
</c:import>
<!-- 결과 화면 출력 -->
<c:out value="${impt }"></c:out>
<!-- 결과 화면 출력 과정에서 HTML 코드를 그대로 출력하도록 처리하는 구문 -->
<!-- 『escapeXml』 속성의 기본값(default)은 true 로 설정되어 있다. -->
<br><br>
<!-- 결과 화면 출력 -->
<c:out value="${impt }" escapeXml="false"></c:out>
</body>
</html>
➰체크할 내용➰
1. <c:import>
- URL 처리에 관여, URL 을 활용하여 다른 자원의 결과를 삽입할 때 사용한다.
2. escapeXml="true / false"
- true : 결과 화면 출력 과정에서 HTML 코드를 그대로 출력하도록 처리, 속성을 지정하지 않을 경우 기본값은 true
- false : HTML 코드가 적용된 화면을 출력
# JSTL 코어(Core) 를 활용한 실습 - 5명의 데이터 입력
# MemberInsertForm.jsp - 사용자가 만나는 페이지(입력 폼)
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
String nameStr = request.getParameter("name");
String telStr = request.getParameter("tel");
String addrStr = request.getParameter("addr");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MemberInsertForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h2>JSTL 코어(Core)를 활용한 회원 정보 입력</h2>
<hr>
</div>
<div>
<form action="MemberInsert.jsp" method="post">
<!-- (이름, 전화번호, 주소) * 5명 분 -->
<!-- → submit 액션 처리 -->
<table class="table">
<tr>
<th>이름</th><th>전화번호</th><th>주소</th>
</tr>
<tr>
<td>
<c:forEach var="a" begin="1" end="5" step="1">
<input type="text" name="name${a }"/>
</c:forEach>
</td>
<td>
<c:set var="i" value="1"></c:set>
<c:forEach var="a" begin="1" end="5" step="1">
<input type="text" name="tel${i}"/>
<c:set var="i" value="${i+1 }"></c:set>
</c:forEach>
</td>
<td>
<c:forEach var="a" begin="1" end="5" step="1">
<input type="text" name="addr${a }"/>
</c:forEach>
</td>
</tr>
<tr>
<td colspan="3">
<button type="submit" class='btn' style="width: 100%">입력</button>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
# MemberInsert.jsp - 데이터 받아와서 MemberList.jsp로 넘겨주는 페이지
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.test.MemberDTO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
// MemberInsert.jsp
// 5명 분 데이터 수신 → 객체 구성 → 자료구조 구성 → setAttribute()
// MemberDTO
// → MemberList.jsp 에서 출력
List<MemberDTO> lists = new ArrayList<MemberDTO>();
for (int i=1; i<=5; i++)
{
MemberDTO ob = new MemberDTO( request.getParameter("name"+i)
, request.getParameter("tel"+i)
, request.getParameter("addr"+i));
lists.add(ob);
}
request.setAttribute("lists", lists);
//RequestDispatcher 써도 되구~
%>
<jsp:forward page="MemberList.jsp"></jsp:forward>
# MemberList.jsp - 넘겨받은 데이터 출력하는 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>JSTL 코어(Core) 문제 해결</h1>
<h2>회원 명단 출력</h2>
<hr>
</div>
<div>
<!-- 5명의 이름, 전화번호, 주소 출력 -->
<table class="table">
<tr>
<th>이름</th>
<th>전화번호</th>
<th>주소</th>
</tr>
<c:forEach var="dto" items="${lists }" >
<tr>
<td style="text-align: center;">${dto.name }</td>
<td style="text-align: center;">${dto.tel }</td>
<td style="text-align: center;">${dto.addr }</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>