복습
공유
- Model 2에서 주로 공유 설정할때 request 객체 와 session 객체를 사용한다
forward action tag
- 페이지를 이동시켜주는 역할
- 이 태그가 포함된 페이지는 출력되지 않고 바로 포워딩됨
- 계속해서 forwarding 되면 최종적으로 이동한 곳까지가 REQUEST 영역
전체 흐름
- 우리가 지금 쓰고 있는 파일들은 Java Servlet 으로 변환된다.
- 변환된 Java Servlet 을 컴파일 수행하여 바이트코드 만들어서 실행하면
- 실행코드 HTML 로 변환해서 클라이언트의 웹 브라우저가 그걸 출력
include action tag vs include directive tag (include 지시어 태그)
- 불러온 파일과 불려진 파일이 따로 따로 Java Servlet 으로 변환되고 <jsp:include > 로 불러옴
- 불러온 파일과 불려진 파일이 한개의 파일로 결합되서 Java Servlet 파일이 1개 만들어짐 include action tag 로 불러옴
include action tag
- 다른 문서를 불러온다
- 공통적인 내용을 따로 만들고 모듈화된 내용을 불러서 사용
- 값을 전달할 수도 있다
- include action tag 는 불러온 파일과 불려진 파일이 따로 Servlet 클래스로 만들어짐
- 3가지 형식이 있다
1.
<jsp : include page = "포함될 페이지명 " flush = "true | false" />
2.
<jsp : include page = "포함될 페이지명" flush = "true|false" ></jsp : include>
3. 다른 문서를 불러오면서 값을 전달하는 기능이 있다
- 불러온 파일과 불려진 파일이 따로 Servlet 클래스로 만들어지므로 값을 전달하는 게 가능
<jsp : include page = "포함될 페이지명" flush = "true|false">
<jsp : param name = "paramName1" value = "var1" />
<jsp : param name = "paramName2" value = "var2" />
</jsp : include>
flush 속성
- 포함될 페이지로 이동할 때 현재 페이지가 지금까지 출력 버퍼에 저장된 결과를 어떻게 처리할 것인지 결정
- ture 지정시 포함할 내용 삽입 이전에 현재 페이지가 지금까지 버퍼에 저장한 내용 출력 그 후 포함될 페이지 부름
- 이전에 출력시키지 않겠다는 의미인 false 로 쓰는게 일반적
include action tag 예제
실습 준비
- 어제의 forward 와 달리 include는 다른 문서를 불러오는 것이므로 화면에 출력이 된다
include action tag 예제 1
- WebContent/include/include1
- includeForm.jsp & includeMain.jsp & includeSub.jsp
- includeForm.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<html>
<body>
<h1>include 액션태그 사용법 예제</h1>
<form method=post action="includeMain.jsp">
이름 : <input type="text" name="name"><p>
<input type="submit" value="보내기">
</form>
</body>
</html>
- form action 인 includeMain.jsp 로 입력한 값인 이름을 전달한다
- includeMain.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<html>
<body>
<h1>포함하는 페이지 includeMain.jsp 입니다.</h1>
<%
request.setCharacterEncoding("euc-kr");
%>
<hr>
<jsp:include page="includeSub.jsp" flush="false"/>
includeMain.jsp의 나머지 내용입니다.
</body>
</html>
- 한글값이 넘어오므로 인코딩 하고 있다
- include action tag 로 인해 불러온 includeSub.jsp 의 내용이 include action tag 가 있는 위치에 출력된다
- forward action tag 와 다르게 inlcude action tag 는 불려진 문서 뿐만 아니라 불러온 현재페이지의 문서도 출력된다
- includeSub.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<%
String name = request.getParameter("name");
%>
포함되는 페이지 includeSub.jsp 입니다.<p>
<b><%=name%> 님 어서 오세요 !!</b>
<hr>
- 이 페이지에 출력되는 전체 내용이 아까의 includeMain.jsp 파일에 포함되어 출력됨
- forward action tag 와 비슷하게 include action tag 에서도 불려진 문서로 2번 넘어갔지만 form 에서 전달한 값을 request 객체 getParameter() 로 받을 수 있다
forward actiont tag vs include action tag
- 공통점 : 페이지가 여러번 넘어가도 form 에서 전달한 값을 request 객체 getParameter() 로 받을 수 있다
- 차이점 : inlcude action tag 는 불려진 문서 뿐만 아니라 불러온 현재페이지의 문서도 출력된다
include action tag 예제 2
- WebContent/include/include2
- includeForm2.jsp & includeMain2.jsp & includeSub2.jsp
- includeForm2.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<html>
<body>
<h2>include 액션 태그에서 포함되는 페이지에 값 전달하기</h2>
<form method=post action="includeMain2.jsp">
사이트 명 : <input type="text" name="siteName1"><p>
<input type="submit" value="보내기">
</form>
</body>
</html>
- 가장 먼저 실행해야하는 파일
- name 값이 'siteName1' 이다
- '보내기' 를 누르면 action 으로 지정한 페이지 includeMain2.jsp 로 이동하며 전달
- includeMain2.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<html>
<body>
<h2>includeMain2.jsp 페이지 입니다</h2>
<%
request.setCharacterEncoding("euc-kr");
String siteName1 = request.getParameter("siteName1");
%>
<hr>
<jsp:include page="includeSub2.jsp">
<jsp:param name="siteName" value="<%=siteName1%>"/>
</jsp:include>
includeMain2.jsp 페이지의 나머지 내용입니다.<p>
</body>
</html>
- 한글 인코딩을 시키고, 아까 form 에서 넘어온 값(사용자 입력값)을 변수 siteName1 변수에 저장
- include action tag 로 다른 문서인 includeSub2.jsp 를 불러오면서 값을 전달하고 있다
- 전달될때 name 값이 siteName
- 전달된 값을 불려지는 문서가 처리가능
- 불러오는 문서와 불려지는 문서가 따로 Servlet 클래스로 만들어지므로 값 전달 가능
+ 우리가 만드는 파일은 전부 확장자가 java 인 Java Servlet 로 변환됨
- includeSub2.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<html>
<body>
<%
String siteName = request.getParameter("siteName");
%>
includeSub2.jsp 페이지 입니다.<p>
<b><%=siteName%></b>
<hr>
</body>
</html>
- 전전페이지에서 form 에서 전달된 siteName1 도 getParameter() 로 받을 수 있고 이전의 불러온 페이지에서 전달한 siteName 도 getParameter() 로 받을 수 있다
include directive tag (지시어 태그)
- 다른 문서를 불러온다
- 불러올 페이지와 불려지는 페이지가 한개의 파일처럼 동작
- 불러오는 파일과 불려지는 파일끼리 변수를 같이 사용할 수 있다
- 포함태그 = include tag = include directive tag
<%@ include file = "포함될 페이지명" %>
include action tag vs include directive tag (지시어 태그)
- include directive tag 는 다른 문서를 불러온다는 점은 include action tag 와 같지만 내부적으로는 다름
- include directive tag 는 불러오는 파일과 불려지는 파일이 1개의 Servlet 클래스(=파일)로 만들어지므로 변수들을 서로 같이 쓸 수 있다
include directive tag (지시어 태그) 예제
- WebContent/include/include0
- includer.jsp (불러오는 파일) & includee.jspf (불려지는 파일)
- includer.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<html>
<head><title>include 디렉티브</title></head>
<body>
<%
int number = 10;
%>
<%@ include file="includee.jspf" %>
공통변수 DATAFOLDER = "<%= dataFolder %>"
</body>
</html>
- 불러올 파일을 includee.jspf 로 지정
+ jspf 의 f 는 fragment 라는 영역을 의미, f를 지우고 includee.jsp 로 바꿔도 된다
- 저 태그가 쓰인 부분에 includee.jsp 를 출력
- 변수 number 는 불러오는 파일에서 정의되었지만 불려지는 파일인 includee.jsp 에서도 사용 가능하다
- 또한 dataFolder 변수는 불려지는 파일에서 정의한 변수이지만 불러오는 파일에서 사용 가능하다
- includee.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
includer.jsp에서 지정한 번호: <%= number %>
<p>
<%
String dataFolder = "c:\\data";
%>
- 불러오는 파일에서 정의한 number 변수를 불려지는 문서에서 쓰고 있다
- 불러오는 파일에서 dataFolder 를 정의하고 불려지는 파일에서 dataFolder 안의 값을 출력하고 있다
- 하나의 파일인 것 처럼 동작하므로 불려지는 파일과 불러오는 파일의 변수들을 서로 사용 가능하다
- Java Servlet 으로 변환될때 불려오는 파일과 불러오는 파일이 1개의 Java Servlet 클래스로 만들어짐
include action tag vs include directive tag (include 지시어 태그)
- include action tag 로 불러오면 불러온 파일과 불려진 파일이 따로 Java Servlet 으로 변환되고 <jsp:include > 로 불러옴
- include directive tag 로 불러오면 불러온 파일과 불려진 파일이 한개의 파일로 결합되서 Java Servlet 파일이 1개로 만들어짐
Java Servlet 파일
- 우리가 작성한 모든 JSP 파일들은 Java Servlet 파일로 내부적으로 변환된다
- 확장자가 java
- 그 변환된 파일들은 workspace 에 있다
C:\Users\admin\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\
work\Catalina\localhost\jspproject\org\apache\jsp
- 여기에 Java Servlet 파일들이 저장되어있다
- 지금껏 작업했던 모든 파일들이 나타남
- 확장자가 JAVA 인 Java Servlet 파일과 바이트코드로 변환된 파일들을 볼 수 있다
- 방금 했던 include0 폴더로 들어가보자
- 1개의 Servlet 파일 뿐이다
- 불러오는 파일과 불려지는 파일이 1개 Servlet Class로 동작하는 것이다
- 그러므로 각 파일 안의 변수들을 혼용해서 사용할 수 있다 ( 같은 이름 변수 사용시 충돌가능 )
- 방금 했던 include1 폴더로 들어가보자
- include action tag 로 불러온 것은 따로 파일이 만들어짐
- 불러온 파일과 불려진 파일의 Java Servlet 파일이 따로 만들어진다
- 그러므로 include action tag 를 사용할 때는 값을 전달하는 것이 가능하다
- include2 폴더도 include1 폴더와 마찬가지
내부 작업
- 작성된 모든 JSP 파일은 내부적으로 Java Servlet 으로 변환됨
- 변환된 파일을 아파치 톰캣이 컴파일해서 바이트 코드로 변환함
- HTML로 변환하여 클라이언트의 웹 브라우저에서 변환된 결과를 실행함
- JSP 파일들을을 서비스할때 시간이 걸리는 이유이다
include action tag 사용
- 공통적인 내용을 따로 모듈 파일로 만들고 include action tag 로 불러올때 사용
include action tag 사용 예제
실습 준비
include action tag 사용 예제 1
- WebContent/template/
- main.jsp & templateTest.jsp
- top.jsp & left.jsp & center.jsp & bottom.jsp
- main.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<jsp:forward page="templateTest.jsp" >
<jsp:param name="CONTENTPAGE" value="content.jsp"/>
</jsp:forward>
- templateTest.jsp 파일로 포워딩하면서 값을 넘기고 있다, 바로 포워딩
- 넘기는 값은 content.jsp 라는 센터영역에 보여줄 페이지명
- 템플릿 기능임
- main.jsp 를 가장 먼저 실행해야함
- 상단, 좌측, 하단 메뉴는 바뀌지 않고 center 의 내용만 바뀜
- 바뀌지 않는 내용은 따로 파일을 만들어뒀다
- templateTest.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%
String contentPage = request.getParameter("CONTENTPAGE");
%>
<html>
<head><title>Template 페이지 연습</title></head>
<body>
<table width="600" border="1" cellpadding="2" cellspacing="0" align=center>
<tr height=80>
<td colspan="2">
<!-- 상단 영역 -->
<jsp:include page="top.jsp" flush="false" />
</td>
</tr>
<tr height=300>
<td width="150" valign="top">
<!-- 좌측 영역 -->
<jsp:include page="left.jsp" flush="false" />
</td>
<td width="350" valign="top">
<!-- 본문 내용 -->
<jsp:include page="<%= contentPage %>" flush="false" />
</td>
</tr>
<tr height=80>
<td colspan="2">
<!-- 하단 영역 -->
<jsp:include page="bottom.jsp" flush="false" />
</td>
</tr>
</body>
</html>
- 가장 먼저 request.getParameter() 로 센터영역에 보여줄 페이지명인 content.jsp 를 받아서 변수 contentPage 에 저장
- 표를 작성해서 <tr><td> 안에 모듈화된 상단, 좌측, 센터, 하단 영역 페이지명을 각각 include 해서 불러온다
- center 영역은 고정된 값이 아닌 contentPage 라는 변수에 저장된 값으로 include
- top.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
상단 메뉴:
<a href="#">회사소개</a>
<a href="#">제품소개</a>
- 이 내용이 상단 영역에 나타남
- left.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
좌측메뉴:<br>
<a href="#">회사소개</a><br>
<a href="#">제품소개</a>
- 이 내용이 좌측 영역에 나타남
- content.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
하하하하..<br>
내용입니다..
- 이 내용이 center 영역에 나타남
- bottom.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
하단메뉴: 찾아오시는 길 | 개인보호 정책 | 도움말 | 약관
- 이 내용이 하단 영역에 나타남
코드 수정 하기
- '회사소개' 누르면 회사소개 내용이 center 영역에 나타나도록, '제품소개' 누르면 제품소개 내용이 center 영역에 나타나도록 해보자
1. top.jsp 파일에서 링크 설정하기
<%@ page contentType = "text/html; charset=euc-kr" %>
상단 메뉴:
<a href="main.jsp">HOME</a>
<a href="comp_forward.jsp">회사소개</a>
<a href="goods_forward.jsp">제품소개</a>
- 'HOME' 을 누르면 초기화면으로 가게끔 main.jsp 를 링크 연결
- '회사소개' 를 누르면 com_forward.jsp 로 가게끔 링크 연결
- '제품소개' 를 누르면 goods_forward.jsp 로 가게끔 링크 연결
- 1개 메뉴당 파일을 2개씩 만들어야한다
2. comp_forward.jsp 파일 만들기
- comp_forward.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<jsp:forward page="templateTest.jsp" >
<jsp:param name="CONTENTPAGE" value="comp.jsp"/>
</jsp:forward>
- main.jsp 파일과 비슷한 형식으로 만든다
- main.jsp 파일을 복붙하고 forwad 로 전달하는 값의 value 가 센터영역에 보여줄 파일명이므로 회사 소개 관련 내용을 보여줄 comp.jsp 로 수정
- 즉, 1개 메뉴당 파일을 2개씩 만들어야한다 ( 보여줄 내용의 파일명을 값으로 전달할 파일 + 실제 보여줄 내용 파일)
- comp_forward.jsp 와 comp.jsp 파일
+ 그럼 templateTest.jsp 에서는 센터 영역에 출력할 파일로 comp.jsp 를 받아서 include 함
3. com.jsp 파일 만들기
- comp.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>
회사 소개 페이지 입니다. (comp.jsp)
</body>
</html>
- top, left, bottom 은 고정이므로 include 로 불러온다
- 결과 캡처
4. goods_forward.jsp 파일 만들기
- goods_forward.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<jsp:forward page="templateTest.jsp" >
<jsp:param name="CONTENTPAGE" value="goods.jsp"/>
</jsp:forward>
- main.jsp 파일과 비슷한 형식으로 만든다
- main.jsp 파일을 복붙하고 forwad 로 전달하는 값의 value 가 센터영역에 보여줄 파일명이므로 제품 소개 관련 내용을 보여줄 goods.jsp 로 수정
- 즉, 1개 메뉴당 파일을 2개씩 만들어야한다 ( 보여줄 내용의 파일명을 값으로 전달할 파일 + 실제 보여줄 내용 파일)
- goods_forward.jsp 와 goods.jsp 파일
+ 그럼 templateTest.jsp 에서는 센터 영역에 출력할 파일로 goods.jsp 를 받아서 include 함
5. goods.jsp 파일 만들기
- goods.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>
제품 소개 페이지 입니다. (goods.jsp)
</body>
</html>
6. main.jsp 실행
- 결과 캡처
- 모듈은 그대로 고정되어있고 center 영역의 내용만 바뀐다
+ 대체할 방법이 많기때문에 꼭 이것만을 사용하지 않아도 된다
- 한개 메뉴당 파일을 2개씩 만들었다
- 한개 메뉴당 파일을 1개의 파일로 만들 수 있다
- 다음 예제에서 할 것
include action tag 사용 예제 2
실습 준비
include action tag 사용 예제 2
- 이전 예제와 다른 점은 하나의 메뉴 당 하나의 파일
- WebContent/temp/
- template.jsp &
- template.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String pagefile = request.getParameter("page");
if(pagefile == null){ pagefile = "bestitem";}
%>
<html>
<head><title>Template Test</title></head>
<body>
<table width=960 height=500 border=1 color=gray align=center>
<tr><td height=43 colspan=3 align=left>
<jsp:include page="top.jsp" />
</td>
</tr>
<tr><td width=15% align=right valign=top>
<jsp:include page="left.jsp" />
</td>
<td colspan=2 align=center>
<jsp:include page='<%= pagefile+".jsp" %>'/>
</td>
</tr>
<tr><td width=100% height=40 colspan=3>
<jsp:include page="bottom.jsp"/>
</td>
</tr>
</table>
</body>
</html>
- template.jsp 파일을 가장 먼저 실행해야한다
- center 영역만 바뀐다
- page 라는 이름으로 값을 받음 (top.jsp 나 left.jsp 파일로부터 받음)
- 이 template.jsp 는 아래에서도 설명한다
- top.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<a href="template.jsp?page=login">Login</a>
<a href="template.jsp?page=join">Join</a>
- 하이퍼링크를 걸며 값을 전달
- login, join 은 확장자가 생략, 확장자를 빼고 template.jsp 로 전달
ex) Login 클릭시 template.jsp 파일에 page=login 이라는 값을 전달하며 이동
- left.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<center>
<a href="template.jsp?page=newitem">신상품</a><br><br>
<a href="template.jsp?page=bestitem">인기상품</a><br><br>
</center>
- 하이퍼링크를 걸며 값을 전달
- newitem, bestitem 은 확장자가 생략, 확장자를 빼고 template.jsp 로 전달
ex) '신상품' 클릭시 template.jsp 파일에 page=newitem 이라는 값을 전달하며 이동
- template.jsp (다시 돌아가서 보기)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String pagefile = request.getParameter("page");
if(pagefile == null){ pagefile = "bestitem";}
%>
<html>
<head><title>Template Test</title></head>
<body>
<table width=960 height=500 border=1 color=gray align=center>
<tr><td height=43 colspan=3 align=left>
<jsp:include page="top.jsp" />
</td>
</tr>
<tr><td width=15% align=right valign=top>
<jsp:include page="left.jsp" />
</td>
<td colspan=2 align=center>
<jsp:include page='<%= pagefile+".jsp" %>'/>
</td>
</tr>
<tr><td width=100% height=40 colspan=3>
<jsp:include page="bottom.jsp"/>
</td>
</tr>
</table>
</body>
</html>
- 아무것도 클릭하지 않았을때 초기 실행시 pagefile = null 이므로 pagefile = "bestitem" 로 함으로서 센터영역에 bestitem.jsp 를 보여줌
-상단, 좌측, 하단에 각각의 모듈을 불러와서 보여줌
- center 영역만 계속 바뀌는데 center 영역에는 top.jsp 나 left.jsp 에서 전달한 값을 pagefile 변수에 저장 후 .jsp 를 붙여서 include 함
ex) top.jsp 에서 login 값을 전달시 login.jsp 를 center 영역에 include
ex) left.jsp 에서 newitem 값을 전달시 newitem.jsp 를 center 영역에 include
- newitem.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<b>신상품 목록 입니다.</b>
include action tag 사용
- 바뀌지 않는 파일을 모듈로 만들고 불러와서 사용
자바빈 관련 액션 태그
자바빈 관련 액션 태그
- usebean action tag, setProperty action tag, getProperty action tag
- 자바 클래스와 연동할때 쓰는 액션 태그, 자바빈이라는 클래스와 연동할때 사용
+ 액션 태그 중 forward, include action tag 는 했다
자바빈 (JavaBean)
- 자바로 작성된 컴포넌트 클래스를 의미
- Model 1 이지만 자바를 2가지 사용할 것, 그 중 하나
자바빈의 장점
1. 폼데이터 처리에 용이하다.
- 폼에서 넘어오는 많은 데이터를 자바빈에 저장하고, 전달할 수 있다.
ex) 회원가입 양식의 수많은 데이터를 받을때 Java Bean(Java Class) 으로 처리시 request 객체의 getParameter() 로 받는 작업을 더는 하지 않아도 됨, 간략한 코드
2. 재사용성
- 자바빈은 여러 JSP 파일에서 사용할 수 있다.
- 자바 클래스로 되어있기 떄문에 한번 생성시 재사용이 가능하다는 특징
3. 컴포넌트 기반 구현
- JSP, JavaBean(=DTO Class), DAO 클래스가 분리되어서, 각 컴포넌트로 별로 기능을 수행하므로 효율적 처리 가능
JSP Model 1 아키텍처
- 브라우저를 통해 클라이언트가 요청 ex) 가입버튼 클릭
- JSP 페이지라는 action 으로 지정된 페이지에서 받음 ex) 값이 넘어감
- JSP 페이지에서 action tag 를 사용함
- Java Bean에서 (=DTO 생성해서) 변수사용, 힙메모리상에서 할당받아 값을 사용
- DB 연동하는 DAO 클래스에서 메소드를 통해 불러옴, 데이터를 처리
JavaBean 작성법
- 가장 위에 패키지를 만들고 클래스를 만든다
- 필드, 메소드만 있다
1. 필드
- 외부 접근 막기 위해 필드는 주로 private 으로 설정함
- 멤버변수 = 필드 를 Java Bean에서는 property (프로퍼티) 라고 부름
2. 메소드
- 생성자 대신 setter 메소드로 필드값을 설정함
+ 값을 돌려주는것은 getter 메소드로 값을 돌려줌
JavaBean 특징 정리
- 즉 JavaBean 에는 필드와 getter, setter 메소드들만 들어간다
- 자바빈에 저장하고, 저장된 값을 가져오고 객체 생성하기위해 action tag 사용, 그게 3가지 액션 태그
- property 는 폼에서 넘어간 내용도 저장하고 DB 에서 검색한 값도 저장하는 중간 저장소 처럼 사용
- 프로퍼티는 JSP 페이지의 내용을 DB 에 저장하거나 DB 에 저장된 내용을 JSP 페이지에 출력할때 중간 데이터 저장소로 사용됨
- 자바빈에서 멤버변수를 property 라고 부른다
- 프로퍼티(property) 는 값을 저장하기 위한 필드로 접근 제어자를 private 으로 선언해서 작성
- 프로퍼티에 값을 저장할 때는 setXX() 메소드 사용, 저장된 값을 사용할 때는 getXX() 메소드 사용
- 하나의 프로퍼티 당 한쌍의 setXX() 메소드와 getXX() 메소드가 존재
- setXX() 메소드와 getXX() 메소드에서는 주로 public 접근 제어자 사용
자바빈 관련 액션 태그
1. useBean action tag : 자바빈 객체 생성
2. setProperty action tag : setter 메소드의 매개변수로 값을 전달
3. getProperty action tag : getter 메소드로 리턴된 값을 출력시켜줌
자바빈 파일 저장 위치
- 여태까지 JSP 파일은 WebContent 폴더에 넣었었다
- 자바빈 파일은 자바파일이므로 자바빈을 만들떄는 src 폴더 안에 패키지를 만들어서 저장해야함
자바빈 예제 1
실습 준비
+ 확장자가 java 파일은 WebContent 폴더에서 정상동작하지 않음, 나중에 src 폴더로 보낼 것
- 확장자가 java 인 SimpleBean.java 가 JavaBean 파일이다
- 이 파일 내용을 src 폴더 안에 새로 만들어서 따라서 작성하자
- 패키지 javaBean 을 주의
src 폴더 안에 JavaBean 만들기
- src 폴더 안의 자바빈 클래스를 작성하자
자바빈 예제 1
- 자바빈 파일인 SimpleBean.java 파일을 src 폴더에 직접 만들자
- jspproject/src/javaBean/
- SimpleBean.java
// 자바빈, DTO(Data Transfer Object)
package javaBean;
public class SimpleBean {
private String msg; // 프로퍼티
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
- 자바빈 클래스 안에는 프로퍼티(필드), getter 메소드, setter 메소드 이다
- 생성자는 잘 쓰지 않고 setter 메소드로 프로퍼티 값을 설정한다
+ 이클립스에서 getter / setter 만들기
- 다음으로 WebContent/javabean1/ 으로 돌아오자
- SimpleBeanForm.jsp 먼저 실행
- SimpleBeanForm.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<html>
<body>
<h1>간단한 자바빈 프로그래밍</h1>
<br>
<form action="simpleBean.jsp" method="post" >
<table width="500" border="0" cellspacing="0" cellpadding="3" align="left">
<tr>
<td width="100"> 메시지</td>
<td width="400">
<input type="text" name="msg" size="20" maxlength="30">
<input type="submit" name="send" value="보내기">
</td>
</tr>
</table>
</form>
</body>
</html>
- form 을 통해 msg 라는 name값으로 사용자의 입력값이 simpleBean.jsp 로 넘어감
- 위 코드는 1번 과정이다
- 지금까지는 1 로 요청을 하면 getParameter() 로 일일히 받았지만 이젠 Java Bean 에 저장 (=힙 메모리상에 저장) 할것
- SimpleBean.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<% request.setCharacterEncoding("euc-kr");%>
<jsp:useBean id="sb" class="javaBean.SimpleBean" />
<jsp:setProperty name="sb" property="msg" />
<html>
<body>
<h1>간단한 자바빈 프로그래밍</h1>
<br>
메시지: <jsp:getProperty name="sb" property="msg" />
</body>
</html>
- post 로 넘어온 한글 값이 깨지지 않도록 인코딩 한다
- 각종 자바빈 관련 액션태그들을 사용하고 있다
- 지금까지는 1 로 요청을 하면 getParameter() 로 일일히 받았지만 이젠 액션태그로 Java Bean 으로 처리, 2번 과정
useBean action tag
<jsp:useBean id="sb" class="javaBean.SimpleBean" />
- 가장 먼저 써야함
- class 속성에 우리가 사용할 자바빈을 패키지부터 경로를 설정해야함
- 이렇게 경로 설정시 import 하지 않아도 내부적으로 자동 import 함
- 이 자바빈으로 객체를 생성하는 역할을 함
- 앞쪽 form 에서 넘어온 msg 를 저장할 힙메모리 기억공간을 생성하는 것이다
- 객체 명은 id 속성값인 sb 이다
+ 객체를 생성 = 힙메모리에 공간 할당
+ useBean 으로는 객체 생성하며 생성자를 통해 값 전달 안되므로 생성자 대신 setter 메소드를 썼던 것
- 아래 코드와 같은 역할을 한다
<%@ page import = "javaBean.SimpleBean" %>
<%
SimpleBean sb = new SimpleBean();
%>
// useBean action tag 는 이 코드와 같은 역할
setProperty action tag
<jsp:setProperty name="sb" property="msg" />
- msg 의 접근제어자가 private 이므로 setter 메소드를 써서 값을 설정
- 접근 제어자가 private 인 프로퍼티에 값을 설정하는 역할
- 객체명 sb 와 property 에 msg 를 쓰면 내부적으로 setMsg() 메소드를 호출해서 값을 sb 객체의 msg 변수에 form 에서 전달된 msg 값을 할당함
- 즉, setProperty action tag 에서 param 속성을 생략하고 property 속성만 지정하면 form 에서 전달받은 매개변수 중 같은 매개변수 값을 자동으로 설정해준다
- 결론적으로 이 msg 라는 넘어온 입력값이 sb 객체의 msg 변수에 할당된다 (아래 주의사항 참고)
- 아래 코드와 같은 역할을 한다
sb.setMsg("안녕");
주의 사항
- 앞의 form 에서 넘어오는 name 값 과 자바빈 클래스에서 사용하는 프로퍼티 명이 일치해야함
- 현재는 msg 로 일치한다
getProperty action tag
메시지: <jsp:getProperty name="sb" property="msg" />
- 메모리에 저장되어있는 sb 객체의 msg 프로퍼티 값을 내부적으로 getter 메소드로 불러서 출력까지 시켜준다
- sb 객체의 msg 에 저장된 값을 구해와서 출력함, 즉 이때까지 사용자의 입력값을 메모리에 한번 저장시킨 후 불러온 것
- 아래 코드와 같은 역할을 한다
메세지: <%=sb.getMsg() %>
- simpleBeanForm.jsp 실행 결과
+ 환경설정 파일 또는 자바파일 수정시 서버 재시작 해야함
- 폼에서 전달한것을 메모리 상에서 저장했다가 끄집어 내서 출력하고 있다
+ 이후 DB 연동 위해선 DAO 클래스까지 만들어야하지만 지금은 DTO 까지의 예시
코드 수정 하기
- 이름을 입력하도록 양식에 한 줄 더 추가하자
- 즉 name과 msg 두가지 값을 전달해보자
- simpleBeanForm.jsp (수정)
<%@ page contentType="text/html; charset=euc-kr" %>
<html>
<body>
<h1>간단한 자바빈 프로그래밍</h1>
<br>
<form action="simpleBean.jsp" method="post" >
<table width="500" border="0" cellspacing="0" cellpadding="3" align="left">
<tr>
<td>이름</td>
<td><input type=text name="name"></td>
</tr>
<tr>
<td width="100"> 메시지</td>
<td width="400">
<input type="text" name="msg" size="20" maxlength="30">
<input type="submit" name="send" value="보내기">
</td>
</tr>
</table>
</form>
</body>
</html>
- src/javaBean/SimpleBean.java (수정)
// 자바빈, DTO(Data Transfer Object)
package javaBean;
public class SimpleBean {
private String name;
private String msg; // 프로퍼티
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
- 이 자바빈의 프로퍼티 값을 가입 양식의 name 값과 일치시켜야한다
- simpleBean.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<% request.setCharacterEncoding("euc-kr");%>
<%@ page import = "javaBean.SimpleBean" %>
<%
SimpleBean sb1 = new SimpleBean();
// sb1.msg = "hi"; // 접근 안됨 (private 접근 제어자)
sb1.setMsg("안녕");
%>
<jsp:useBean id="sb" class="javaBean.SimpleBean" />
<jsp:setProperty name="sb" property="msg" />
<jsp:setProperty name="sb" property="name"/>
<html>
<body>
<h1>간단한 자바빈 프로그래밍</h1>
<br>
메세지: <%=sb.getMsg() %> <br>
메시지: <jsp:getProperty name="sb" property="msg" />
</body>
</html>
+ getProperty() 에는 출력시키는 코드도 내장되어있으므로 출력도 시킴
- getProperty() 보다 getXX() 를 더 많이 사용한다
- 이유 : getProperty() 는 확장자가 jsp 인 파일에서만 사용가능하므로 DAO 클래스에서 메모리에 저장된 걸 불러오려면 getProperty() 대신 직접 getXX() 을 더 많이 사용함
- 결과 캡처
- 사용자가 입력한 값을 메모리상에 저장하고 저장된 값을 불러와서 출력하고 있다
+ setProperty action tag 한줄로 값 설정
- simpleBean.jsp 의 앞 파일의 form 에서 name 과 msg 가 넘어온다
- setProperty action tag 를 두번 사용하고 있다, 두개의 값이 넘어오면 두줄이 필요하다
- 여러개의 값이 넘어오더라도 한줄로 처리할 수 있는 방법이 있다
<jsp:setProperty name="sb" property="*" />
- 이 코드로 인해 여러개가 넘어오더라도 값을 모두 setter 메소드로 설정한다
- form 의 name 과 이름값이 일치하는 자바빈의 property 로 form 에서 넘어온 값들이 자동으로 저장됨
- 이 한줄만으로 request.getParameter() 를 일일히 쓸 필요가 없어짐
- 조건 : 가입하는 양식 form 의 name 값과 자바빈의 property 명이 같아야한다
흐름 정리
useBean action tag 속성
scope 속성값
- 생성된 객체를 어디까지 사용할건지 사용 범위 지정
- 객체명이 아닌 4가지 영역명 중 하나를 적는다 page, request, session, application
- page : 현재 파일에서만 객체 사용 가능
- session : 세션이 끊어질때까지 Bean 객체 사용 가능
setProperty action tag 속성
value 속성
- form 에서 값이 넘어오지 않는 경는 것을 저장하고자 할때 ex) 날짜, 시간은 폼에서 넘어오지 않음
- setter 메소드에 직접 매개변수로 넣을것을 지정가능
getProperty action tag 속성
+ DAO 에서 사용될 수 없으므로 나중에는 잘 쓰지 않는 태그
자바빈 예제 2
실습 준비
- 자바빈 파일인 MemberInfo.java 파일을 src 폴더에 둬야한다
- MemberInfo.java의 패키지는 madvirus.member
- 이 패키지를 src 안에 생성하고 그 안에 MemberInfo.java 를 복붙하자
자바빈 예제 2
- MemberInfo.java
package madvirus.member;
import java.sql.Timestamp;
public class MemberInfo {
private String id;
private String password;
private String name;
private String address;
private Timestamp registerDate;
private String email;
public String getId() {
return id;
}
public void setId(String val) {
this.id = val;
}
public String getPassword() {
return password;
}
public void setPassword(String val) {
this.password = val;
}
public String getName() {
return name;
}
public void setName(String val) {
this.name = val;
}
public String getAddress() {
return address;
}
public void setAddress(String val) {
this.address = val;
}
public Timestamp getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Timestamp val) {
this.registerDate = val;
}
public String getEmail() {
return email;
}
public void setEmail(String val) {
this.email = val;
}
}
- 6개의 프로퍼티와 각 프로퍼티의 getter / setter 메소드들로 구성되어있다
- 4개는 폼에서 넘어와서 메모리로 저장됨
- password 와 registerDate 는 폼에서 넘어오지 않으므로 setProperty 로 강제로 집어넣을 것
- 실행할땐 registerForm.jsp 실행해야한다
- registerForm.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<html>
<head><title>회원가입 입력 폼</title></head>
<body>
<form action="register.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0">
<tr><td>아이디</td>
<td colspan="3"><input type="text" name="id" size="10"></td>
</tr>
<tr><td>이름</td>
<td><input type="text" name="name" size="10"></td>
<td>이메일</td>
<td><input type="text" name="email" size="10"></td>
</tr>
<tr><td>주소</td>
<td colspan="3"><input type="text" name="address" size="30"></td>
</tr>
<tr><td colspan="4" align="center">
<input type="submit" value="회원가입">
</td>
</tr>
</table>
</form>
</body>
</html>
- form 을 통해 register.jsp 로 값을 전달
- 아이디의 name 값 "id", 이름의 name 값 "name", 이메일의 name 값 "email", 주소의 name 값 "address" 4가지 정보 전달
- 이 4가지 값은 Java Bean Class 에 저장될 것
- register.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%
request.setCharacterEncoding("euc-kr");
%>
<jsp:useBean id="memberInfo" class="madvirus.member.MemberInfo" />
<jsp:setProperty name="memberInfo" property="*" />
<jsp:setProperty name="memberInfo" property="password"
value="<%= memberInfo.getId() %>" />
<html>
<head><title>가입</title></head>
<body>
<table width="400" border="1" cellpadding="0" cellspacing="0">
<tr><td>아이디</td>
<td><jsp:getProperty name="memberInfo" property="id" /></td>
<td>암호</td>
<td><jsp:getProperty name="memberInfo" property="password" /></td>
</tr>
<tr><td>이름</td>
<td><jsp:getProperty name="memberInfo" property="name" /></td>
<td>이메일</td>
<td><jsp:getProperty name="memberInfo" property="email" /></td>
</tr>
<tr><td>주소</td>
<td colspan="3"><jsp:getProperty name="memberInfo" property="address" /></td>
</tr>
</table>
</body>
</html>
+ 한글값이 form 에서 넘어올 수 있으므로 인코딩
- 사용자가 입력한 id 값을 메모리에 저장하고 저장된 값을 불러와서 value 속성으로 강제로 password 값으로 집어넣었음
- 폼에서 4가지 정보만 입력했지만 '암호' 를 포함해서 5가지 정보 출력되게 된다
+ 넘어가는 순서 : registerForm.jsp -> register.jsp -> MemberInfo.java
1. useBean action tag 로 Bean 객체 생성 (register.jsp부분)
<jsp:useBean id="memberInfo" class="madvirus.member.MemberInfo" />
- class 값은 패키지부터 해당 클래스명까지 써야한다
- 이렇게 경로 설정하면 import 할 필요 없다
- memberInfo 라는 객체 생성, 그 memberInfo 객체가 id, name, email, address 등을 가리킨다
2. setProperty action tag 로 자바빈의 프로퍼티에 값 설정 (register.jsp부분)
<jsp:setProperty name="memberInfo" property="*" />
<jsp:setProperty name="memberInfo" property="password"
value="<%= memberInfo.getId() %>" />
<첫 줄 코드>
- 폼에서 넘어온 4가지 정보 id, name, email, address 를 자바빈의 같은 이름 프로퍼티로 저장
<두번째 코드>
- property 속성값으로 password 를 쓰면 내부적으로 setPassword() 의 매개변수로 값을 전달하라는 의미
- 폼에서 넘어오지 않은 password 를 강제로 자바빈 프로퍼티에 넣기 위해 value 속성 자리에 memberInfo.getId() 로 자바빈에 저장된 id 값을 불러와서 자바빈의 password 로 넣고 있다
- 폼에서 넘어오지 않은 값인 password 와 registerDate 를 강제로 자바빈 프로퍼티에 넣기위해 value 속성으로 강제로 집어넣기, 여기선 password 만 넣고 있다
- 그러면 id 값과 password 값이 메모리상에 같은 값으로 저장된다
+ 넘어오지 않은 값을 자바빈의 프로퍼티에 저장하고 싶을땐 setProperty action tag 의 value 속성 사용
3. getProperty action tag 로 자바빈의 프로퍼티 값 가져와서 출력 (register.jsp부분)
<tr><td>아이디</td>
<td><jsp:getProperty name="memberInfo" property="id" /></td>
<td>암호</td>
<td><jsp:getProperty name="memberInfo" property="password" /></td>
</tr>
- 자바빈 객체에 저장된 아이디값을 불러서 출력, 암호를 불러서 출력 하고 있다
- 나머지도 같다
- 결과 캡처
- 받은 결과를 메모리상에 저장하고 다시 불러와서 출력하고 있다
- 입력시엔 4가지 정보만 입력하지만
- 암호까지 5가지 정보가 출력됨
- 아이디와 암호가 같은 값으로 나옴
- 입력하지 않았지만 내부적으로 처리
+ 코드 수정 하기 1
- 날짜인 registerDate 도 처리하자
- 가입시 날짜를 메모리상에 저장하고 불러서 출력해보자
- register.jsp (수정)
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import="java.sql.Timestamp"%>
<%
request.setCharacterEncoding("euc-kr");
%>
<jsp:useBean id="memberInfo" class="madvirus.member.MemberInfo" />
<jsp:setProperty name="memberInfo" property="*" />
<jsp:setProperty name="memberInfo" property="password"
value="<%= memberInfo.getId() %>" />
<jsp:setProperty name="memberInfo" property="registerDate"
value="<%= new Timestamp(System.currentTimeMillis()) %>" />
<html>
<head><title>가입</title></head>
<body>
<table width="400" border="1" cellpadding="0" cellspacing="0">
<tr><td>아이디</td>
<td><jsp:getProperty name="memberInfo" property="id" /></td>
<td>암호</td>
<td><jsp:getProperty name="memberInfo" property="password" /></td>
</tr>
<tr><td>이름</td>
<td><jsp:getProperty name="memberInfo" property="name" /></td>
<td>이메일</td>
<td><jsp:getProperty name="memberInfo" property="email" /></td>
</tr>
<tr><td>주소</td>
<td colspan="3"><jsp:getProperty name="memberInfo" property="address" /></td>
</tr>
<tr><td>날자</td>
<td colspan="3"><jsp:getProperty name="memberInfo" property="registerDate" /></td>
</tr>
</table>
</body>
</html>
- password 뿐 아니라 날짜시간인 registerDate 도 강제로 저장
- 자바빈 클래스에서 날짜시간 registerDate 는 자료형이 Timestamp 이므로 Timestamp 객체를 만들어서 그 객체를 생성자의 매개변수로 넣어야한다, 즉 그 객체를 setProperty 의 value 에 넣어야한다
- Timestamp 클래스를 페이지 지시어 태그로 import 해야한다
- 등록 날짜가 찍혀 나온다
+ 코드 수정 하기 2
- 날짜 시간을 년월일시분초 로 출력되도록 수정
- 출력하는 곳에 getProperty() 대신 getXX() 메소드로 직접 날짜 시간을 불러와서 SimpleDateFormat 객체 생성해서 패턴 지정하고 적용시켜야함
- register.jsp (수정)
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import="java.sql.Timestamp"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%
request.setCharacterEncoding("euc-kr");
%>
<jsp:useBean id="memberInfo" class="madvirus.member.MemberInfo" />
<jsp:setProperty name="memberInfo" property="*" />
<jsp:setProperty name="memberInfo" property="password"
value="<%= memberInfo.getId() %>" />
<jsp:setProperty name="memberInfo" property="registerDate"
value="<%= new Timestamp(System.currentTimeMillis()) %>" />
<%
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE요일");
%>
<html>
<head><title>가입</title></head>
<body>
<table width="400" border="1" cellpadding="0" cellspacing="0">
<tr><td>아이디</td>
<td><jsp:getProperty name="memberInfo" property="id" /></td>
<td>암호</td>
<td><jsp:getProperty name="memberInfo" property="password" /></td>
</tr>
<tr><td>이름</td>
<td><jsp:getProperty name="memberInfo" property="name" /></td>
<td>이메일</td>
<td><jsp:getProperty name="memberInfo" property="email" /></td>
</tr>
<tr><td>주소</td>
<td colspan="3"><jsp:getProperty name="memberInfo" property="address" /></td>
</tr>
<tr><td>날짜</td>
<td colspan="3"><%=sd.format(memberInfo.getRegisterDate()) %></td>
</tr>
</table>
</body>
</html>
- 출력할때 메모리상에 저장된 날짜시간값을 가져온 후 패턴을 적용한다
- 이때 getProperty 는 불가능하므로 getRegisterDate() 라는 getter 메소드를 직접 사용해서 날짜시간 변수인 registerDate 를 가져옴
+ 메모리상 내용지우고 새로 메모리로 로딩 (빨간줄 삭제)
- Project-Clean..