course 2021/JSP

JSP13 - 11el(2)

코딩하는토끼 2021. 11. 20. 19:37

21map-baen

Map<String, Bean04> map = new HashMap();
Bean04 obj = new Bean04();
obj.setNickName("korea");
obj.setAge(30000);
obj.setVip(true);
map.put("key1", obj);

pageContext.setAttribute("data", map);
pageContext.setAttribute("key1", "key1");
pageContext.setAttribute("nickName", "nickName");
pageContext.setAttribute("age", "age");
pageContext.setAttribute("vip", "vip");
pageContext.setAttribute("key2", "seoul");
%>


<p>${data.key1.nickName }</p>
<p>${data.key1.age }</p>
<p>${data.key1.vip }</p>

<hr>
<p>${data["key1"]["nickName"] }</p>
<p>${data["key1"]["age"] }</p>
<p>${data["key1"]["vip"] }</p>

<hr>
<p>${data[key1][nickName] }</p>
<p>${data[key1][age] }</p>
<p>${data[key1][vip] }</p>

<p>${[nickName] }</p>
<p>${[key2] }</p>

또쉬맵 .. hashmap, 이번엔 bean04

page 영역 attribute 로 map 객체를 data 라는 이름에 넣고 map 에 key, value 쌍을 (key1(String), obj(Bean04)) 로 추가

 

22bean-bean

자바파일 쓸 때 해당 패키지 import 했음 <%@ page import="sample03javabean.*" %>

아래에도 안써뒀는데 암튼 bean 쓸거면 import 해야됨

<%
Bean05 obj1 = new Bean05();
Bean03 obj2 = new Bean03();

obj2.setName("donald");
obj2.setAge(99);
obj2.setKid(false);
obj1.setCity("seoul");
obj1.setInfo(obj2);

pageContext.setAttribute("data1", obj1);
%>
<p>${data1.city }</p>
<p>${data1.info.name }</p>
<p>${data1.info.age }</p>
<p>${data1.info.kid }</p>

bean 객체 선언 - obj1, 2

메소드 사용하여 값들을 저장, pageContext.setAttribute 로 data1 에 obj1 을 저장

아래에서 값을 모두 반환해보기

 

23properties

<%
Map<String, Bean05> map = new HashMap<>();
Bean05 obj = new Bean05();
Bean03 info = new Bean03();
obj.setCity("ny");
obj.setInfo(info);

info.setName("trump");
info.setAge(33);
info.setKid(true);

map.put("data1", obj);

pageContext.setAttribute("data1", map);
%>

<%--
*el사용*
trump
33
ny
true
 --%>
<p>${data1.data1.info.name }</p>
<p>${data1.data1.info.age }</p>
<p>${data1.data1.city }</p>
<p>${data1.data1.info.kid }</p>

hashmap 생성 또쉬맵 - map 

Bean 객체생성 - obj, info

obj, info로 bean의 set메소드 사용하여 값 저장

map.put 으로 map 안에 obj 을 추가 (data1 의 이름으로)

page 영역에서 setAttribute 로 map 을 data1에 저장하여 전달

아래에서 el 사용하여, 값 반환

data1.data1.info.name

data1.data1.city

Bean05 에 있는 setInfo 메소드 ↓

public void setInfo(Bean03 info) {
		this.info = info;
	}

map 이라는 이름의 HashMap 선언, Bean05 의 객체 obj 와 Bean03 의 객체 info  선언

obj 즉, Bean05 안의 메소드 setCity 와 setInfo 로 city 에 ny 를, setInfo 에 info 에 info(Bean03 객체) 를 저장

info (Bean03) 안의 메소드 setName, setAge, setKid 로 name 에 trump 를, age 에 33 을, kid 에 true 를 저장

map 에 data1 의 이름으로 obj 저장

- 여기까지 map>data1(obj)>city(ny), {info(info)> name(trump), age(33), kid(true)}

그리고 pageContext.setAttribute("data1", map) 에서 data1 의 이름으로 map 을 저장

결론: 그래서 el 로 반환할 때, 저렇게 했다고 한다~! data1 은 이름이 중복된거임~

 

24list

<%
List<String> list = new ArrayList<>();
list.add("coffee");
list.add("beer");
list.add("soju");

pageContext.setAttribute("attr1", list);
%>

<p>list : ${attr1 }</p>
<p>list 0번째 : ${attr1[0] }</p>
<p>list 1번째 : ${attr1[1] }</p>
<p>list 2번째 : ${attr1[2] }</p>
<p>list 3번째 : ${attr1[3] }</p>

이번엔 list 로! string 저장할거야

list 에 coffee, beer, soju 추가

page 영역에 attribute 로 list 를 attr1 이름으로 저장

그리고 el 로 값을 모두 반환 

- 첫번째는 attr1 을 (즉, list 를) 반환하므로 : [coffee, beer, soju] 로 표시됨

- 두번째부터는 해당 인덱스에 저장된 값을 각각 반환

- 마지막으로 [3] 은 리스트에 존재하지 않으므로 반환값이 없음

 

25array

<%
String[] arr1 = {"java", "react", "jsp", "vue"};

pageContext.setAttribute("list", arr1);
%>

<p>0 : ${list[0] }</p>
<p>1 : ${list[1] }</p>
<p>2 : ${list[2] }</p>
<p>3 : ${list[3] }</p>
<p>4 : ${list[4] }</p>

배열에 string형으로 값들 (4개) 저장

setAttribute 로 배열을 list 라는 이름으로 저장

el 안에서 배열명[인덱스] 이름으로 반환

하지만 인덱스 3까지 존재하니까 4는 반환값 없음 (null 아니고 그냥 없음)

 

26list-ex

<body>
<%
List<String> list1 = new ArrayList<>();
list1.add("v");
list1.add("suga");
list1.add("rm");

String[] arr1 = {"jk", "jin", "jimin", "hope"};

pageContext.setAttribute("data1", list1);
pageContext.setAttribute("data2", arr1);
%>

<%-- v, suga, rm, jk, jin, jimin, hope --%>

<p>${data1[0] }</p>
<p>${data1[1] }</p>
<p>${data1[2] }</p>
<p>${data2[0] }</p>
<p>${data2[1] }</p>
<p>${data2[2] }</p>
<p>${data2[3] }</p>

arraylist 로 list1 선언

list1 에 v, suga, rm 을 저장

그리고 갑자기 이번에는 배열을 만들었다 

- 여기까지 정리: 리스트 하나 list1, 배열 하나 arr1

그리고 data1 의 이름으로 list1 을 저장, data2 의 이름으로 arr1 을 저장

이제 모두 반환

27list-ex

<%
String[] arr = {"banana", "apple"};
List<String> list = new ArrayList<>();
list.add("java");
list.add("react");
list.add("vue");

pageContext.setAttribute("arr1", arr);
pageContext.setAttribute("list1", list);
%>


<p>${arr1[0] }</p>
<p>${arr1[1] }</p>
<p>${list1[0] }</p>
<p>${list1["1"] }</p>
<p>${list1["2"] }</p>

아 근데 이번에도 그냥 리스트하나, 배열하나 인데 반환하는 방식이 다르다

28list-for

<%
String[] arr = {"apple", "berry", "melon"};
pageContext.setAttribute("list", arr);
%>

<p>${list[0] }</p>
<p>${list[1] }</p>
<p>${list[2] }</p>

<hr>

<%
for (int i = 0; i < arr.length; i++) {
	pageContext.setAttribute("idx", i);
%>
	<p><%= i %> : ${list[idx] }</p>
<%
}
%>

배열만들고 list 라는 이름으로 저장한 뒤, list 인덱스로 반환하고 

for 문으로 인덱스 0~배열크기-1 만큼 돌려서 반환도 가능

인덱스번호로 넣을 i 도 setAttribute 해서 넣기 

29list-for-ex

<%
List<String> list = new ArrayList<>();
list.add("java");
list.add("spring");
list.add("mvc");
list.add("controller");

pageContext.setAttribute("data", list);
%>


<%--
0 : java
1 : spring
2 : mvc
3 : controller
 --%>
 
<%
for (int i = 0; i < list.size(); i++) {
	pageContext.setAttribute("i", i);
%>
	<p>${i} : ${data[i] }</p>
<%
}
%>

arraylist 로 리스트에 값들을 저장하고 리스트를 data에 저장 

for 문으로 반환함

30list-for-from, to

from

<%
List<String> list = new ArrayList<>();
list.add("apple");
list.add("tesla");
list.add("meta");
list.add("google");

session.setAttribute("data", list);
response.sendRedirect("30list-for-to.jsp");
%>

list 에 값 넣기 , setAttribute 로 data 이름으로 저장

from → to 리디렉트

to

<%
List<String> data = (List<String>) session.getAttribute("data");

for (int i = 0; i < data.size() ; i++) {
	pageContext.setAttribute("i", i);
%>
	<p>${i } : ${data[i] }</p>
<%
}
%>

리스트 data 를 선언, 근데 data 를 받아온 (from 에서?)

for 문으로 반환

31jstl-from, to

30 파일을 그대로 < 표준 태그 표현식 JSTL > 를 사용하여 작성한 코드

from

<%
List<String> list = new ArrayList<>();
list.add("apple");
list.add("tesla");
list.add("meta");
list.add("google");

session.setAttribute("data", list);
response.sendRedirect("31jstl-to.jsp");
%>

arraylist 로 list 만들었음, 값 저장함

list 를 data 로 저장한 뒤 to 로 리디렉트

to

<c:forEach items="${data }" var="item" varStatus="status">
	<p>${status.index } : ${item }</p>
</c:forEach>

JSTL

↓ import 해야함!!

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

32list-bean

<%
List<Bean03> list = new ArrayList<>();
Bean03 b1 = new Bean03();
b1.setName("donald");
b1.setAge(99);

Bean03 b2 = new Bean03();
b2.setName("trump");
b2.setAge(33);

list.add(b1);
list.add(b2);

pageContext.setAttribute("people", list);

%>

<p>${people[0].name } : ${people[0].age }</p>
<p>${people[1].name } : ${people[1].age }</p>

arraylist list 선언

Bean03 객체 b1 선언 - name, age 에 donald, 99 저장

Bean03 객체 b2 선언 - name, age 에 trump, 33 저장

처음 선언한 리스트 list 에 b1, b2 추가

setAttribute 로 people 이름으로 list 를 저장

people 인덱스로 값 반환

33list-bean

<%
Bean04 o1 = new Bean04();
o1.setNickName("ironman");
o1.setAge(22);

Bean04 o2 = new Bean04();
o2.setNickName("widow");
o2.setAge(11);

Bean04[] list = {o1, o2};
pageContext.setAttribute("list", list);
%>

<p>${list[0].nickName } : ${list[0].age }</p>
<p>${list[1].nickName } : ${list[1].age }</p>

Bean04 객체 o1 생성 - 메소드로 nickname 에 ironman, age 에 22 를 저장

Bean04 객체 o2 생성 - 메소드로 nickname 에 widow, age 에 11 를 저장

Bean04 리스트 ...  만들어서 o1, o2 저장

setAttribute 로 list 에 방금만든 list 저장 

list[0] ...

34list-bean

<%
Bean05 o1 = new Bean05();
Bean03 o2 = new Bean03();
o2.setName("captain");

o1.setInfo(o2);

Bean05[] arr = {o1};
Map<String, Bean05[]> map = new HashMap<>();
map.put("data", arr);

pageContext.setAttribute("data", map);
%>

<%-- el사용해서 captain 출력 --%>
<p>${data.data[0].info.name }</p>

Bean05 객체 o1, Bean03 객체 o2 생성

o2 - 메소드 setName 이용하여 name 에 captain 저장

o1 - 메소드 setInfo 이용하여 info 에 o2 저장

Bean05 배열 arr 만들어서 o1 저장

HashMap map 생성, <String, Bean05> 가 key, value?

map 에 data, arr 저장

data 의 이름으로 map 저장

el 로 captain 출력하기 위해 data.data[0].info.name 작성

 

35implicit-object

< EL 기본객체 11개 >

<p>pageContext : ${pageContext }</p>

<p>pageScope: ${pageScope }</p>

<p>requestScope : ${requestScope }</p>

<p>sessionScope : ${sessionScope }</p>

<p>applicationScope : ${applicationScope }</p>

<p>param : ${param }</p>

<p>paramValues : ${paramValues }</p>

<p>header : ${header }</p>

<p>headerValues : ${headerValues }</p>

<p>cookie : ${cookie }</p>

<p>initParam : ${initParam }</p>

 

36scope

<%
pageContext.setAttribute("attr1", "pageVal1");
pageContext.setAttribute("page-attr1", "page-val1");
%>

<p>${attr1 }</p>
<p>${pageScope.attr1 }</p>
<p>${pageScope["attr1"] }</p>

<p>${pageScope["page-attr1"] }</p>

setAttribute 로 attr1 의 이름으로 pageVal1 저장, page-attr1 의 이름으로 page-val1 저장

el 로 반환

근데 왜 pageScope.attr1, pageScope["attr1"], pageScope["page-attr1"] 이렇게 반환하지?

- 아, 점 연산자 못 쓰는 것을 [] 로 대체했기 때문

공통점은 Map 객체라는 것 (속성, 값)

pageScope: pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

requestScope: request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

sessionScope: session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

applicationScope: application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

37scope

request 에 같은 이름의 attr 넣어도 requestscope 로 꺼낼 수 있나?

- 중복된 이름이 있을 경우, 좁은 영역의 것이 출력되는데 , 그 중 넓은 영역의 값을 꺼내고 싶다면 가능하다

혹은 점 연산자로 출력하기 어려운 경우!

<%
pageContext.setAttribute("attr1", "page value1");
request.setAttribute("attr1", "request value1");

%>

<p>${attr1 }</p>
<p>${requestScope.attr1 }</p>

pageContext 의 setAttribute 로 attr1 에 page value1 값 저장,

request 의 setAttribute 로 attr1 에 requesr value1 값 저장

el 로 반환

지금 이름이 attr1 으로 중복이기 때문에 단순히 attr1 으로 꺼내면 좁은 영역인 page 로 저장한 값 page value 가 반환

request 로 저장한 값을 꺼내고 싶다면 아까 배운대로 requestScope.attr1 으로 작성하면 됨

38scope

<%
pageContext.setAttribute("data", "page data");
request.setAttribute("data", "req data");
session.setAttribute("data", "session data");
application.setAttribute("data", "app data");

pageContext.setAttribute("new data", "new page data");
request.setAttribute("new data", "new req data");
session.setAttribute("new data", "new session data");
application.setAttribute("new data", "new app data");
%>

<p>\${data} : ${data }</p>
<p>\${pageScope.data } : ${pageScope.data }</p>
<p>\${requestScope.data } : ${requestScope.data }</p>
<p>\${sessionScope.data } : ${sessionScope.data }</p>
<p>\${applicationScope.data } : ${applicationScope.data }</p>

<hr>
<p>\${pageScope["new data"] } : ${pageScope["new data"] }</p>
<p>\${requestScope["new data"] } : ${requestScope["new data"] }</p>
<p>\${sessionScope["new data"] } : ${sessionScope["new data"] }</p>
<p>\${applicationScope["new data"] } : ${applicationScope["new data"] }</p>

비슷한 소리임 조금 더 다양하게, 심화

 

39param

< el param 기본객체 >

request parameter : <%= request.getParameter("param1") %>

${param.param1 }

${param.food }

<p>request parameter : <%= request.getParameter("param1") %></p>
<p>\${param.param1 } : ${param.param1 }</p>
<p>\${param.food } : ${param.food }</p>

 

실행하면, 

쿼리스트링으로 param1=apple 을 작성해주면, 첫번째와 두번째 줄의 결과가 apple 로 뜬다

 

40form, view

from

<form action="40view.jsp" method="post">
	<input type="text" name="id" placeholder="아이디">
	<br>
	<input type="password" name="password" placeholder="암호">
	<br>
	<input type="email" name="email" placeholder="이메일">
	<br>
	<textarea name="address" id="" cols="30" rows="10" placeholder="주소"></textarea>
	<br>
	<input type="submit" value="전송">
</form>

그냥 로그인 창 action 으로 view 파일로 넘겨주고

view

<p>id : ${param.id }</p>
<p>password : ${param.password }</p>
<p>address : ${param.address }</p>
<p>email : ${param.email }</p>

아까 받은 값들을 param.name 으로 el 방식으로 반환함