Model 2

- Controller 클래스 만들때 Java Servlet 으로 만든다

- View 페이지에 출력할때 표현 언어(EL) 사용 

- JSTL 사용자 정의 태그 : 태그를 만들어서 사용 <%@ taglib %>

-> Model 2 전에 Java Servlet, EL(표현언어), JSTL 학습할 것

 

Spring

- Model 2 빠른 개발 위한 프레임 워크

 

내장 객체 메소드 찾아보기

- Java EE 라이브러리의 클래스/인터페이스를 찾아서 내장객체 사용

- Java EE 라이브러리는 Apache Tomcat 에 설치되어있다

ex) JavaEE -> Apache Tomcat lib 폴더의 servlet-api.jar 파일 안에 있다

 


JSP의 영역

- 4가지 영역에 대한 각각의 내장 객체들이 공유 영역 설정

기본  영역 쓰임새
pageContext PAGE (한번의 요청을 처리하는) 하나의 JSP 페이지 내에서 공유될 값을 저장한다
request REQUEST 한번의 요청을 처리하는데 사용되는 모든 JSP 페이지에서 공유될 값을 저장한다
session SESSION 한 사용자와 관련된 정보를 JSP 들이 공유하기 위해서 사용된다
application APPLICATION 모든 사용자와 관련해서 공유할 정보를 저장한다

- PAGE 영역 : 페이지를 벗어나면 공유 불가, 변수에 저장하면 되므로 잘 사용하지 않음

- SESSION 영역 : 회원가입에서 많이 사용, 로그인시 세션 설정, 로그아웃시 세션 끊기

- REQUEST 영역 : 현재 공유설정했으면 이 페이지부터 다음 페이지까지가 공유 영역

- APPLICATION 영역 : 다른 폴더 내에서도 공유 가능

- 모든 객체에서 각 영역에 대해 공유 설정하고 공유 값을 얻어오는 메소드가 같다

ex) setAttribute() 로 공유 설정, getAttribute() 로 공유 값 얻어오기 는 각 객체가 동일

 

pageContext

- 개별적인 page 하나가 PAGE 영역이 됨

 

session

- 세션들마다 아이디를 하나씩 부여해서 서버측 메모리에 저장함

- 한번 세션 연결하면 세션을 연결한 같은 종류의 브라우저끼리는 그 세션 id 를 공유하므로 연결상태 유지가능

- 주로 로그인시 session 을 연결하고 로그아웃시 session 을 끊으므로 그 사이가 범위가 된다

 

request

- REQUEST 영역은 특정 페이지에서 request 객체로 공유 설정하면 그 다음 페이지까지 일반적으로 request 영역

- 뷰페이지에 request 객체로 공유한 값을 뿌려주기 위해서 EL (표현언어) 사용

- 공유한 값들은 Controller 를 통해서 뷰페이지에 뿌려줄때 공유된 값을 쉽게 쓰기 위해서 표현언어 사용

- REQUEST 영역은 PAGE 보다 넓고 SESSION 보다 좁음

- request 객체는 클라이언트의 get/post 요청을 받기도 하지만 영역에 관련된 내장객체이기도 하다

 

JSP의 영역 예제

실습 준비

 

JSP의 영역 예제 1

APPLICATION 영역과 SESSION 영역

- attributeTest1_Form.jsp & attributeTest1.jsp & attributeTest2.jsp & attributeTest3.jsp

- attributeTest1_Form.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
<title>Attribute Test Form</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<form action="attributeTest1.jsp" method="post">
<table border="1">
	<tr><td colspan="2">Application 영역에 저장할 내용들</td></tr>
	<tr>
		<td>이름</td>
		<td><input type="text" name="name"></td>
	</tr>
	<tr>
		<td>아이디</td>
		<td><input type="text" name="id"></td>
	</tr>
	<tr>
		<td colspan="2"><input type="submit" value="전송"></td>
	</tr>
</table>
</form>
</body>
</html>

- Application 영역에 저장할 내용들을 입력

- 가입하는 양식 폼, action 값이 attributeTest1.jsp

- Application 영역에 저장할 값인 이름, 아이디

- get/post 등으로 값을 넘긴게 아니라 공유한 값을 가져와서 뿌린 것이다.

- attributeTest1.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
<title>Attribute Test</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<%
request.setCharacterEncoding("euc-kr");
String name=request.getParameter("name");
String id=request.getParameter("id");
if(name!=null&&id!=null){
	// application 객체로 공유 설정
	application.setAttribute("name",name);
	application.setAttribute("id",id);
}
%>
<h3><%=name %>님 반갑습니다.<br><%=name %>님의 아이디는 <%=id %>입니다.</h3>
<form action="attributeTest2.jsp" method="post">
<table border="1">
	<tr><td colspan="2">Session 영역에 저장할 내용들</td></tr>
	<tr>
		<td>e-mail 주소</td>
		<td><input type="text" name="email"></td>
	</tr>
	<tr>
		<td>집 주소</td>
		<td><input type="text" name="address"></td>
	</tr>
	<tr>
		<td>전화번호</td>
		<td><input type="text" name="tel"></td>
	</tr>
	<tr>
		<td colspan="2"><input type="submit" value="전송"></td>
	</tr>
</table>
</form>
</body>
</html>

<인코딩>

- post 방식으로 한글 값을 받았으므로 한글 인코딩 문제를 해결하기 위해 request.setCharaterEncoding() 으로 인코딩

- 위쪽에서 charset 이 EUC-KR 이므로 EUC-KR 로 값을 인코딩 시킨다

<값 받음>

- name != null && id != null 은 이름과 아이디를 잘 받았다면 이라는 의미

- 이전 파일 attributeTest1_Form.jsp 에서 사용자가 입력한 이름, 아이디를 request.getParameter() 로 값을 받음

- 그리고 받은 값을 화면에 뿌림

<공유 설정>

- 가장 넓은 영역인 APPLICATION 영역에 공유설정, 전체 어플리케이션이 하나의 영역이다

- 그 값들을 application 객체의 setAttribute() 메소드로 APPLICATION 영역 공유 설정함

- 폴더가 달라지더라도 공유한 값을 구해올 수 있는 영역이다, 페이지가 몇단계 넘어가더라도 공유한 값 가져올 수 있다

<입력>

- SESSION 영역에 공유 설정할 값을 입력하는 입력창을 만듬

- 입력받은 값을 post 방식으로 attributeTest2.jsp 파일로 전송

- attributeTest2.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
<title>Attribute Test</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<%
request.setCharacterEncoding("euc-kr");
String email=request.getParameter("email");
String address=request.getParameter("address");
String tel=request.getParameter("tel");

// session 객체로 공유 설정
session.setAttribute("email",email);
session.setAttribute("address",address);
session.setAttribute("tel",tel);

String name=(String)application.getAttribute("name");
%>
<h3><%=name %>님의 정보가 모두 저장되었습니다.</h3>
<a href="attributeTest3.jsp">확인하러 가기</a>
</body>
</html>

- 인코딩 이후 attributeTest1.jsp 파일에서 넘어온 값을 getParameter() 메소드로 받음

- 그 값들을 session 객체의 setAttribute() 메소드로 SESSION 영역에 공유 설정함

- 그리고 APPLICATION 영역에 공유설정되어있던 이름값을 가져오고 뿌린다

- 확인하러 가기 를 클릭시 attributeTest3.jsp 파일로 넘어간다, 값 전달하며 넘어가는 것이 아니라 그냥 하이퍼링크로 넘어간다

- attributeTest3.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="java.util.Enumeration"%>
<html>
<head>
<title>Attribute Test</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<table border="1">
	<tr><td colspan="2">Application 영역에 저장된 내용들</td></tr>
	<tr>
		<td>이름</td>
		<td><%=application.getAttribute("name") %></td>
	</tr>
	<tr>
		<td>아이디</td>
		<td><%=application.getAttribute("id") %></td>
	</tr>
</table>
<br>
<table border="1">
	<tr><td colspan="2">Session 영역에 저장된 내용들</td></tr>
<%
Enumeration e=session.getAttributeNames();
while(e.hasMoreElements()){
	String attributeName=(String)e.nextElement();
	String attributeValue=(String)session.getAttribute(attributeName);
	%>
	<tr>
		<td><%=attributeName %></td>
		<td><%=attributeValue %></td>
	</tr>
	<%
}
%>
</table>
</body>
</html>

- 앞에서 application 객체와 session 객체로 공유한 값들을 구해오서 표에서 출력

- 페이지가 계속 넘어가고 값을 전달하지 않았지만 공유가 되기때문에 값을 구해올 수 있다

- APPLICATION 영역의 공유 값을 name, id 라는 속성(네임) 으로 구한다, 언제든지 구해올 수 있는 값이다

+ APPLICATION 영역 공유값은 서로 다른 폴더에서도 구해올 수 있다

- SESSION 영역의 공유 값을 구해올 때는 해당 네임 값을 모르는 경우에 네임과 값을 구해오는 방식이다.

+ 원래는 SESSION 영역의 시간을 정하지만 여기선 설정하지 않았으므로 브라우저를 닫을때 까지이다.

- 페이지가 넘어갈때마다 값을 전달하지 않아도 값을 공유시키면 된다

- 네임 값을 아는 경우 공유 값을 구하는 코드로 바꾸자 (아래 코드)

	<tr>
		<td>email</td>
		<td><%=session.getAttribute("email") %></td>
	</tr>
	<tr>
		<td>tel</td>
		<td><%=session.getAttribute("tel") %></td>
	</tr>
	<tr>
		<td>address</td>
		<td><%=session.getAttribute("address") %></td>
	</tr>
</table>

코드 변경 후 출력
코드 변경 전 출력

 

 

- 전체 출력

1

 

2
3
4

- 현재 get/post 등으로 값을 넘긴게 아니라 공유한 값을 가져와서 뿌린 것이다.

 

JSP의 영역 예제 2

PAGE 영역과 REQUEST영역

- attributeTest4.jsp & requestTest5Result.jsp

- attributeTest4.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("pageScope", "pageValue");
request.setAttribute("requestScope", "requestValue");
%>

pageValue = <%=pageContext.getAttribute("pageScope") %><br>
requestValue = <%=request.getAttribute("requestScope") %>
</body>
</html>

- pageContext 객체로 PAGE 영역 공유 설정하고 있다

- request 객체로 REQUEST 영역 공유 설정하고 있다

- 아래에서 getAttribute() 메소드로 공유 설정한 각 영역의 공유값들을 구해온다

- PAGE 영역은 하나의 페이지 내에서 공유 가능, 변수를 만들고 변수값을 출력할 수 있는 방법이 있기에 잘 쓰지 않는다

- REQUEST 는 다음 페이지까지 공유 가능 

- PAGE 영역 공유설정시엔 page 객체가 아니라 pageContext 객체로 공유설정을 해야한다

 

- requestTest5.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("pageScope", "pageValue");
request.setAttribute("requestScope", "requestValue");
%>
<jsp:forward page="requestTest5Result.jsp"></jsp:forward>
</body>
</html>

- 이 문서 실행 시 pageContext 와 request 객체로 공유설정하는 내용은 앞의 예제와 같다
- PAGE 영역과 REQUEST 영역에 공유 설정만 하는 코드

- jsp 의 태그 중 하나인 action 태그인 forward action 태그 이다, 이 태그를 만나면 지정된 페이지로 이동함

- requestTest5Result.jsp 페이지로 바로 이동함

 

- requestTest5Result.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
pageValue = <%=pageContext.getAttribute("pageScope") %><br>
requestValue = <%=request.getAttribute("requestScope") %>
</body>
</html>

- 페이지가 바뀌었으므로 PAGE 영역 범위를 벗어나므로 pageContext 객체로 공유된 값은 사용 불가, null 로 나올 것

- REQUEST 영역은 페이지가 한단계 이동하면 거기까지가 REQUEST 영역이므로 request 객체로 공유한 값 사용 가능

- 즉 이전페이지에서 request 객체로 공유 설정했으므로 한단계 이동한 페이지인 이 페이지까지 유효한 범위임

+ 개별적인 페이지 하나가 PAGE 영역

 

+ 기타 객체

- config 객체 : 환경 설정 파일에 대해서 사용

- exception 객체 : 예외처리시 주로 사용

 

JSP의 영역 예제

실습 준비

 

JSP의 영역 예제 3

- login.jsp & selProduct.jsp

- login.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>login.jsp</title>
</head>
<body>
<center>
	<H2>로그인</H2>
	<form name="form1" method="POST" action="selProduct.jsp">
		<input type="text" name="username"/>
		<input type="submit" value="로그인"/>
	</form>
</center>
</body>
</html>

- '로그인' 버튼 클릭시 selProduct.jsp 로 입력한 id 값을 post 방식 값 전달

 

- selProduct.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>selProduct.jsp</title>
</head>
<%
	// HTML FORM 에서 전달된 데이터의 한글인코딩
	request.setCharacterEncoding("euc-kr");
	
	// session 에 username 이름으로 HTML FORM 의 <input type="text" name="username"/> 에 입력된 값을 저장함. 
	session.setAttribute("username",request.getParameter("username"));
%>
<body>
<center>
	<H2>상품선택</H2>
	<HR>
	<%=session.getAttribute("username") %>님이 로그인 한 상태 입니다.

	${username}
	<HR>
	<form name="form1" method="POST" action="add.jsp">
		<SELECT name="product">
			<option>사과</option>
			<option>귤</option>
			<option>파인애플</option>
			<option>자몽</option>
			<option>레몬</option>
		</SELECT>
		<input type="submit" value="추가"/>
	</form>
	<a href="checkOut.jsp">계산</a>
</center>
</body>
</html>

- 한글값이 username 이라는 네임값이 post 방식으로 전달되므로 한글값 인코딩 처리를 한다

- request.getParameter() 메소드로 네임인 username 을 통해 전달된 값을 받는다

- 받은 그 값을 SESSION 영역에 공유 설정한다, 여기서부터 SESSION 영역이 시작된다

+ 페이지가 바뀌더라도 사용가능

- select-option 에서 값을 선택하고 '추가' 를 누르면 form 을 통해 add.jsp 로 선택값이 넘어감

+ select-option 에서 option 에 value 값이 없을때는 option 태그 안에 쓰인 값이 value 로 넘어감, 즉 select 태그의 name 인 product 변수에 선택된 '사과' 가 저장됨

- '계산' 을 누르면 checkOut.jsp 로 페이지 이동

+ 코드에서 EL(표현언어) 를 통해 한번 더 아이디를 출력하고 있음

- 이게 표현언어이다.

 

- '추가' 시 장바구니에 과일이 담김 (add.jsp)

- 이런식으로 다른 과일들을 몇개 추가

- 장바구니에 담긴 과일들을 보여줌 (checkOut.jsp)

 

- add.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.util.ArrayList"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%	

	// HTML 폼에서 입력된 한글 처리를 위한 부분
	request.setCharacterEncoding("euc-kr");

	// product 속성으로 전달된 파라미터를 읽어옴.
	String productname = request.getParameter("product");

	// session scope 에 저장된 productlist 라는 이름의 ArrayList 객체를 가지고 옴.
	ArrayList list = (ArrayList)session.getAttribute("productlist");

	// 만일 null 인 경우 처음 데이터를 추가한 것이므로 새로운 ArrayList 생성
	if(list == null) {
		list = new ArrayList();
	}

	// ArrayList 에 새로운 데이터 추가
	list.add(productname);
	session.setAttribute("productlist",list);
%>

	<!-- 자바스크립트를 이용해 간단한 메시지 출력  -->
	<script>
		alert("<%=productname %> 이(가)추가 되었습니다.!!");
		history.go(-1);
	</script>
</body>
</html>

- 한글값이 post 방식으로 넘어오므로 euc-kr로 인코딩 처리를 함

- select 의 name 값이었던 product 변수(속성, 네임) 을 통해 getParameter() 로 선택된 값을 구해서 productname 변수에 저장

- 처음에 아무것도 추가하지 않았기 때문에 이 list 는 null 이다, 그래서 null 인 경우 ArrayList 객체를 만들어줌

- 메세지박스로 추가된 과일 알려주고 그 후 상품을 선택할 수 있게끔 이전 파일로 돌아감

 

'추가' 된 과일들을 장바구니에 저장

	// session scope 에 저장된 productlist 라는 이름의 ArrayList 객체를 가지고 옴.
	ArrayList list = (ArrayList)session.getAttribute("productlist");

- 세션에 저장된 값을 구하기 위해 getAttribute("productlist") 사용, 이 productlist 를 세션 영역 공유 설정한 것은 아래 코드

- 처음에 아무것도 추가하지 않았기 때문에 이 list 는 null 이다, 그래서 null 인 경우 ArrayList 객체를 만들어줌

- Object 로 리턴하고 저장된 값이 리스트이므로 ArrayList로 다운캐스팅 하는 것이다

	// ArrayList 에 새로운 데이터 추가
	list.add(productname);
	session.setAttribute("productlist",list);

- 정의된 리스트에 add() 로 추가된 과일을 저장한다

- session.setAttribute("productlist", list); 를 통해 세션에 리스트를 저장함, setAttribute() 에서 두번째 매개변수는 Object 이므로 리스트 또한 들어갈 수 있다

- 사용자가 다시 다른 과일(자몽) 선택후 추가시 위의 코드 getAttribute() 에서 리스트를 구해오고 아래코드로 리스트에 자몽을 추가하고 그 리스트를 세션 영역 공유 설정

+ 세션 영역은 브라우저 창을 닫는 순간 또는 invalidate() 로 세션 전체삭제나 removeAttribute() 로 세션 삭제로 세션을 끊을때까지 유효함

- checkOut.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.util.ArrayList"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<H2>계산</H2>
선택한 상품 목록
<HR>
<%

	// session scope 에 저장된 productlist 라는 이름의 ArrayList 객체를 가져옴.
	ArrayList list = (ArrayList)session.getAttribute("productlist");

	// 선택한 상품이 하나도 없는 경우
	if(list == null) {
		out.println("선택한 상품이 없습니다.!!!");
	}
	else {

		// 선택한 상품이 있을 경우 리스트를 출력함.
		for(Object productname:list) {
			out.println(productname+"<BR>");
		}
	}
%>
</center>
</body>
</html>

- 세션에 공유된 list 를 getAttribute() 로 list 를 구한다, 리스트 객체가 저장되어있으므로 ArrayList 로 다운캐스팅 한다

- '계산' 을 눌렀을 당시 선택한 제품이 하나도 없는 경우 list 는 null

- 선택한 제품이 있을때는 향상된 for 문으로 그 list 에서 하나씩 가져와서 출력한다

 

 

+ request 객체로 영역설정은 Model 2 에서 자주 사용한다

-게시판 쪽의 목록을 가져오기 위한 Service 클래스 에서 View 페이지에서 필요한 값들을 request 객체로 공유 설정

- 사용자가 선택한 page 번호 등을 request 객체로 공유 설정

+ 지금은 getAttribute() 로 값을 가져오는데 나중엔 request.getAttribute(name값) 로 값을 받아와서 다운캐스팅, 언박싱 하는 번거로운 방법 대신 표현 언어(EL) 를 사용해서 ${listcount} 하면 공유값 가져오기부터 출력까지 바로 가능

 

+ session 은 로그인 성공시 session 객체로 공유 설정

+ 자바 클래스에선 session 내장 객체가 없으므로 request.getSession() 으로 받아서 사용


JSP 내장 객체 (이어서)

application 객체

- 가장 넓은 영역에 공유 설정하는 객체

 

application 객체 예제

실습 준비

 

application 객체 예제

- setApplicationAttribute.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%
//    String name = request.getParameter("name");
//    String value = request.getParameter("value");
    
	String name = "test";
	String value = "1234";
	
    if (name != null && value != null) {
        application.setAttribute(name, value);	// 공유 설정
//        application.setAttribute("test", "1234");	// 위와 같다
    }
%>

<html>
<head><title>application 속성 지정</title></head>
<body>
<%
    if (name != null && value != null) {
%>
application 기본 객체의 속성 설정:
 <%= name %>  = <%= value %>
<%
    } else {
%>
application 기본 객체의 속성 설정 안함
<%
    }
%>
</body>
</html>

- application 객체로 APPLICATION 영역에 공유설정되었으므로 폴더가 달라져도 공유한 값을 쓸 수 있다

- 공유되는 name 은 test, 값은 1234

+ 이 파일을 실행해야 APPLICATION 영역에 공유 설정됨

 

- 폴더가 다른 곳에서 공유한 값을 불러오자

- WebContent/index.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>
처음 작성하는 JSP 프로그램 <br>

application 객체로 공유한 값:
<%=application.getAttribute("test") %>
</body>
</html>

- APPLICATION 영역에 공유설정된 값은 폴더가 달라져도 공유한 값을 쓸 수 있다

+ 영역이 너무 넓기때문에 자주 사용되지는 않는다


JSP 에러처리

 

JSP 에러처리 두가지 방법

1. 각 페이지별로 에러 처리

2. web.xml 파일에 에러 코드(종류)별로 등록

+ web.xml 은 아파치 톰캣 구동시 가장 먼저 실행되는 환경설정 파일

 

1. 각 페이지별로 에러 처리

- 페이지 지시어태그에서 사용할 수 있는 속성 4가지 중 에러 처리 관련 속성이 2가지 있다

 

1) errorPage 속성으로 경로와 에러 페이지명으로 파일을 지정

<%@ page errorPage = "예외발생시보여질JSP지정" %>

2) 그 파일에서 isErrorPage 속성을 true로 지정 (기본값 false)

<% page isErrorPage = "true" %>

- isErrorPage 속성이 true 인 경우 에러 페이지로 지정

 

- errorPage 속성 : JSP 에서 에러처리할때, 에러를 보여줄 페이지명을 지정

- isErrorPage 속성 : 지정된 에러를 보여줄 페이지 안에서 true 로 설정해야함

 

3) 그 후 내장객체 exception 으로 에러 메세지를 구해와서 어떤 원인인지 출력

- exception 기본 객체 : 발생할 예외 객체
- exception.getMessage() : 예외메세지
- exception.printStackTrace() : 예외 추적 메세지 출력

 

2. web.xml 파일에 에러 코드(종류)별로 등록

- 404 에러를 web.xml 파일에 등록하면 404 에러가 발생했을때 하위에 location 으로 지정된 파일이 출력됨(실행됨)

- 500 에러를 web.xml 파일에 등록하면 500 에러가 발생했을때 하위에 location 으로 지정된 파일이 출력됨(실행됨)

- 에러 코드별 뿐만 아니라 에러 종류별로도 등록가능하다 ex) NullPointerException

 

JSP 에러처리 예제

실습 준비

- 'JSP 페이지의 에러 처리' 폴더 안의 내용을 가져옴

 

JSP 에러처리 예제 1
1. 각 페이지별로 에러 처리

- readParameter2.jsp (에러처리 안함) vs readParemeter1.jsp (에러처리 함) & error/viewErrorMessage.jsp (에러페이지)

- readParameter2.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<html>
<head><title>파라미터 출력</title></head>
<body>

name 파라미터 값: <%= request.getParameter("name").toUpperCase() %>

</body>
</html>

- 에러처리를 하지 않은 파일이다

- name 값을 전달해주는 파일이 없다, 전달되는 값이 없기때문에 500 번 에러 발생

- 500번 오류는 소스코드 상의 오류이다

 

+ 각 에러 상황별 코드가 있다

+ 값이 전달되지 않았는데 받는 경우 500 에러가 나온다

- 어디서 에러가 발생했는지 알려준다

 

에러 처리한 파일

- readParameter.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page errorPage = "/error/viewErrorMessage.jsp" %>
<html>
<head><title>파라미터 출력</title></head>
<body>

name 파라미터 값: <%= request.getParameter("name").toUpperCase() %>

</body>
</html>

- 500 번 메세지를 알려주는 창 말고 에러 메세지를 뿌리자

- errorPage 속성에 실제 에러를 보여줄 페이지를 지정한다

- erro 폴더 안의 viewErrorMessage.jsp 파일

- error/viewErrorMessage.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page isErrorPage = "true" %>
<html>
<head><title>에러 발생</title></head>
<body>

요청 처리 과정에서 에러가 발생하였습니다.<br>
빠른 시간 내에 문제를 해결하도록 하겠습니다.
<p>
에러 타입: <%= exception.getClass().getName() %> <br>
에러 메시지: <b><%= exception.getMessage() %></b>
</body>
</html>
<!--
만약 에러 페이지의 길이가 512 바이트보다 작다면,
인터넷 익스플로러는 이 페이지가 출력하는 에러 페이지를 출력하지 않고
자체적으로 제공하는 'HTTP 오류 메시지' 화면을 출력한다.
인터넷 익스플로러에서도 에러 페이지 내용을 올바르게 출력하려면
응답 결과에 이 주석과 같은 내용을 포함시켜서
에러 데이터가 512 바이트를 넘도록 해야 한다.
-->

- 지정된 파일인 viewErrorMessage 파일에도 isErrorPage 속성값을 "true" 로 설정해줘야한다
+ isErrorPage 속성 기본값이 false
- errorPage 속성과 isErrorPage 속성을 통해 500 번 오류 발생 대신 지정된 페이지 내용을 출력(실행)

- exception 객체를 이용해서 에러 타입과 에러 메세지를 구해온다.

JSP 에러처리 예제 2

+ 자바처럼 try-catch 구문 사용해서 에러 처리할 수도 있다

- try 문 안에 getParameter() 를 사용하고 catch 안에 파라미터가 올바르지 않습니다 라는 내용 출력

- readParameterWithTry.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<html>
<head><title>파라미터 출력</title></head>
<body>

name 파라미터 값: 
<% try { %>
<%= request.getParameter("name").toUpperCase() %>
<% } catch(Exception ex) { %>
name 파라미터가 올바르지 않습니다.
<% } %>
</body>
</html>

 

JSP 에러처리 예제 3

1. 각 페이지별로 에러 처리

- bufferOverflow.jsp

- 에러페이지를 error/viewErrorMessage.jsp 로지정

<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page buffer="1kb" %>
<%@ page errorPage = "/error/viewErrorMessage.jsp" %>
<html>
<head><title>버퍼 플러시 이후 에러 발생 결과</title></head>
<body>

<%  for (int i = 0 ; i < 300 ; i++) { out.println(i); }  %>

<%= 1 / 0 %>

</body>
</html>

- buffer 속성값은 기본값이 8kb, buffer 속성으로 크기를 1kb 로 수정

<에러발생>

1. 1 부터 300 까지 출력하기 전에 버퍼 공간이 부족해서 에러가 발생

2. 1을 0 으로 나눌때도 ArithmeticException 에러가 발생

- 에러 메세지를 보여줄 페이지를 viewErrorMessage.jsp 로 지정하고 있다

+ 그 후 viewErrorMessage.jsp 에서 isErrorPage 속성 "true" 로 해야한다

- 실행시

- viewErrorMessage.jsp 의 내용이 출력되고 있다

- 버퍼 공간이 부족해서 300까지 출력하지 못하고 있다

- 1 을 0 으로 나눌때 발생하는 ArithmeticException 예외가 발생했으므로 관련 내용이 여기 출력됨

 

- 첫번재 방법인 페이지마다 지정하는 방법은 페이지마다 errorPage 를 지정해야함

- 각 페이지별로 에러 처리하는 방법은 페이지가 적을때 가능한 페이지이다.


2. web.xml 파일에 에러 코드(종류)별로 등록

- 주로 web.xml 에 에러 코드, 에러 종류를 등록하는 방법을 사용한다

- 에러 코드(404, 500) 등록시 location 에 지정된 파일이 브라우저 창에 나타남

- 에러 종류(java.lang.NullPointException, java.lang.ArithmeticException) 등록시 location 에 지정된 파일이 브라우저 창에 나타남

- 페이지별 처리보다 간결하다

- 단점 : 개발 과정에서는 에러를 쉽게 찾기 힘듬

+ 404 : 주어진 위치에 해당 파일이 없을때 발생하는 에러

 

JSP 에러처리 예제

2. web.xml 파일에 에러 코드(종류)별로 등록

실습 준비

- web.xml 에 이 부분을 복붙

JSP 에러처리 예제 4

2. web.xml 파일에 에러 코드(종류)별로 등록

- web.xml & readParameter2.jsp

- web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>jspproject</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<error-page>
		<error-code>404</error-code>
		<location>/error/error404.jsp</location>
	</error-page>

	<error-page>
		<error-code>500</error-code>
		<location>/error/error500.jsp</location>
	</error-page>

	<error-page>
		<exception-type>java.lang.NullPointerException</exception-type>
		<location>/error/errorNullPointer.jsp</location>
	</error-page>

</web-app>

- web.xml 파일 : 환경설정 파일, 반드시 WEB-INF 폴더 안에 있어야만 한다

+ Apache Tomcat 이 구동될때 web.xml 의 코드를 가장 먼저 읽어옴

 

+ xml 의 규칙

- 전체를 감싸는 루트 엘리먼트

- 부모 엘리먼트, 자식 엘리먼트는 여러개 쓸 수 있다

 

- readParameter2.jsp 는 에러 처리를 하지 않은 파일이었다

- readParameter2.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<html>
<head><title>파라미터 출력</title></head>
<body>

name 파라미터 값: <%= request.getParameter("name").toUpperCase() %>

</body>
</html>

- 에러 처리를 하지 않은 파일

- web.xml 에 errorNullPointer 에러를 처리했으므로 readParameter.jsp 실행시 error/errorNullPointer.jsp 가 실행됨

- web.xml 에 에러 등록시 브라우저 창에 에러메세지가 보이지 않으므로 개발과정에서 에러를 찾기 힘들다

- 콘솔창에서는 어떤 에러가 발생했는지 확인 가능


+ 환경설정 파일 수정 후에는 서버 재구동되어야 반영됨


JSP 태그 (이어서)

 

지시어 태그

- 지시어 태그 3가지 태그 중 포함 태그 할 것

1) 페이지 태그 <%@ page %>

2) 포함 태그 <%@ include %>

3) 사용자 정의 태그 <%@ taglib %>

 

액션 태그

- jsp 액션 태그는 6가지 종류 

- 그 중 forward 액션 태그와 include 액션 태그 할 것

- forward action 태그 : 지정된 페이지로 바로 이동시킴 <jsp:forward >

- include action 태그 : 다른 문서를 불러오는 용도로 사용 <jsp:include >

+ plugin action 태그 : 자바 애플릿을 불러오는 용도였는데 지금은 애플릿을 사용하지 않으므로 plugin action 태그사용하지 않음

+ usebean, setProperty, getProperty action 태그 : JAVA DAO/ DTO 클래스와 연결시 사용함

 

지시어 태그의 포함 태그 vs 액션 태그의 include action 태그

+ 다른 문서를 불러온다는 점은 같지만 내부적으로 차이가 있음

- 지시어 태그의 포함 태그 : 불러오는 파일과 불려지는 파일이 한개파일로

- 액션 태그의 include action 태그 : 불러오는 파일과 불려지는 파일이 따로

 

액션 태그 (Action Tag)

- JSP에서 액션(Action Tag)는 스크립트, 주석, 디렉티브와 함께 JSP 페이지를 이루고 있는 요소

- 페이지와 페이지 사이의 제어를 이동시킬 수도 있고, 다른 페이지의 실행결과를 현재의 페이지에 포함시킬 수 있으며, 자바빈을 JSP 페이지에서 사용할 수 있는 기능도 제공

- JSP 지원 액션 태그는 6가지 종류가 있다

forward action tag

- <jsp:forward>

- 다른 페이지로 이동할때 사용되는 태그

- forward action tag 가 포함된 페이지는 브라우저에 출력되지 않고 지정된 페이지로 바로 이동

 

include action tag 

- <jsp:include>

- 다른 모듈 페이지를 불러올때 사용, 즉 다른 페이지를 불러올 때 사용

 

useBean, setProperty, getProperty action tag
- 자비빈 (=DTO 클래스) 사용할때 사용하는 액션태그들


forward action tag

- 현재 페이지에서 다른 페이지로 이동시킬때 사용

- 실행되자마자 지정된 페이지로 이동

- 이 태그가 포함된 페이지는 출력되지 않고 바로 포워딩됨

- 계속해서 forwarding 되면 최종적으로 이동한 곳까지가 REQUEST 영역

- 3가지 형식이 있다

 

1. 간단한 형식

<jsp : forward page = " 이동할 페이지명 " />

2.

<jsp : forward page = " 이동할 페이지명 " > </jsp : forward>

3. 값을 가져가는 경우

<jsp : forward page = " 이동할 페이지명 ">
	<jsp : param name = "paramName1" value = "var1" />
	<jsp : param name = "paramName2" value = "var2" />
</jsp : forward>

- paramName1 이 변수가되고, 이 변수에 전달될 값이 var1 이다

- paramName2 rk 변수가되고, 이 변수에 전달될 값이 var2 이다

 

forward action tag 와 REQUEST 영역

- REQUEST 영역 시작으로부터 forward action tag 로 연결된 페이지들은 REQUEST 영역에 해당

 

forward action tag 예제

실습 준비

 

forward action tag 예제 1

forward action tag 와 REQUEST 영역

forward action tag 3가지 형식 중 첫번째

- WebContent/forward/forward1/

- forwardForm1.jsp & forwardFrom1.jsp & forwardTo1.jsp & forwardTo2.jsp

- 세번 페이지를 전달하고 있고, 순서대로 파일이 넘어감

- forwardForm1.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>
	<h1>Forward 사용법 예제</h1>

	<form method=post action="forwardFrom1.jsp">
	아이디 : <input type="text" name="id"><p>
	패스워드 : <INPUT TYPE="password" NAME="password"><p>
			   <input type="submit" value="보내기">
	</form>

	</body>
</html>

- form 으로 다음 페이지로 넘어감

- forwardFrom1.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>
	<h2>포워딩하는 페이지: forwardFrom1.jsp</h2>

	<%
		request.setCharacterEncoding("euc-kr");
	%>

   forwardFrom1.jsp의 내용 입니다.<br>
   화면에 절대 표시 안됩니다.

	<%	// request 객체로 공유 설정
		request.setAttribute("name","홍길동");
	%>
	
	<jsp:forward page="forwardTo1.jsp"/>  

	</body>
</html>

- request 객체로 공유 설정 후 페이지를 넘김

- 여기서부터 REQUEST 영역이 시작되고 forward action tag 로 이동하는 곳인 forwardTo1.jsp 와 forwardTo2.jsp 까지가 REQUEST 영역이다

- 여기선 두번 이동하기때문에 REQUEST 영역은 두번 이동한 곳이기때문임

- 일반적으로 1번만 이동하므로 다음 페이지까지 REQUEST 영역이라고 했지만, 사실 계속 해서 이동하면 계속 이동한 곳까지가 REQUEST 영역

- forward action tag 로 이동되어야만 request 객체의 공유값을 사용 가능

- forward action tag 가 있는 페이지인 forwardForm1.jsp 의 내용은 출력되지 않고 forwardTo1.jsp 파일의 내용으로 바로 감

- forward action tag 가 포함된 페이지는 실행은 되지만 출력은 되지 않는다

ex) 한글값 인코딩 코드와 request 객체로 공유 설정하는 코드는 동작하지만 적힌 글은 출력되지 않음

- forwardTo1.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>
	<h2>포워딩되는 페이지: forwardTo1.jsp</h2>

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

	<b><%=id%></b>님의<p>
	패스워드는 <b><%=password%></b>입니다.

	<jsp:forward page="forwardTo2.jsp"/>  

	</body>
</html>

- REQUEST 가 시작된 곳으로 부터 다음 페이지이다

- 가장 첫 페이지인 forwardForm1.jsp의 request 객체에서 form 태그의 action으로 보낸 값을 여기서 getParameter()로 전달된 값을 받고 있다

- request 객체의 form 태그의 action 으로 보낸 값도 forward action tag 로 이어져 있는 다음의 모든 페이지에서 값을 구해올 수 있다

- forward action tag 가 있는 페이지인 forwardTo1.jsp 의 내용은 출력되지 않고 forwardTo2.jsp 파일의 내용으로 바로 감

- forward action tag 가 포함된 페이지는 실행은 되지만 출력은 되지 않는다

- forwardTo2.jsp (최종 페이지)

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

    
    ID : <%=request.getParameter("id")%> <br>
    password : <%=request.getParameter("password")%> <br>
    
    request 객체로 공유한 값 출력 <br>
    <%=request.getAttribute("name")%>

- forward action tag 로 연결된 다른 파일들에선 출력이 불가능하므로 최종 페이지인 여기서 출력을 한번 해야한다

- 계속해서 forward action tag 로 이어진 페이지들의 최종 페이지이므로 REQUEST 영역이 여기까지 해당된다

- 그러므로 request 객체 전달값이나 request 객체 공유값을 구해올 수 있다

- request 객체 전달값을 여기서 받고 있다, forward action tag 로 이어진 곳이므로 가능

- request 객체 공유값을 여기서 받고 있다, forward action tag 로 이어진 곳이므로 가능

 

request 객체 공유값 vs request 객체 전달값

request 객체의 역할 두가지

1. request 객체는 REQUEST 영역에서 사용할 수 있는 공유 값을 설정하거나 구해온다

2. request 객체는 form 태그의 action 으로 전달한 값들을 받는 역할을 한다, 클라이언트의 요청 처리

 

- REQUEST 영역은 다음 페이지까지가 아니라 forward action tag 로 이어진 순차적인 모든 페이지 이다

1. request 객체로 공유값을 받아올 때는 forward action tag 로 이어진 순차적인 모든 페이지에서 값을 받아올 수 있다

2. request 객체로 전달값을 구해올 때도 forward action tag 로 이어진 순차적인 모든 페이지에서 값을 구해올 수 있다

 

예제에서의 REQUEST 영역

- forward action tag 로 총 2번 전달하고 있다

- forwardFrom1.jsp -> forwardTo1.jsp -> forwardTo2.jsp

- forwardFrom1.jsp 에서 REQUEST 영역이 시작되었고 REQUEST 영역은 forwardTo1.jsp 뿐만 아니라 forward action tag 로 이어진 forwardTo2.jsp 도 해당

 

request 객체 공유 주의

- forward action 태그로 이동시켜야만 REQUEST 영역 안에 들어가므로 request 객체로 값 공유 가능

- 중간에 location, form-action, meta 등으로 페이지 이동시 REQUEST 영역에서 벗어나므로 request 객체로 값 공유 불가

 

+ forward action tag 작성 주의

- forward action tag 는 이 자체로 태그이므로 스크립틀릿 태그 안에 쓰면 안된다

- HTML 태그처럼 독립된 태그이므로 따로 쓰기

// <% 	<jsp:forward page="forwardTo1.jsp"/>  %> // 틀린 표현
	<jsp:forward page="forwardTo1.jsp"/>

 

forward action tag 예제 2

forward action tag 와 REQUEST 영역

forward action tag 3가지 형식 중 두번째

- WebContent/forward/forward2/

- forwardForm2.jsp & forwardFrom2.jsp

- a.jsp, b.jsp, ab.jsp, o.jsp 는 각 혈액형별 특징들을 알려주는 파일

 

- forwardForm2.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<head>
	<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
	<script>
	
	$(document).ready(function(){
		
		$(":submit").click(function(){
			
			if($("#name").val() == ""){
				alert("이름을 입력 하세요");
				$("#name").focus();
				return false;
			}
			
			if($("#a").is(":checked") == false &&
			   $("#b").is(":checked") == false &&	
			   $("#o").is(":checked") == false &&
			   $("#ab").is(":checked") == false){
				alert("혈액형을 선택 하세요");
				return false;
			}		
			
		});
		
	});	
	
	</script>
	</head>
	<body>

	<h1>포워딩될 페이지에 파라미터값 전달하기 예제</h1>

	<form method=post action="forwardFrom2.jsp">
	이름 : <input type=text id="name" name="name"> <br><br>
	
	당신의 혈액형은?<p> 
	
	<input type="radio" id="a" name="bloodType" value="a">A형<br>
	<input type="radio" id="b" name="bloodType" value="b">B형<br>
	<input type="radio" id="o" name="bloodType" value="o">O형<br>
	<input type="radio" id="ab" name="bloodType" value="ab">AB형<p>
	<input type="submit" value="보내기">
	</form>

	</body>
</html>

- ex) A 형을 선택시 a.jsp 의 내용이 실행됨

- form 태그의 action 을 통해 forwardFrom2.jsp 로 선택값을 전달한다

 

 

- forwardFrom2.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>

	<h1>포워딩하는 페이지: forwardFrom2.jsp</h1>

	<%
		request.setCharacterEncoding("euc-kr");

//		String name1 = "Lay";
		String bloodType = request.getParameter("bloodType") + ".jsp";
	
//		String bloodType = "a.jsp";
	%>

	<jsp:forward page="<%=bloodType%>"/>

+ 한글값이 깨지지 않도록 인코딩

- 앞의 forwardForm2.jsp 파일에서 select 박스로 부터 form action 으로 넘어온 값을 받아서 .jsp 를 붙여서 forward 시키는 페이지를 지정한다

ex) 앞에서 A형 선택시 'a' 값을 getParameter() 로 받은 후 .jsp 를 붙여서 a.jsp 를 forward action tag 를 써서 이동시킬 페이지로 지정

 

- a.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>

	<h1>포워딩되는 페이지(a.jsp)</h1>

	<%
		String name = request.getParameter("name");
		String bloodType = request.getParameter("bloodType");
	%>

	<b><%=name%></b>님의 혈액형은
	<b><%=bloodType%></b>형이고
	성실하고 신중하며 완벽주의자입니다.

	</body>
</html>

- a.jsp 는 forwardFrom2.jsp 파일과 forward action tag 로 이어져 있는 최종 페이지

- 그러므로 getParameter() 를 통해 forwardForm2.jsp 파일에서 forwardFrom2.jsp 파일로 전송한 값인 name값과 bloodType값. 즉, 이름값과 혈액형 값을 구해올 수 있다

forward action tag 예제 3

forward action tag 와 REQUEST 영역

forward action tag 3가지 형식 중 세번째 : 값을 가져가는 기능

- WebContent/forward/forward3/

- forwardForm3.jsp & forwardFrom3.jsp

- yellow.jsp, blue.jsp, green,jsp, red.jsp 는 선택한 색상에 따라 보여줄 파일

- forwardForm3.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>

	<h2>포워딩될 페이지에 파라미터값 전달하기 예제</h2>

	<form method="post" action="forwardFrom3.jsp">
	이름 입력 : <input type="text" name="name"><br><br>
	색 선택: <br>
	<input type="radio" name="color" value="yellow">노랑색<br>
	<input type="radio" name="color" value="green">초록색<br>
	<input type="radio" name="color" value="blue">파랑색<br>
	<input type="radio" name="color" value="red">빨강색<p>
	<input type="submit" value="확인">
	</form>

	</body>
</html>

- form 태그를 통해 입력된 이름과 선택된 색상을 네임값 name 과 네임값 color 에 저장해서 forwardFrom3.jsp 로 전달

 

 

- 선택한 색상 관련 글과 함께 blue.jpg 보여주고 있다

- forwardFrom3.jsp

<%@ page contentType="text/html;charset=euc-kr"%>

<html>
	<body>

	<h2>포워딩하는 페이지: forwardTagFrom2.jsp</h2>

<%
   request.setCharacterEncoding("euc-kr");

   String name = request.getParameter("name");
   String selectedColor = request.getParameter("color");
%>

<jsp:forward page="<%=selectedColor+\".jsp\"%>">
    <jsp:param name="selectedColor" value="<%=selectedColor%>"/>
	<jsp:param name="name" value="<%=name%>"/>
</jsp:forward>

- 넘어온 한글값이 깨지지 않도록 인코딩

- 앞에서 넘어온 값을 name, color 네임값을 통해서 구하고 name, selectedColor 변수에 저장한다

- jsp forward action tag 3번째 형식을 사용하면서 값을 전달하고 있다

- selectedColor 는 두곳에 사용하고 있다, 이동할 페이지명 지정과 넘겨줄 값에 사용

- 이렇게 전달된 값들은 request.getParameter() 로 받아야한다!

 

ex) 만약 사용자가 노란색을 클릭해서 color 값이 yellow 라면

- selectedColor 는 "yellow" 가 되고 forward 할 파일은 yellow.jsp 파일

- 전달할 값1은 selectedColor 라는 네임에 해당하는 값인 yellow

- 전달할 값2는 name 이라는 네임에 해당하는 값인 Lay(사용자가 입력한 이름)

 

" " 주의

- 바깥쪽에 " " 를 쓰면 안쪽엔 ' ' 를 써야하는데 JSP 에선 ' ' 를 쓸 수 없다

- 그러므로 .jsp 를 쓰기 위해서 " 앞에 \ 를 붙여준다 -> \".jsp\"

- \ 다음의 특수문자는 그대로 출력한다는 의미

 

- blue.jsp (다른 색상 파일도 마찬가지)

<%@ page contentType="text/html;charset=euc-kr"%>

<%
   String name = request.getParameter("name");
   String selectedColor = request.getParameter("selectedColor");
%>

<h2>포워딩되는 페이지 - <%=selectedColor+".jsp"%></h2>

<b><%=name%></b>님의 좋아하는 색은 "<%=selectedColor%>"이고
자기탐구와 내적성장을 상징하는 색입니다.<br><br>

<img src="<%=selectedColor+".jpg"%>" border="0" width="70" height="30">

- 이 최종 파일에서는 request.getParameter() 를 통해 4가지 값을 구해올 수 있다

1. forwardForm3.jsp 파일의 폼에서의 네임값인 name, color 값들을 가져올 수 있다

2. forwardFrom3.jsp 파일에서 forward action tag 로 전달된 값의 네임값인 name, selectedColor 의 값들을 가져올 수 있다.

- 즉 총 4개의 값을 구해올 수 있다

 

이때 중복된 네임값인 name값은 두가지 값 중 어떤 값을 의미할까?

- 같은 이름일때 가까운 파일의 name값이 출력된다

- 여기선 forward action tag 로 전달된 name값이 출력됨

 

다음 시간

- include action tag

- include 디렉티브 태그

- DTO, DAO 클래스로 자바와 연동

- 자바빈(=DTO 클래스) 연동 위한 action tag

+ Recent posts