열심히 끝까지

디바이스 융합 자바(Java) day37 - JSP 기본문법(에러페이지 처리,include 지시어,include 액션,forward 액션,스크립트릿),내장 객체(request,response,out,session,application,exception) 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day37 - JSP 기본문법(에러페이지 처리,include 지시어,include 액션,forward 액션,스크립트릿),내장 객체(request,response,out,session,application,exception)

노유림 2022. 8. 2. 17:33

[오늘 수업]
JSP 기본 문법

if, for
배열 -> DBMS

1. 준비한 예제들이 실무 스타일!
2. 문법을 설명하기 위해 만든 예제 존재

기본문법
1) 에러페이지 처리
      404 : 클라이언트의 문제
             ex ) 주로 없는 페이지를 요청
                 -> 있는 페이지를 요청
                 -> 서버측에서 페이지를 생성
     500 : 서버의 문제
             -  로직 상에서 발생하는 모든 문제에 대해 500에러를 발생시킴

>> 실무에서 많이 쓰이는 방법 중 하나
[에러 나면 보낼 페이지]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러 처리 페이지</title>
</head>
<body>

<h1>처리중에 문제가 발생해습니다!</h1>
<hr>
<%=exception %>
<%-- exception은 JSP 내장객체! --%>
</body>
</html>


[에러가 나는 페이지]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="NewFile.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러 발생 페이지</title>
</head>
<body>

<h1>테스트중입니다.....</h1>
<hr>
<%
	// 컴파일은 정상적으로 수행되나,
	// 실행시키면 에러가 발생하는 코드
	String msg="apple";
	int num=Integer.parseInt(msg);
%>

</body>
</html>

결론 : page 지시어 isErrorPage, errorPage 속성을 통해 설정 가능함

 

---------------------------------
2) 에러페이지 처리
     : 여러 페이지에 공통으로 들어가는 내용을 관리할 때 용이
            ex ) 메인페이지, 고객센터 등의 header, footer
     : 공통으로 들어가는 페이지를 한 번 만들어두면,
       다른 페이지에서 필요한 경우에 include해서 사용 가능함
     : 공통 내용의 페이지를 포함시킨 이후에 컴파일하기 때문에,
       개별적으로 컴파일하지 않으므로 별도의 기본 HTML 구조 태그가 필요 없음
     : 여러 파일들을 하나로 컴파일하기 때문에 변경이 적은 정적인 페이지를 포함시킬 때 용이


>> 임의로 header와 footer 입력

[include 지시어 테스트]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>include 지시어</title>
</head>
<body>
<%-- 임의로 header 와 footer 입력 --%>

<table border="2">
	<tr>
		<td><%@ include file="header.jsp" %></td>
	</tr>
	<tr>
		<td><%@ include file="footer.jsp" %></td>
	</tr>
</table>

</body>
</html>

 

>> header와 footer는 따로 HTML 파일이 필요 없음
>> 그래서 작성하는 방법이 생각보다 간단!

 

[header 페이지]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
[메일][카페][블로그][지식iN][쇼핑][쇼핑LIVE][Pay][▷TV]

 

[footer 페이지]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

[공지사항]

<hr>
Creators<br>
Partners<br>
Developers

 

>> 템플릿을 구성하는 경우 내부에 바로 적용, CSS에 우선순위를 높히는 방법
>> 코드를 보면 티가 나서 외부 CSS를 추가

------------------------------------
3) include 액션
     : 포함시킬 파일(조금씩 바뀌는 파일)들을 각각 관리(따로 컴파일)
     : 메인 파일(메인페이지, 상세페이지)이 다른 파일(기사)들을 포함하는 개념
     : 동적인 페이지를 포함시킬 때 용이 

[include 액션 페이지]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>include 액션</title>
</head>
<body>

<hr>
	<jsp:include page="side.jsp">
		<jsp:param value="apple" name="msg"/>
		<jsp:param value="1024" name="num"/>
	</jsp:include>
<hr>

</body>
</html>


>> 매개변수를 줄 수 있고(선)
>> 띄우는 side.jsp를 가져와서 사용
   ※ 즉, include 액션페이지가 side.jsp에 저장된 값을 불러와 띄우는 것!

[side.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>별도 페이지</title>
</head>
<body>

<h3>별도페이지입니다.</h3>
<hr>
<%-- 내장객체 : request --%>
<%-- 요청정보 안에 있는 숫자나 메세지 출력하도록 작성 --%>
<%=request.getParameter("num") %> <br>
<%=request.getParameter("msg") %>

</body>
</html>

 

>> 이때 num의 1024는 String 타입!! 기억할 것

>> 2) include 지시어
     3) include 액션 : 요청
         이 두개는 많이 쓰이지는 않지만 기본이라서 배움

     >> include 액션 페이지 안에 포함되서 나오는 것이 페이지에 보임(라인 추가됨)

--------------------------------------
4) forward 액션
     : 페이지 제어권을 완전히 넘겨줌
     : 현재 페이지 -> 다른 페이지로 화면 전환할 때 사용
     : response(JSP 내장객체.응답관련 정보가 저장된 객체)의 
      ★ sendRedirect() 메서드와 유사한 기능을 수행 ★

>> forward로 바꿨을 뿐인데, <hr> 두 라인이 보이지 않음
    >> 제어권을 넘겨주고 돌려받지 못함!!
    >> 돌아오지 못하기 때문에 <hr>을 출력하지 못함
     
[앞의 include 액션 예제 가져와서 forward로 변경]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward 액션</title>
</head>
<body>

<hr>
	<jsp:forward page="side.jsp">
		<jsp:param value="apple" name="msg"/>
		<jsp:param value="1024" name="num"/>
	</jsp:forward>
<hr>

</body>
</html>

 

-----------------------
5) 스크립트릿(scriptlet)
    : JSP 내부에서 JAVA 언어를 사용할 수 있게 해주는 태그

   ex )
       <%@ %> 지시어
                   <%@ page %> page 지시어
                   <%@ include %> include 지시어
      <% %> 스크립트릿
      <%= %> 표현식
                   out JSP 내장객체의 출력기능을 포함하는 태그
      <%! %> 선언식
 

[직접 입력]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	for(int i=1; i<=10; i++){
		System.out.println("콘솔 : "+i); // 원래 있던거라서 사용 가능
		out.println("브라우저 : "+i+"<br>"); // 내장객체
	}
%>

</body>
</html>

[따로 입력]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	for(int i=1; i<=10; i++){
%>
	<%=i %> <br>
<%
}	
%>

</body>
</html>


================================
[내장 객체]

1) request
        : 요청정보
        : String(문자열) 타입으로 데이터를 주고받음
        : UTF-8 인코딩 해야함에 유의! 

ex ) 
[요청 시작]

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="request_end.jsp" method="post">
	<table border="1">
		<tr>
			<td>이름</td>
			<td><input type="text" name="uname"></td>
		</tr>
		<tr>
			<td>직업</td>
			<td>
				<select name='job'>
					<option>무직</option>
					<option>학생</option>
					<option>회사원</option>
					<option>전문직</option>
					<option>자영업</option>
				</select>
			</td>
		</tr>
		<tr>
			<td>관심 컨텐츠</td>
			<td>
				<input type="checkbox" name="fav" value="영화">영화
				<input type="checkbox" name="fav" value="드라마">드라마
				<input type="checkbox" name="fav" value="애니메이션">애니메이션
			</td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="가입하기">
			</td>
		</tr>
		
	</table>

</form>

</body>
</html>

[요청 끝]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

요청 메서드 : <%=request.getMethod()%><br>
	<table border="1">
		<tr>
			<td>이름</td>
			<td><%=request.getParameter("uname")%></td>
		</tr>
		<tr>
			<td>직업</td>
			<td>
				<%=request.getParameter("job")%>
			</td>
		</tr>
		<tr>
			<td>관심 컨텐츠</td>
			<td>
			<%-- getParameter로는 못함 --%>
				<%
					String[] fav = request.getParameterValues("fav");
					// 일반적으로 요청매개변수 명과 자바 변수명을 맞춰서 쓰는것이 보통
					for(int i=0; i<fav.length;i++){
						out.println(fav[i]+"<BR>");
					}
					for(String v:fav){
						out.println(v+"<BR>");
					}
					
				%>
			</td>
		</tr>
	</table>

</body>
</html>

 

-------------------------
2) response
        : 응답정보
           forward 액션 vs response.sendRedirect()
공통점      둘 다 요청을 수행할 수 있음
차이점   forward 액션 : 새로운 요청을 수행하는 것이 아닌 내 페이지에서 제어권을 넘겨주면서 '
                                파라미터 값도 그대로 전달(및 추가) 가능
                                새로운 요청 xxx / 제어권 넘겨주면서 파라미터 값도 전달(및 추가) 가능함
            response.sendRedirect() : 새로운 요청을 넘겨주는 것이라 파라미터값을 유지하지 못함
                                               새로운 요청 ooo / 파라미터 값 유지 xxx


1                           2                              3
start                       forward                     end
                             response

 >> 1번 페이지에서 timo 보냄
 >> 2번 페이지에서는 timo를 볼 수 있음
 >> forward는 timo값을 3번 페이지에 그대로 넘겨줌과 동시에 본인이 추가한 값도 같이 전달,
                     제어권을 넘겨주고 끝남 
                     >> 제어권을 넘겨준거라서 주소에 forward.jsp값이 그대로 유지되어 전달
                     - 이전 정보가 필요하면 forward
      response는 새로운 요청을 수행하는 객체, 
                    request가 새로 파져서 timo는 유지하지 못 함
                    넘겨준 제어권을 시 가져오기까지 함
                     - 이전 정보가 필요하지 않으면 response

  >> URL == 요청
      1. start 페이지 보여줘! 라고 요청

      2-1. 티모로 submit forward.jsp 요청을 한 것
           >> forward라는 액션은 자신의 제어권(브라우저에 출력될 권리)을 넘겨줌
                새로운 요청이 아니기 때문에 URL이 유지

      2-2. 티모로 submit response.jsp 요청을 한 것
           >> 요청을 한 번 더 하라는 것 -> 새로운 요청, 새 URL 
                 -> end.jsp는 뜨지만 새로운 페이지에서 열린 거라 빈 정보를 전달

     ex ) 장바구니
           >> 결제하기 위해서 메인페이지로 옮길 때 forward
           >> 결제 후 장바구니 정보를 저장하지 않아도 되기 위해 
                response.sendRedirect()를 이용하여 

           네이버 웹툰
           >> 224화 보여달라고 했는데 안보여주고 밖으로 빠져나감 - sendRedirect()
                 >> 메인으로 갈 때는 요청 정보가 필요 없어서 정보를 날리고 메인 복귀
          >> 20000화 보여줘! 도 sendRedirect()
          네이버 블로그
          >> 없는 게시글을 보여달라고 url 요청
               url을 유지하면서 alert를 띄움, 그렇다는건 유효성검사로 입구컷
               > alert를 확인 누르면 response일 가능성이 있음

[시작]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시작 페이지</title>
</head>
<body>

<form action="forward.jsp" method="post">
	forward 액션 : <input type="text" name="uname">
	<input type="submit" value="전송!">
</form>

<hr>

<form action="response.jsp" method="post">
	response.sendRedirect() : <input type="text" name="uname">
	<input type="submit" value="전송!">
</form>

</body>
</html>

 

[끝]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>종료 페이지</title>
</head>
<body>

<h1>종료 페이지</h1>
<hr>
이름 : <%= request.getParameter("uname") %><br>
메세지 : <%= request.getParameter("msg") %>

</body>
</html>

 

[forward]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- 이곳의 내용전달 안함 -->
<!-- start 페이지에서 요쳥을 forward 페이지한테 한건데, forward가 유지해서 보낼 수 있음 -->
<!-- 자기 메세지까지 넣어서 출력 가능 -->
<jsp:forward page="end.jsp">
	<jsp:param value="apple" name="msg"/>
</jsp:forward>

[response]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- 새로운 요청을 하는 것이기 때문에 값을 받아서 보내지 못함 -->
<% response.sendRedirect("end.jsp"); %>

--------------------------------
3) out
        : 브라우저(화면) 출력 기능

--------------------------------
4) session ☆ 오늘의 핵심!!
        : HTTP 프로토콜 == 비연결형 프로토콜
             : 하나의 페이지가 출력된 이후에 클라이언트와 서버의 연결이 끊어짐 = 그것이 문제
        : 위의(나의) 상태를 기억하기 위해(저장하기 위해) 사용하는 방법
             : 쿠키, session, application, ...

        : 브라우저 단위 or 일정 시간
            ex ) 장바구니, 은행 어플, 로그인, ...

        1. 브라우저 단위로 유지되기 때문에 브라우저를 종료시키면 새로운 session 객체가 생성
        2. 일정 시간(유지기간)이 지나면, 새로운 session 객체가 생성됨
             >> 장바구니, 은행 어플에 많이 사용(이것만 쓰는 건 아님)
                    (이거 많이쓴다고 해서 이거 썼어요 라고 답하면 안된다.)
             >> 서버자원이나 DB를 쓴다고 한다

[예시]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session</title>
</head>
<body>

<%
	session.setMaxInactiveInterval(3);


	if(session.isNew()){
		out.println("<SCRIPT> alert('세션 재설정!') </SCRIPT>");
		session.setAttribute("id", "admin");
	}
%>

세션 유지 시간 : <%=session.getMaxInactiveInterval() %><br>
<%=session.getAttribute("id") %>님, 반갑습니다! :D

</body>
</html>

 

--------------------------------
5) application ☆ 오늘의 핵심!!!
        : 서버 단위
            ex ) 앱, 투데이 방문자 수, ...
        1. 서버 단위로 유지되기 때문에, 브라우저를 종료시켜도 데이터를 유지할 수 있음
        2. 서버 단위==톰캣 : 톰캣을 종료하거나 재시작하면 새로운 application 객체가 생성됨
              >>  톰캣을 종료하거나 다시 시작하면 새 application 생성
 
[예시]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>application - 1</title>
</head>
<body>

<%
	application.setAttribute("id","admin");
	application.setAttribute("cnt", 0);
%>

<a href="NewFile9.jsp">투데이 방문자 수 확인하기</a>

</body>
</html>


[예시]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>application - 2</title>
</head>
<body>

<%
	// 오브젝트로 돌아다니고 있어서 밑줄 그어짐 = (Integer) 정수형이라고 지정
	int cnt=(Integer)application.getAttribute("cnt");
	cnt++;
	// 증가된 cnt를 늘려주기
	application.setAttribute("cnt", cnt);
%>

<%=application.getAttribute("id") %>님의 방문자수:<%=cnt %>명

</body>
</html>

--------------------------------
6) exception
        : 예외객체

 

[session을 이용한 장바구니 예제]
1. index.jsp(표지 페이지)
     로그인 <form>을 제공
     이름(uname)을 입력하면 다음 페이지(main.jsp)로 이동
     method="post"

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<%session.invalidate(); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인(표지페이지)</title>
</head>
<body>

<form action="main.jsp" method="post">
	<input type="text" name="uname">
	<input type="submit" value="로그인">
</form>



</body>
</html>



2. main.jsp
     uname님, 반갑습니다! :D
     물건을 구매하는 <form>을 제공 / 물건 정보 담아서 보냄
     5가지의 물건 <select> > 우리가 알아서.... 개수 재고 신경 안씀
     <a> 구매하기</a>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>구매 페이지</title>
</head>
<body>
<%
	String uname=request.getParameter("uname");
	session.setAttribute("uname", uname);
%>

<h1><%=request.getParameter("uname") %>님, 반갑습니다! :D </h1><br>

<form action="add.jsp" method="post">
	
	<select name="product">
		<option>아메리카노</option>
		<option>카페라떼</option>
		<option>카페모카</option>
		<option>프라푸치노</option>
		<option>스무디</option>
	</select>
	<input type="submit" value="장바구니에 추가하기">
</form>
<a href ="result.jsp">구매하기</a> 
<!-- 새로운 요청을 했기 때문에 uname이 result에 도달하는 것은 불가능
	 
-->

<%-- 강사님 방법 --%>
<h1><%=session.getAttribute("uname") %>님, 반갑습니다! :D</h1>
<form action="add.jsp" method="post">
	
	<select name="product">
		<option>키링</option>
		<option>아이스홍시</option>
		<option>은귀고리</option>
		<option>스마트톡</option>
		<option>식빵</option>
	</select>
	<input type="submit" value="장바구니에 추가하기">
</form>
<a href ="result.jsp">구매하기</a> 


</body>
</html>


3. 물건을 하나 select해서 전송하게 되면 add.jsp 실행
     구매한 물건을 장바구니에 추가하는 로직]
         장바구니 : 브라우저를 종료하면 사라지는 객체(session)에 저장
     로직을 수행완료하면 다시 main.jsp로 이동    

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<% request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니에 물건을 추가하는 로직(화면 출력 x)</title>
</head>
<body>
 <%-- 내 방법 --%>
<%
	String product=(String)request.getParameter("product");
	ArrayList<String> bproduct = (ArrayList<String>)session.getAttribute("bproduct");
	if(bproduct==null){ // 장바구니가 없을 경우
		bproduct=new ArrayList<String>();
	}
	bproduct.add(product);
	session.setAttribute("bproduct",bproduct);
%>
<%-- 강사님 방법 --%>
<%
	String tproduct=request.getParameter("product");

	ArrayList<String> datas=(ArrayList)session.getAttribute("datas");
	// session 내장 객체에 저장된 장바구니를 불러오는 코드
	if(datas==null){// 장바구니가 생성되지 않은 경우
		datas=new ArrayList<String>();	
		session.setAttribute("datas",datas);
	}
	datas.add(tproduct);
%>

<%-- 스크립트는 같으니 패스 --%>
<script type="text/javascript">
	alert("<%=product%>이(가) 추가되었습니다.");
	history.go(-1);
</script>



</body>
</html>


4. result.jsp
     지금까지 장바구니에 담긴 모든 물건을 화면에 출력
     +) 단, 능력이 된다면 유효성 검사를 수행해주세요!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>구매하기(결제페이지)</title>
</head>
<body>

<h1>구매한 상품 목록</h1>
<h2><%=session.getAttribute("uname") %>님이 선택한 상품 목록</h2>
<hr>
<%
	ArrayList<String> bproduct=(ArrayList)(session.getAttribute("bproduct"));
	if(bproduct==null){
		out.println("선택한 상품이 없습니다.");
	}
	else{
		for(String product:bproduct){
			out.println(product+"<BR>");
		}
	}
%>
<br>
<a href="main.jsp">메인으로</a>

<%-- 강사님 방법 --%>
<h1><%=session.getAttribute("uname") %>님이 구매한 상품 목록</h1>
<hr>
<ol>
<%
	ArrayList<String> datas=(ArrayList)session.getAttribute("datas");
	if(datas==null){
		out.println("<h2>구매한 상품이 없습니다!</h2>");
	}
	for(String v : datas){
		out.println("<li>"+v+"</li>"); // li는 숫자 오더리스트 
	}
%>
</ol>

</body>
</html>



2시 10분에 전체적인 아웃라인을 같이 코딩!!

session.getAttribute("없는 변수명")
       존재하지 않는 변수명을 호출하는 행위는
       에러가 아니다!!!!!!
       >> 없는 아이야! 라고 답변함
       >> null을 리턴하는 것은 


[application을 이용한 SNS 예제]
1. index2.jsp
         로그인 form
         로그인한 사람의 이름(id)을 전달

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <% request.setCharacterEncoding("UTF-8"); %>
    <%session.invalidate(); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>

<form action="main2.jsp" method="post">
	<input type="text" name="id">
	<input type="submit" value="로그인">
</form>

</body>
</html>


2. main2.jsp
         [로그인한 사림 이름]님 : [     (msg)  ] [글쓰기]
        --------------------------------------------------
         banana        하이 :D
         banana        (*^▽^*)
         aaa             ㅎㅇ
         >> application scope에 저장

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
    <% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SNS 창</title>
</head>
<body>

<% 
	String id = request.getParameter("id"); 
	if(id!=null){ // index2.jsp를 통해서 페이지를 출력할때에만
		session.setAttribute("id", id);
		// session으로 해야한다/ 보안상의 문제로...
	}
%>

<form action="add2.jsp" method="post">
	[<%=request.getParameter("id") %>]님 : <input type="text" name="msg"> <input type="submit" value="글쓰기"><br>
	---------------------------------------------------<br>
	<%
		ArrayList<String> ids = (ArrayList<String>)application.getAttribute("ids");
		ArrayList<String> msgs = (ArrayList<String>)application.getAttribute("msgs");
		if(ids==null && msgs==null){
			out.println("<h3>유저와 메세지가 없습니다.</h3>");
		}
		else{
			for(int i=0;i<ids.size(); i++){
				out.println(ids+"\t"+msgs+"<BR>");	
			}
			
		}
	%>
	<!-- 강사님 방법 -->
	[<%=session.getAttribute("id")%>]님 : <input type="text" name="msg"><input type="submit" value="글쓰기">

</form>
<hr>
<ol>
<%
	ArrayList<String> datas=(ArrayList)application.getAttribute("datas");
	if(datas==null){
		out.println("아직 내용이 없습니다.");
	}
	else{
		for(String v : datas){
			out.println("<LI>"+v+"</LI>");
		}
	}
%>
</ol>

</body>
</html>


[글쓰기]버튼  클릭시
3. add2.jsp
         누가 어떤 msg를 작성했는지 AL<String>에 저장

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
    <% request.setCharacterEncoding("UTF-8"); %>


<% 
	String id = (String)request.getParameter("id");
	String msg = (String)request.getParameter("msg");

	ArrayList<String> ids = (ArrayList)application.getAttribute("ids");
	ArrayList<String> msgs = (ArrayList)application.getAttribute("msgs");
	if(ids==null && msgs==null){
		ids = new ArrayList<String>();
		msgs = new ArrayList<String>();
	}
	ids.add(id);
	msgs.add(msg);
	application.setAttribute("ids", ids);
	application.setAttribute("msgs", msgs);
	// history.go(-1)을 사용해보았지만.. 
%>
<!--  강사님 방법 -->
<%
	String tmsg=request.getParameter("msg");
	tmsg=session.getAttribute("id")+"      "+tmsg;

	ArrayList<String> datas=(ArrayList)application.getAttribute("datas");
	
	if(datas==null){
		datas=new ArrayList<String>();
		application.setAttribute("datas", datas);
	}
	datas.add(tmsg);
	
	response.sendRedirect("main2.jsp");
%>