course 2021/JSP

JSP11 - 10scope

코딩하는토끼 2021. 11. 19. 07:14

01scope

java web app 의 4개의 영역(영역=scope) -교재 132p 참고

1) page: 하나의 jsp 페이지

2) request: 하나의 http 요청

3) session: 하나의 브라우저

4) application: 하나의 웹 어플리케이션

02page

page 영역

<%
pageContext.setAttribute("pageAttr1", "pageVal1");
%>
<%
String attr1 = (String) pageContext.getAttribute("pageAttr1");
%>

pageContext.~ 

request, response

같은 페이지라서 setAttribute 로 값을 넣고 getAttribute 로 값을 꺼낼 수 있다 (object 로 반환되므로 형변환)

03pageMain, pageSub

main

<%
pageContext.setAttribute("pageAttr2", "pageVal2");
%>
<hr>
<jsp:include page="03pageSub.jsp"></jsp:include>
<hr>
<%= pageContext.getAttribute("pageAttr2") %>

set 으로 pageAttr2 에 pageVal2 저장, sub 파일 갑자기 삽입, get 으로 pageAttr2 에 저장된 값 반환

sub

<%= pageContext.getAttribute("pageAttr2") %>

get 으로 pageAttr2 값 반환

→ sub 파일에서는 pageAttr2 값이 null 로 나옴. 다른 파일이기 때문에 전달 안됨

04applicartion,getAttribute

application

<%
application.setAttribute("appAttr1", "appVal1");
%>

이번에는 application.setAttribute 

아무튼 appAttr1 에 appVal1 을 넣어주었다

getAttribute

<%= application.getAttribute("appAttr1") %>

appAttr1 에 저장된 값을 반환

→ 파일은 연결되어 있지 않음. 그래서 각 파일을 각각 따로 실행.

결과: 값이 잘 반환됨 (다른 파일임에도/아까 page 랑은 다르다

05scope

request, session, application 비교

<%
Integer reqCounter = (Integer) request.getAttribute("counter");
if (reqCounter == null) {
	reqCounter = 0;
}
reqCounter++;
request.setAttribute("counter", reqCounter);



Integer sesCounter = (Integer) session.getAttribute("counter");
if (sesCounter == null) {
	sesCounter = 0;
}
sesCounter++;
session.setAttribute("counter", sesCounter);



Integer appCounter = (Integer) application.getAttribute("counter");
if (appCounter == null) {
	appCounter = 0;
}
appCounter++;
application.setAttribute("counter", appCounter);
%>



<ul>
	<li>request counter : <%= request.getAttribute("counter") %></li>
	<li>session counter : <%= session.getAttribute("counter") %></li>
	<li>application counter : <%= application.getAttribute("counter") %></li>
</ul>

차례대로 request, session, application

실행하면 다음과 같이 

새로고침을 하면 request 는 그대로, session 과 application 은 카운트가 증가한다

시크릿탭으로 접속해서 확인해보면, session 은 초기화, application 카운트 숫자는 그대로 유지

같은 와이파이를 공유한다면, 아이피주소로 들어가도 application 은 유지된다

결론: request 가 안전함

06member-list,signup-form,signup-process

member-list

<ul>

<%
List<String> members = (List<String>) application.getAttribute("members");

if (members != null) {
	for (String member : members) {
%>

<li><%= member %></li>

<%
	}
}
%>

</ul>

application.getAttribute 로 members 를 받고 members 가 null 이 아니면 리스트로 출력

signup-form 링크를 걸어서 이동할 수 있도록 함

signup-from

그냥 로그인 창, action 으로 signup-process 로 이동시켜줌

signup-process

<%
// application 영역에 파라미터로 받은 userName을 list에 추가하고 
List<String> list = (List<String>) application.getAttribute("members");
if (list == null) {
	list = new ArrayList<>();
	application.setAttribute("members", list);
}

String userName = request.getParameter("userName");
if (userName != null) {
	list.add(userName);
}

// member-list.jsp로 리디렉션
response.sendRedirect("06member-list.jsp");
%>

application.getAttribute 로 members 를 받아서 , null 이면 list 생성하여 application.setAttribute 로 members 에 list 넣어줌

로그인할때 입력했던 username 을 request.getParameter 로 받아서 null 이 아니면 list 에 추가

member-list 파일로 리디렉션

정리하면, 

member 파일 실행하면 등록하기 링크로 signup-form  파일로 이동하여 이름 적고 등록, 전송하면 signup-process 에 의해 등록된 뒤 바로 member 파일로 다시 이동하는데, 이 때 등록한 이름이 리스트로 함께 뜬다

07add-book, book-form, book-list

add-book

<%
List<MyBook> books = (List<MyBook>) application.getAttribute("books");
if (books == null) {
	books = new ArrayList<>();
	application.setAttribute("books", books);
}

// request 파라미터 처리
String title = request.getParameter("title");
String priceString = request.getParameter("price");
priceString = priceString == null ? "0" : priceString;

int price = Integer.parseInt(priceString);

MyBook book = new MyBook(title, price);

//리스트에 추가
books.add(book);

// 리디렉션
response.sendRedirect("07book-list.jsp");

%>

book-form

<form action="07add-book.jsp" method="post">
	<input type="text" name="title" placeholder="책 제목">
	<br>
	<input type="number" name="price" placeholder="가격">
	<br>
	<input type="submit" value="등록">
</form>

입력하면 add-book 파일로 보내주겠네

book-list

<h1>책 목록</h1>
<a href="07book-form.jsp">책 등록하기</a>
<ul>
<%
	List<MyBook> books = (List<MyBook>) application.getAttribute("books");
	if (books != null) {
		for (MyBook book : books) {
			
%>
	<li><%= book.getTitle() %> : <%= book.getPrice() %>원</li>
	
<%
		}
	}
%>
</ul>

<hr>
<h1>표현언어 (expression language - el)</h1>
<ul>
<li>${books[0].title } : ${books[0].price }원</li>
<li>${books[1].title } : ${books[1].price }원</li>
</ul>

book-form 파일로 링크 걸려있음