course 2021/JSP

JSP12 - 11el

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

java bean 

속성(데이터), 변경 이벤트, 객체 직렬화를 위한 표준. JSP 에서는 속성을 표현하기 위한 용도로 사용됨.

<java bean properties>

get set 메소드에 의해 결정됨

property 의 이름은 get, set 메소드의 get, set 을 지우고 앞글자를 소문자로

ex) public String getValue1(){ return Value1; }

public void setValue1(String value1){ Value1 = value1; }

 

*property 값에는 읽기전용과 읽기/쓰기 가 있다

읽기전용 property: get 또는 is 메소드만 존재하는 property

읽기/쓰기 property: get/set 또는 is/set 메소드가 존재하는 property

 

*property type 이 boolean 형이면 get 대신 is 를 쓸 수 있다

 

* getter, setter

> Getter: getFieldName()

- public / 리턴타입: 필드의 리턴타입 / 메소드명: get+필드이름(첫글자대문자) / 리턴값: 필드값

> Setter: setFieldName(타입 fieldName)

- public / void / 메소드명: set+필드이름(첫글자대문자) / 매개변수타입: 필드타입

 

01javabean

기본 생성을 가지고 있어야 함

생성자를 작성하지 않으면 기본 생성자가 자동으로 추가된다

예제)

아래 두개의 property 만들기 

- property name (read/write)

- property age (read/write)

bean01.java

public class Bean01{

	private String value1;
	private int value2;
	private int value3;
	private int value4;

	public int getVal(){
		return value4;
	}
	public void setVal(int val){
		this.value4 = val;
	}
	public String getValue1(){
		return value1;
	}
	public void setValue1(String value1){
		this.value1 = value1;
	}
	public int getValue2(){
		return value2;
	}
	public void setValue2(int value2){
		this.value2 = value2;
	}
	public int getValue3(){
		return value3;
	}
	public void setValue3(int value3){
		this.value3 = value3;
	}
}

Bean02.java

public class Bean02{
	private String name;
	private double age;

	public String getName(){
		return name;
	}

	public void setName(String name){
		this.name = name;
	}

	public double getAge(){
		return age;
	}

	public void setAge(double age){
		this.age = age;
	}
}

 

- 일단 파일은 모두 아예 자바파일로 작성되었음

그리고 자바파일은 webcontent 가 아닌 src 폴더에 위치!!!!

(아 이전에 sample 어딨지 하던것도 여기에 있었다. 자바파일이라서.)

- 01파일

일단 value 1~4 모두 get, set

get 은 리턴했고, set 은 this 로 값을 저장했다 (매개변수로 받은 값)

- 02파일

name 이랑 age 하래서 getName, setName, getAge, setAge 했음

뭐야 파일 1이랑 무슨 상관?

- 아마 예제는 2번 파일인 듯

02javabean

예제)

아래 3개의 속성을 갖도록 java bean 규칙을 따라 작성하기

String nickname, int age, boolean vip

- bean03.java

public class Bean03 {

	private String name;
	private int age;
	private boolean kid;
	
//	public boolean getKid() {
//		return kid;
//	}
	
	public boolean isKid() {
		return kid;
	}
	public void setKid(boolean kid) {
		this.kid = kid;
	}	
	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;
	}
}

- bean04.java

public class Bean04 {

	private String nickName;
	private int age;
	private boolean vip;
	
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isVip() {
		return vip;
	}
	public void setVip(boolean vip) {
		this.vip = vip;
	}
}

아마 예제는 4번 파일인 듯

nickname, age, vip 하래서 했고, vip 는 boolean 형이라서 get 대신 is 를 사용한 것을 볼 수 있다

 

03el

expression language

작성법: ${attribute }

jsp 출력용으로 사용된다

** 역슬래시 \ 사용 시 el 적용 안됨 (ex. \${attribute })

예제)

<%
pageContext.setAttribute("pageAttr1", "pageVal1");
pageContext.setAttribute("pageAttr2", 100000);
pageContext.setAttribute("pageAttr3", true);
%>

<p>java code : <%= pageContext.getAttribute("pageAttr1") %></p>
<p>el : ${pageAttr1 }</p>
<p>java code : <%= pageContext.getAttribute("pageAttr2") %></p>

<%-- el사용해서 pageAttr2의 값 출력 코드 작성 --%>

<p>el : ${pageAttr2 }</p>

<%-- java code (expression) 사용해서 pageAttr3의 값 출력 코드 작성 --%>
<%-- el사용해서 pageAttr3의 값 출력 코드 작성 --%>

<p>java code : <%= pageContext.getAttribute("pageAttr3") %></p>
<p>el : ${pageAttr3 }</p>
<p>java code : <%= pageContext.getAttribute("pageAttr4") %></p>
<p>el : ${pageAttr4 }</p>

맨 위의 자바코드에서 pageAttr1,2,3 에 각각 값들을 넣었다

java code : <%= pageContext.getAttribute("pageAttr1") %>

el : ${pageAttr1 }

→ 아마 java code 로 저렇게, el 로는 저렇게 작성한다고 보면 될 듯. 둘 다 같은 거.

1, 2, 3, 4 다 똑같음

아 그리고 맨 위에서 자바코드로 pageContext.setAttribute 로 값 넣었던거 잊지말깅 그러니까 반환했지

근데 4 는 값을 안넣었기 때문에 null 반환

04el-request

el 없는 값이면 아무것도 출력되지 않는다

* boolean 형 true, false 와 String 형 true, false 는 html 출력값이 같아서 코드 보고 판단해야 함

<%
request.setAttribute("reqAttr1", "reqVal1");
request.setAttribute("reqAttr2", 900000000);
request.setAttribute("reqAttr3", false);
%>
<p>java code : <%= request.getAttribute("reqAttr1") %></p>
<p>el : ${reqAttr1 }</p>
<p>java code : <%= request.getAttribute("reqAttr2") %></p>
<p>el : ${reqAttr2 }</p>
<p>java code : <%= request.getAttribute("reqAttr3") %></p>
<p>el : ${reqAttr3 }</p>
<p>java code : <%= request.getAttribute("reqAttr4") %></p>
<p>el : ${reqAttr4 }</p>

request.setAttribute 로 reqAttr 1, 2, 3 에  값 저장

위에 03 이랑 다른 건 getAttribute 에서 pageContext 가 아닌 request 라는 것

하지만 어차피 el 로는 동일

 

05forward-from, to

from 

<%
request.setAttribute("reqAttr1", 3.1415);
%>
<jsp:forward page="05forward-to.jsp"></jsp:forward>

request.setAttribute 로 reqAttr1 에 3.1415 넣기

forward - to 파일로 보냄. 포워드는 html 코드는 다 지우지만 자바코드는 실행함

to

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

${reqAttr1 } 반환했음 (아까 포워딩 되기 전에 파일에서 저장한 값)

06from, to

from

<%--
request 영역에 적절한 attributes 를 추가
 --%>
<%
request.setAttribute("name", "donald");
request.setAttribute("age", 30);
request.setAttribute("height", 190.5);
request.setAttribute("width", 300.3333);
%>
<jsp:forward page="06to.jsp"></jsp:forward>

request.setAttribute 로 값 다 넣고 to 파일로 포워딩

to 

<p>name : ${name }</p> <%-- donald --%>
<p>age : ${age }</p> <%-- 30 --%>
<p>height : ${height }</p> <%-- 190.5 --%>
<p>width : ${width }</p> <%-- 300.3333 --%>

el 로 값 다 반환함

음... 주목할만한 건 <p> 태그 안에서 작성되었다는 것?

 

07session

이번에는 session.setAttribute 로 넣고, session.getAttribute 로 반환하는데 

이것 역시 el 로 반환해도 같다

 

08redirect-from, to

from

session.setAttribute 로 값 다 넣고 갑자기 리디렉트, to 파일로

to

갑자기 냅다 반환함 el 로

- 어 전에 배웠듯이, request 로 전달 안됨. 따라서 1)쿼리스트링 2)session 으로 전달해야 함

09

08이랑 동일

 

10application

application 으로 넣고 반환하기 

걍 똑같음

11application

10 에서 전달한 값 여기서 그냥 받음 왜냐면 application 이니까 ㅇㅇ

- application 은 모든 jsp, servlet 이 공유해서 사용하는 객체이므로 !

12scope

el 꺼낼 때 어떤 영역에서 꺼내는 지 모름

만약 중복된 이름이 있다면 값을 넣었을 때 어떤 순서대로 찾는지??

같은 이름으로 다른 영역에 attribute 가 있다면 

pageContext > request > session > application 순으로!!

<%
pageContext.setAttribute("attr01", "pageVal01");
request.setAttribute("attr01", "reqVal01");
session.setAttribute("attr01", "sesVal01");
application.setAttribute("attr01", "appVal01");

request.setAttribute("attr02", "reqVal02");
session.setAttribute("attr02", "sesVal02");
application.setAttribute("attr02", "appVal02");

session.setAttribute("attr03", "sesVal03");
application.setAttribute("attr03", "appVal03");

application.setAttribute("attr04", "appVal04");
%>

<p>attr01 : ${attr01 }</p>
<p>attr02 : ${attr02 }</p>
<p>attr03 : ${attr03 }</p>
<p>attr04 : ${attr04 }</p>
<p>attr05 : ${attr05 }</p>

pageContext, request, session, application 모두 1 저장

request, session, application 에 2 저장

session, application 에 3 저장

application 4 저장

후, el 로 1, 2, 3, 4, 5 반환

1에서는 (모두 다 저장한 건) pageContext 반환

2에서는 request 반환

3에서는 session 반환

4에서는 application 반환

 

13javaBean

<%
Bean03 obj1 = new Bean03();
obj1.setAge(30);
obj1.setName("donald");
obj1.setKid(false);
pageContext.setAttribute("attr1", obj1);
%>

<hr>
<p>java code : <%= pageContext.getAttribute("attr1") %></p>
<p>el : ${attr1 }</p>

<hr>
<%
Bean03 var1 = (Bean03) pageContext.getAttribute("attr1");
%>

<p>java code : <%= var1.getName() %></p>
<p>el : ${attr1.name }</p>

<p>java code : <%= var1.getAge() %></p>
<p>el : ${attr1.age }</p>

<p>java code : <%= var1.isKid() %></p>
<p>el : ${attr1.kid }</p>

Bean03 객체생성, obj1

obj1 에 age, name, kid 에 값 저장, attr1 에 obj1 저장

java code, el 로 attr1 값 반환 (obj1)

Bean03 객체생성, var1  , 근데 attr1? 

java code, el 로 값 반환,

Bean03 은 아까 작성한 자바파일, 객체생성을 했으니까 변수명.메소드명 을 쓸 수 있지!

그래서 자바파일에 작성한 대로 set 하면 저장하고 get 하면 반환하네!

14forward-from,to

from

<%
Bean03 obj1 = new Bean03();
obj1.setName("korea");
obj1.setAge(30000);
obj1.setKid(false);
request.setAttribute("bean1", obj1);
%>

<jsp:forward page="14forward-to.jsp"></jsp:forward>

Bean03 객체 obj1 선언

Name, Age, Kid 값 저장

bean1 에 obj1 저장 

포워딩 to 파일로

to

<%
Bean03 o = (Bean03) request.getAttribute("bean1");
%>
<p>name : <%= o.getName() %></p>
<p>age : <%= o.getAge() %></p>
<p>kid : <%= o.isKid() %></p>

값들을 모두 반환

근데 그 전에 객체생성 함

객체변수명.메소드명()

 

15forward-from, to

from

<%
Bean03 obj1 = new Bean03();
obj1.setName("korea");
obj1.setAge(30000);
obj1.setKid(false);
request.setAttribute("bean1", obj1);
%>

<jsp:forward page="15forward-to-el.jsp"></jsp:forward>

bean03 객체생성

포워딩

to

<p>name : ${bean1.name }</p>
<p>age : ${bean1.age }</p>
<p>kid : ${bean1.kid }</p>

또 ...

똑같지 뭐

16from, to

from

<%
Bean04 b2 = new Bean04();
b2.setAge(99999);
b2.setNickName("captain");
b2.setVip(true);

session.setAttribute("bean2", b2);

response.sendRedirect("16to.jsp");
%>

bean04 객체생성, b2

set 메소드로 값 저장

session.setAttribute 로 bean2 에 b2 (아까 생성한 객체 변수) 저장

그리고 to 파일로 리디렉션

to

p>nickName : ${bean2.nickName }</p>
<p>age : ${bean2.age }</p>
<p>vip : ${bean2.vip }</p>

그냥 이번에도 반환함

 

${attribute명.property명 }

 

17map

<%
Map<String, String> map = new HashMap<>();
map.put("lang", "java");
map.put("pre", "html");
map.put("pattern", "mvc");
// 2개의 key,value 쌍(entry) 넣고
map.put("city", "seoul");
map.put("food", "cake");

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

<hr>

<p>map : ${bean1 }</p>
<p>lang : ${bean1.lang }</p>
<p>pre : ${bean1.pre }</p>
<p>pattern : ${bean1.pattern }</p>
<%-- 위에 추가한 value를 출력 -el 사용 --%>
<p>city: ${bean1.city }</p>
<p>food: ${bean1.food }</p>

 

HashMap, map 에 값 (key, value) 저장 

pageContext.setAttribute 로 bean1 에 map 저장

각 값을 el 로 반환 - bean1.key

bean1 의 반환값은 key=value 쌍으로 모두 반환됨

18map

map 의 key 는 대소문자 규칙 없음

property 명이 변수명

el 의 점 연산자로 숫자 사용 불가하기 때문에 점 연산자 대신 쓸 수 있는 연산자 [] 가 있다

만약 key 가 숫자라면 [] 안에 String 으로 작성 (쌍따옴표!! "")

ex. ${bean1.1 } 말고 ${bean1["1"] } 이렇게 작성

ex2. ${bean1.nick name } 말고 ${bean1["nick name"] } 이렇게 작성

<%
Map<String, String> map = new HashMap<>();
map.put("name", "donald");
map.put("Name", "trump");
map.put("1", "java");
map.put("nick name", "coffee");
pageContext.setAttribute("bean1", map);

%>

<p>name : ${bean1.name }</p>
<p>name : ${bean1["name"] }</p>
<p>name : ${bean1[name] }</p>
<p>Name : ${bean1.Name }</p>
<p>Name : ${bean1["Name"] }</p>

<%-- <p>1 : ${bean1.1 }</p> --%>
<p>1 : ${bean1["1"] }</p>

<%-- <p>nick name : ${bean.nick name }</p> --%>
<p>nick name : ${bean1["nick name"] }</p>

<hr>

<%
Bean03 obj1 = new Bean03();
obj1.setName("computer");
pageContext.setAttribute("bean2", obj1);
%>
<p>name : ${bean2.name }</p>
<p>name : ${bean2["name"] }</p>

HashMap 으로 map 안에 key=value 쌍으로 값을 여러개 저장

el 로 반환하는데 , 이번에는 숫자 key, 띄어쓰기 포함된 key 가 포함

마지막에 Bean03 객체생성

19from,to

from

<%
Map<String, String> data = new HashMap<>();
data.put("name", "computer");
data.put("city", "ny");
data.put("1000", "son");
data.put("this day", "11월 4일");

request.setAttribute("data1", data);
%>
<jsp:forward page="19to.jsp" />

HashMap 으로 data 안에 key=value 저장

request.setAttribute 로 data1 안에 data 저장

to 파일로 포워딩

to 

<p>name : ${data1.name }</p>
<p>city : ${data1.city }</p>
<p>1000 : ${data1["1000"] }</p>
<p>this day : ${data1["this day"] }</p>

값 반환

20map-bean

map 과 bean 합쳐서

${attribute명.(map의)key명.(bean의)property명 }

<%
Map<String, Bean03> map = new HashMap<>();
Bean03 val1 = new Bean03();
val1.setName("donald");
val1.setAge(3000);

Bean03 val2 = new Bean03();
val2.setName("trump");
val2.setAge(999);

Bean03 val3 = new Bean03();
val3.setName("john");
val3.setAge(22);

map.put("person1", val1);
map.put("person2", val2);
map.put("new person", val3);

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

<p>1번 이름 : ${persons.person1.name }</p>
<p>1번 나이 : ${persons.person1.age }</p>

<p>2번 이름 : ${persons.person2.name }</p>
<p>2번 나이 : ${persons.person2.age }</p>

<p>new person 이름 : ${persons["new person"].name }</p>
<p>new person 이름 : ${persons["new person"]["name"] }</p>
<p>new person 나이 : ${persons["new person"].age }</p>
<p>new person 나이 : ${persons["new person"]["age"] }</p>

또 hashmap - https://tokkicode.tistory.com/26?category=987176 

 

day19 - API(2) generic, collection

> java.util 패키지 > 제네릭 generic 클래스나 인터페이스 선언에 유형 매개변수가 들어있는 클래스 제네릭 타입은 클래스/인터페이스 이름 뒤 "<매개변수>" 위치 클래스에 원치않는 datatype이 들어가

tokkicode.tistory.com

(근데 <String, Bean03> 은 무슨 의미지 왜 쓰지? - key 값이 String, value 값이 Bean03 이라는...)

반환할 값이 person(Attribute).property 여야하는데, 받은값이 map 이다.

map 은 key 값을 써줘야 value 를 얻을 수 있다 

여기에서 value 는 java bean 인데, 이 java bean 은 property 써야 값을 얻을 수 있음

결론: key, property → java bean (value) ??