2023.04.03 47일차 JSP
11 표현언어
11.1 표현언어(EL) - 1
EL언어는 attribute로 넣어진 값이라면 다꺼낼수 있다.
<%
pageContext.setAttribute("attr1", "value1");
request.setAttribute("attr2", "value2");
session.setAttribute("attr3", "value3");
application.setAttribute("attr4", "value4");
%>
<p>
\${attributeName} : $ {attr1}
\${attributeName} : $ {attr2}
\${attributeName} : $ {attr3}
\${attributeName} : $ {attr4}
</p>11.2 EL - 2
같은 이름의 attribute가 다른 영역에 있는 경우의 처리 방법은 좁은 영역의 부터 찾는다.
이름을 다 같게해서 attribute에 서로 다른 값을 넣어서 EL을 사용해보자.
<%
pageContext.setAttribute("myAttr1", "page value1");
request.setAttribute("myAttr1", "request value1");
session.setAttribute("myAttr1", "session value1");
application.setAttribute("myAttr1", "application value1");
%>
<p>\${myAttr1} : ${myAttr1}</p> <!-- page value1 -->11.3 EL SCOPE 연습
어떤 attribute가 나올지 예측해보자.
<%
pageContext.setAttribute("myAttr2", "page value1");
request.setAttribute("myAttr2", "request value1");
session.setAttribute("myAttr3", "session value1");
request.setAttribute("myAttr3", "request value2");
session.setAttribute("myAttr4", "session value2");
application.setAttribute("myAttr4", "application value2");
pageContext.setAttribute("myAttr5", "page value2");
application.setAttribute("myAttr5", "application value3");
%>
<p>\${myAttr2} : ${myAttr2} </p> <!-- page value1 -->
<p>\${myAttr3} : ${myAttr3} </p> <!-- request value2 -->
<p>\${myAttr4} : ${myAttr4} </p> <!-- session value2 -->
<p>\${myAttr5} : ${myAttr5} </p> <!-- page value2 -->11.4 javaBean
javaBean 객체의 값을 EL로 출력해보자
thread safe한 것은 request와 pagecontext이다.
public class Bean04 {
private String name;
private String address;
private int age;
private boolean married;
//getter setter
}EL을 배우기전에는 request.getAttribute를하고 Object객체이니 형변환을 사용해서 출력했었다.
<%
//EL배우기전
Bean04 b1 = (Bean04) request.getAttribute("player1");
%>
<p><%=b1.getName() %></p>
<p><%=b1.getAddress() %></p>
<p><%=b1.getAge() %></p>
<p><%=b1.isMarried() %></p>EL을 사용하면 그냥 저장한 attribute의 내용을 출력할 수 있다.
bean그 자체를 출력하면 이미 정의해둔 toString의 결과가 나오게 된다.
위험한 형변환을 사용하지 않아도되고 import도 하지 않아도되서 코드량을 줄일 수 있다.
만약 저장한 값이 bean객체라면 bean.프로퍼티명으로 이 객체의 프로퍼티를 사용할 수 있다.
<%
Bean04 o2 = new Bean04();
o2.setName("백호");
o2.setAddress("busan");
o2.setAge(30);
o2.setMarried(false);
request.setAttribute("player2", o2);
%>
<jsp:include page="04javaBeanSub.jsp"></jsp:include><div>
<p>${player2}</p>
<p>${player2.name}</p> <%-- player2.getName() --%>
<p>${player2.address}</p> <%-- player2.getAddress() --%>
<p>${player2.age}</p> <%-- player2.getAge() --%>
<p>${player2.married}</p> <%-- player2.isMarried() --%>
</div>11.5 javaBean 연습 - 2
5번에서 foward요청 보냇을때 송태섭 / 20 / 제주도 / true나오게 해보자.
attribute도 속성 property도 속성으로 번역되어 있어서 헷갈릴 수 있으니 주의하자.
<!-- 5번으로 요청 보냇을때 -->
<h1>6번 파일</h1>
<p>이름 : ${player.name}</p> <!-- 송태섭 -->
<p>나이 : ${player.age}</p> <!-- 20 -->
<p>주소 : ${player.address}</p> <!-- 제주도 -->
<p>결혼 : ${player.married}</p> <!-- true --><%
Bean04 o3 = new Bean04();
o3.setName("송태섭");
o3.setAge(20);
o3.setAddress("제주도");
o3.setMarried(true);
request.setAttribute("player", o3);
%>
<jsp:forward page="06javaBeanSub.jsp"></jsp:forward>11.6 property
attribute명["프로퍼티이름"]으로 값을 출력할 수도 있다.
[]안에 String으로 넣어줘야한다. ''안에 넣어도 된다.
자주 사용하는 것은 아니지만 가끔 씩 사용된다.
<%
Bean04 o1 = new Bean04();
o1.setAddress("서울");
o1.setName("이한나");
o1.setAge(30);
o1.setMarried(false);
pageContext.setAttribute("person", o1);
%>
<p>\${person.name} : ${person.name}</p>
<p>\${person["name"]} : ${person["name"]}</p>
<p>\${person['name']} : ${person['name']}</p>
<p>\${person.age} : ${person.age}</p>
<p>\${person["age"]} : ${person["age"]}</p>
<p>\${person['age']} : ${person['age']}</p>
<p>\${person.address} : ${person.address}</p>
<p>\${person["address"]} : ${person["address"]}</p>
<p>\${person['address']} : ${person['address']}</p>
<p>\${person.married} : ${person.married}</p>
<p>\${person["married"]} : ${person["married"]}</p>
<p>\${person['married']} : ${person['married']}</p>11.7 property - 2
""으로 감싸지 않는다면
attribute가 가진 값으로 객체 attribute의 property 찾아서 출력하는 것이다.
차이를 잘 구분해서 사용할 필요가 있다.
attribute이름에 프로퍼티명을 저장한 것이라고 생각하면된다.
o1의 name이라는 프로퍼티에 정대만이 들어가잇고 그것을 name이라는 attribute에 저장한 것이다.
<%
Bean04 o1 = new Bean04();
o1.setName("정대만");
o1.setAddress("인천");
o1.setAge(40);
o1.setMarried(false);
pageContext.setAttribute("p1", o1);
pageContext.setAttribute("name", "name");
pageContext.setAttribute("myattr1", "name");
%>
<!-- p1 attribute의 name property 출력 -->
<p>\${p1["name"]} : ${p1["name"]}</p>
<!-- name attribute가 가진 값으로 p1 attribute의 property 찾아서 출력 -->
<p>\${p1[name]} : ${p1[name]}</p>
<p>\${p1[myattr1]} : ${p1[myattr1]}</p>11.8 Array
지금까지는 javabean이 attribute인 경우이다.
Collection계열이 attribute인 경우를 알아보자.
배열의 경우 attribut명[인덱스]의 값으로 출력할 수 있다.
<h1> attribute가 list(array)이면 </h1>
<%
String[] arr1 = {"java", "jsp", "spring", "css"};
pageContext.setAttribute("mylist", arr1);
%>
<p>/${mylist[0]} : ${mylist[0]}</p>
<p>/${mylist[1]} : ${mylist[1]}</p>
<p>/${mylist[2]} : ${mylist[2]}</p>
<p>/${mylist[3]} : ${mylist[3]}</p>11.9 Array - 2 연습
각 배열의 값을 출력해보자.
<h1>attribute가 list(array)이면 2 </h1>
<%
pageContext.setAttribute("list1", new String[] { "hello", "hola" });
pageContext.setAttribute("list2", new String[] { "태웅", "백호" });
%>
<p> ${list2[0]} </p> <!-- 백호 -->
<p> ${list2[1]} </p> <!-- 태웅 -->
<p> ${list1[1]} </p> <!-- hola -->
<p> ${list1[0]} </p> <!-- hello -->11.10 list
list의 값을 EL로 출력해보기
array의 값을 출력하듯이 attribut명[인덱스]의 값으로 출력할 수 있다.
인덱스의 값을 integer가 아니라 integer로변환가능한 string형식으로 넣어도 출력된다.
Java의 문법이 아니라 EL의 문법이다.
-> EL에서 연산할때 "3" + 4 하면 7이되는데 그런 것을 응용한 것 같다.
<%
List<String> list1 = List.of("치수", "대만", "태섭", "태웅");
pageContext.setAttribute("players", list1);
%>
<p> ${players[0]} </p>
<p> ${players[1]} </p>
<p> ${players[2]} </p>
<p> ${players[0]} </p>
<hr />
<p> ${players["0"]} </p>
<p> ${players["1"]} </p>
<p> ${players["2"]} </p>
<p> ${players["0"]} </p>11.11 list 응용
결론적으로 EL의 변수명은 attribute를 찾는다.
인덱스의 값도 attribute를 넣을 수 있다.
<%
List<String> list = List.of("java", "css", "spring");
pageContext.setAttribute("langs", list);
pageContext.setAttribute("zero", "0");
pageContext.setAttribute("one", 1);
%>
<p> ${langs[0]} </p> <!-- java -->
<p> ${langs[zero]} </p> <!-- zero라는 attribute -->
<p> ${langs[one]} </p>11.12 list 연습
각 EL의 값을 예상해보자.
<%
List<String> list1 = List.of("css", "html", "jquery", "bootstrap");
pageContext.setAttribute("num1", 0);
pageContext.setAttribute("num2", 2);
pageContext.setAttribute("myList1", list1);
%>
<p> ${myList1[num1]} </p> <!-- myList1[0] = css -->
<p> ${myList1[num2]} </p> <!-- myList1[2] = jquery -->
<p> ${myList1[3]} </p> <!-- bootstrap -->11.13 list의 전체 탐색
for문을 돌면서 i를 attribute로 넣어줘야한다.
EL이 자바변수를 찾는 것이아니라 attribute값을 찾기 때문에 잘 작성해줘야한다.
EL이 attribute값을 찾는 것을 잘 인지해두자.
그냥 ${players[i]}을 넣으면 i attribute를 찾으니 for문의 i값이 들어가는게 아니다.
<%
List<String> list = List.of("태웅", "백호", "태섭", "대만", "치수");
pageContext.setAttribute("players", list);
for (int i = 0 ; i < list.size() ; i++){
pageContext.setAttribute("i", i);
%>
<p>${players[i]}</p>
<%
}
%>11.14 list + javabean
javabean이 list원소일때 list원소[인덱스].프로퍼티명으로 하면된다.
자바 프로그램을 짤때 객체를 담은 리스트의 값을 꺼내와서
메소드를 사용하듯이 프로퍼티명을 사용하는 개념이라고 볼 수 있다.
<%
List<Bean04> list = new ArrayList<>();
Bean04 b1 = new Bean04();
b1.setName("이한나");
Bean04 b2 = new Bean04();
b2.setName("채소연");
list.add(b1);
list.add(b2);
pageContext.setAttribute("people", list);
%>
<p>${people[0].name }</p>
<p>${people[1].name }</p>11.14 list + javabean 연습
b1, b2 setProperty하고 page영역에 list를 attribute로 추가한다음
채소연 / 서울 이한나 / 부산이 출력되는 예제를 작성해보자.
<%
Bean04 b1 = new Bean04();
Bean04 b2 = new Bean04();
b1.setName("채소연");
b1.setAddress("서울");
b2.setName("이한나");
b2.setAddress("부산");
List<Bean04> list = List.of(b1, b2);
pageContext.setAttribute("managers", list);
%>
<p>${managers[0].name}</p> <!-- 채소연 -->
<p>${managers[1].name}</p> <!-- 이한나 -->
<p>${managers[0].address}</p> <!-- 서울 -->
<p>${managers[1].address}</p> <!-- 부산 -->11.15 list + javabean -2
javabean 필드가 list일때 list중첩사용하기
<%
Bean05 o1 = new Bean05();
Bean05 o2 = new Bean05();
o1.setName("강백호");
o1.setItems(List.of("농구화", "농구공"));
o2.setName("이한나");
o2.setItems(List.of("클립보드", "볼펜"));
List<Bean05> list = List.of(o1,o2);
pageContext.setAttribute("people", list);
%>
<p>${person[0].name}</p> <!-- 강백호 -->
<p>${person[0].items[0]}</p> <!-- 농구화 -->
<p>${person[0].items[1]}</p> <!-- 농구공 -->
<p>${person[1].name}</p> <!-- 이한나 -->
<p>${person[1].items[0]}</p> <!-- 클립보드 -->
<p>${person[1].items[1]}</p> <!-- 볼펜 -->11.16 list + javabean 연습
Bean05와 list를 사용해서 property와 attribute를 추가하는 코드 작성해보자
list안의 list를 꺼내고 그안의 객체의 프로퍼티를 보는 방법을 잘 생각해야한다.
인덱스를 어떻게 설정할지를 잘 보면 된다.
<%
//Bean05와 list를 사용해서
//property와 attribute를 추가하는 코드 작성
Bean05 b1 = new Bean05();
b1.setItems(List.of("java", "jsp"));
Bean05 b2 = new Bean05();
b2.setItems(List.of("spring", "bootstrap"));
List<Bean05> list1 = new ArrayList<>();
list1.add(b1);
list1.add(b2);
pageContext.setAttribute("list1", list1);
%>
<p>${list1[0].items[0]}</p> <!-- java -->
<p>${list1[1].items[0]}</p> <!-- spring -->
<p>${list1[0].items[1]}</p> <!-- jsp -->
<p>${list1[1].items[1]}</p> <!-- bootstrap -->11.17 map
EL에 표기할 데이터가 map일때 사용하는 방법에 대해서 알아보자.
bean과 매우유사하다. bean은 property에서 값을 꺼냈는데 map은 key값으로 값을 꺼낸다.
<%
Map<String, String> m = new HashMap<>();
m.put("key1","value1");
m.put("key2", "value1");
pageContext.setAttribute("map1", m);
%>
<p>${map1.key1}</p>
<p>${map1.key2}</p>
<p>${map1["key1"]}</p>
<p>${map1["key2"]}</p>11.18 map 연습
예시처럼 출력되도록 코드를 작성해보자
<%
//map을 만들고 attribute(page영역)추가
Map<String, String> map = new HashMap<>();
map.put("myKey1", "java");
map.put("myKey2", "spring");
map.put("name", "서태웅");
map.put("address", "신촌");
pageContext.setAttribute("mymap", map);
%>
<p>${mymap.myKey1}</p> <!-- java -->
<p>${mymap.myKey2}</p> <!-- spring -->
<p>${mymap.name}</p> <!-- 서태웅 -->
<p>${mymap["address"]}</p> <!-- 신촌 -->11.19 map - 2
map에서 꼭 []표기방법을 사용해야하는 경우가 있다.
키의 값에 띄어쓰기가 포함되어 있거나 숫자로 시작하는 등의 경우에 []를 사용해야한다.
변수명으로 사용할 수 없는 키가 있다면 []연산자를 이용해야한다.
<%
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key 2", "value2");
pageContext.setAttribute("mymap", map);
%>
<p>${mymap.key1}</p>
<p>${mymap["key1"]}</p>
<p>${mymap["key 2"]}</p>
<%-- <p>${mymap.key 2}</p> --%>
<p>${mymap["3key"]}</p>
<%-- <p>${mymap.3key}</p> --%>11.20 map 연습
map에 bean 객체를 담아서 꺼내보자.
<%
Bean04 b1 = new Bean04();
Bean04 b2 = new Bean04();
b1.setName("강백호");
b2.setName("이한나");
b1.setAddress("신촌");
b2.setAddress("강남");
Map<String, Bean04> map = new HashMap<>();
map.put("player", b1);
map.put("manager", b2);
pageContext.setAttribute("member", map);
%>
<p>${member.player.name}</p> <!-- 강백호 -->
<p>${member.manager.name}</p> <!-- 이한나 -->
<p>${member.player.address}</p> <!-- 신촌 -->
<p>${member.manager.address}</p> <!-- 강남 -->11.21 map 연습 - 2
Bean03의 프로퍼티 fullName을 출력해보자.
getFullName으로 정의되어 있어서 프로퍼티로 출력할 수 있다.
<%
//<String, Bean03>을 엔트리로 갖는 map만들어서 attribute(page영역) 추가
Bean03 b1 = new Bean03();
b1.setFirstName("son");
b1.setLastName("heunmin");
Bean03 b2 = new Bean03();
b2.setFirstName("park");
b2.setLastName("jisung");
Map<String, Bean03> map = new HashMap<>();
map.put("person1", b1);
map.put("person2", b2);
pageContext.setAttribute("people", map);
%>
<p>${people.person1.fullName}</p> <!-- son heunmin -->
<p>${people.person2.fullName}</p> <!-- park jisung -->11.21 EL object
EL에는 11개의 기본객체가 존재한다. 책 254쪽 표에 있다.
pageContext | 가끔사용 *
pageScope | 가끔사용 *
requestScope | 가끔사용 *
sessionScope | 가끔사용 *
applicationScope | 가끔사용 *
param | 자주사용 *****
paramValues | 자주사용 ****
header | 거의 사용 x
headerValues | 거의 사용 x
cookie | 거의 사용 x
initParam | 거의 사용 x
pageContext을 제외하고 전부 Map이다. 그래서 이전에 배운 Map사용방법 처럼 사용하면된다.
${}하면 attribute에서 찾아가는데 attribute에서 찾지 않고 기본객체에서 찾을 수 있다.
11.22 EL Param
요청파라미터의 <파라미터, 값> 매핑을 저장한 Map객체이다.
파라미터 값 타입은 String이며 request.getParameter(이름)의 결과와 동일하다.
<h1>param</h1>
<p>request parameter 를 맵 타입으로 저장하고 있음</p>
<hr />
<!-- ?name=jisung&age=40&address=seoul -->
<p> <%= request.getParameter("name") %></p> <!-- jisung -->
<p> <%= request.getParameter("age") %></p> <!-- 40 -->
<p> <%= request.getParameter("address") %></p> <!-- seoul -->
<hr />
<p>${param.name}</p> <!-- jisung -->
<p>${param.age}</p> <!-- 40 -->
<p>${param.address}</p> <!-- seoul -->11.23 EL Param - 2
다음 jsp로 요청할때 필요한 쿼리스트링을 완성해보자
?food=pizza&fruit=apple&song=cookie&sport=soccer&position=center
<h1>3번파일</h1>
<p>${param.food}</p> <!-- pizza -->
<p>${param.fruit}</p> <!-- apple -->
<p>${param.song}</p> <!-- cookie -->
<p>${param.sport}</p> <!-- soccer -->
<p>${param.position}</p> <!-- center -->11.24 EL Param - 3
쿼리스트링을 직접 작성할일이 없다.
form을 통해서 받아서 출력해보는 코드를 작성해보자
파라미터가 param이라는 맵에 담긴것을 꺼내서 사용하는 것이다.
<h1> 4번파일 </h1>
<form action="05paramProcess.jsp">
<!-- div*3>input^input:s -->
<div>
<input type="text" name="name" value="손흥민"/>
</div>
<div>
<input type="text" name="address" value="런던"/>
</div>
<div>
<input type="text" name="age" value="30"/>
</div>
<input type="submit" value="전송" />
</form><h1>5번파일</h1>
<p>이름 : ${param.name}</p>
<p>주소 : ${param.address}</p>
<p>나이 : ${param.age}</p>11.25 EL Param 연습
EL에 맞춰서 값을 넣는 폼을 작성해보자.
테이블에 넣어서 만들어 보았다.
<h1>7번 파일</h1>
<p>음식 : ${param.food}</p>
<p>운동 : ${param.sport}</p>
<p>취미 : ${param.hobby}</p><div align="center">
<form action="07paramProcess.jsp">
<table border="1">
<tr height="40">
<td width="150" align="center">음식</td>
<td width="250">
<input type="text" name="food"/>
</td>
</tr>
<tr height="40">
<td width="150" align="center">운동</td>
<td width="250">
<input type="text" name="sport"/>
</td>
</tr>
<tr height="40">
<td width="150" align="center">취미</td>
<td width="250">
<input type="text" name="hobby"/>
</td>
</tr>
<tr height="40">
<td colspan="2" align="center">
<input type="submit" value="전송" />
</td>
</tr>
</table>
</form>
</div>11.26 EL Param - 4
request가 파라미터가 아니라 post요청이면 폼데이터로 넘어갈 수 있다.
그래도 똑같이 Param에 들어간다.
<h1> 8번 파일</h1>
<form action="09formProcess.jsp" method="post">
<!-- (input[name][value]+br)*3+input:s -->
<input type="text" name="address" value="제주" />
<br />
<input type="text" name="position" value="센터" />
<br />
<input type="text" name="hobby" value="농구" />
<br />
<input type="submit" value="전송" />
</form><h1>9번 파일</h1>
<p>주소 : ${param.address }</p>
<p>포지션 : ${param.position }</p>
<p>취미 : ${param.hobby }</p>
<p><a href="08postForm.jsp">8번파일로 이동</a></p>2023.04.03 후기
EL표기법을 배우는데 가볍게 넘어간 부분들을 자세하게 배우니 좋다.
JSP를 활용할때 더 잘 표현할 수 있을 듯하다.