물론 빈과 태그를 이용해 컴포넌트 방식으로 app를 개발하는 방식에는 다양한 방법이 있을것이다.
ejb (엔터프라이즈 자바빈), 스프링 프레임웍, jsp 등등등.. 하여간 자바 프레임 워크는 정말로 엄청나다;;

(4)빈(bean) 관련 태그: 서버측 자바빈의 액션은 <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>가 존재하며
                                빈(컴포넌트)을 이용한 컴포넌트 중심의 설계는 프리젠테이션과 애플레케이션 로직을 나누어준다.

=>빈은 기능별로 a.비주얼 컴포넌트 빈 b.데이터 빈 c.서비스 빈(비지니스) 으로 나뉜다.

클래스와 마찬가지로 데이터 + 동작을 묶어서 외부에선 내부의 복잡한 구현을 몰라도 간단하게 인터페이스 메서드를 통해 지시
하면 된다. = 동작 원리의 추상화 (abstraction) 캡슐화 (encapsulation)

=>인터페이스를 통한, 다형성을 통한 상위 수준의 추상화 = 디자인 패턴들 = 설계

은행창구 사용자 인터페이스 <-> 계좌 관리 모듈 <-> db접근용 컴포넌트 <-> db


=>그럼으로 빈은 표준화된 타입이어야만 한다. ojbect만 상속받고, 데이터, 디폴트 생성자, 세터와 게터, toString, 
    eqaul, hashCode, 기록할 용도라면 직렬화 선언이 필요하다. (clone,compareTo등은 도메인오브젝트에서 제공안한다)
    (예전에 배웠던 do(vo,dto)가 또 나오네;;)


 태그기반의 컴포넌트(빈) 프로그래밍의 예

//빈 사용 선언
<jsp:useBean id="user" class="RegisteredUser" scope="session" /> //id는 각 빈인스턴스의 식별 역할
<jsp:useBean id="news" class="NewsReports" scope="request" />  //스코프(생존주기)의 차이 확인!
   //빈 초기화
  <jsp:setProperty name="news" property="category" value="financial" />  셋프로퍼티할때 name은 useBean시의 id와 같다
  <jsp:setProperty name="news" property="maxItems" value="5" />   xml문법에서 "" 를 주의할것
</jsp:useBean>

**********************************************
//setProperty사용시 기억할것은.. 사용자의 폼(브라우저)로부터 입력 받은 값은 request객체에 담겨오고 그것을 value=에 담아줄
//수도 있지만 사용자 폼에서 넘어오는 매개변수 이름과 빈에 설정된 프로퍼티 이름이 동일할 경우 param 키워드로 바로 가져올수
//있다. 물론 프로퍼티 이름과 매개변수 이름이 같을 경우 param 역시 생략이 가능하다.

<jsp:setProperty name="news" property="category" param="category" />
<jsp:setProperty name="news" property="category" value=' <%= request.getParameter("category") %> ' /> (표현식)은 동일하다.
<jsp:setPropertry name="news" property="category" /> 도 프로퍼티,매개변수이름이 같을때 위와 동일하다.
***********************************************


<html> //헤더는 생략 가능?
<body>
Welcome back <jsp:getProperty name="user" property="fullName" />,
your last visit was on <jsp:getProperty name="user" property="lastVisitDate" />,
Glad to see you again!
<P>  //이건 뭔지 아직 명확치 않지만, 라인 넥스트로 여겨진다. 개행
There are <jsp:getProperty name="news" property="newItems" /> new articles abailable for your reading pleasure.
Please enjoy your stay and come back soon.
</body>
</html>


//사용자가 보게되는 프리젠테이션 영역 페이지에선
<html>
<body>
<form action="UserInfoResults.jsp">
Category: <input type="text" name="category">
MaxItems: <input type="int?" name="maxItems">
...
<input type="submit" value="UserInfo Value"> //식으로 위의 빈 초기화 page에 전달할 것이다.
</form>
</body>
</html>

=>사용자 id,pw 같은 경우 은닉필드에 저장해서 주고 받아선 안됀다. (html 소스 보기하면 나오기 때문) 그럼으로
빈태그 , 스클립틀릿으로 작성된 jsp페이지에서 이런 민감한 정보를 관리해야한다.

=>setProperty 할때 <jsp:setProperty property="*"> 식으로 와일드 카드로 사용자로 부터 전달받은 매개변수를 빈에 간단히 
대입할 경우 위험성이 있다.

(ex) AccountBean 빈으로 계좌 정보를 출력해주는 온라인 뱅킹 애플리 케이션의 경우
AccountBean 클래스는 accountNumber(계좌번호) , balance(잔고), withdrawalAmount(인출액), transferAmount(이체액)
같은 계좌 거래에 대한 프로퍼티가 존재한다. 아래처럼 폼을 통해 사용자에게 인출액을 지정하게 하면 지정된 jsp 폼 핸들러
가 작동하여 실제 거래를 수행하고(프로퍼티 값 세팅의 부가 효과 발생) 그 결과를 출력한다고 가정했을때..

<jsp:useBean id="myAccount" class="AccountBean">
  <jsp:setProperty name="myAccount" property="*"/>   <--와일드 카드로 대입
=>일반적으로 디폴트 값을 명시적으로 세팅하는 이유는.. null값=valus의 대입을 방지하고, 다양한 방법으로 페이지를 엑세스 
할수 있게 하기 위함이다.
</jsp:useBean>
<html>
<head><title>Cash Withdrawal</title></head>
<body>
<p>
$ <jsp:getProperty name="myAccount" property="withdrawalAmount" /> has been withdrawn from Account
# <jsp:getProprtty name="myAccount" property="withdrawalAmount" /> . 
Your new balance is $<jsp:getProperty name="myAccount" property="balance" />.   <---잔고 프로퍼티가 노출됨
Thank you for patronizing us at the First Bank of Orange.

이 페이지의 URL이 withdraw.jsp 일때 , 사용자가 다음과 같은 request를 보냈을때 어찌할 것인가?
http://server/acount/withdraw.jsp?accountNumber=PH1L31N&balance=1000000000   

=> string의 경우 ..match("?!@#$%^&*") 식으로 처리해서 검증을 하는건 어떨까?

jsp 컨테이너는 withdraw.jsp 페이이지의 <jsp:setProperty> 태그를 처리하면서 이 매개변수와 동일한 이름을 가진 balance
프로퍼티를 찾아서 100000000을 넣어준다.  OTL

***************************************************************************

1.<jsp:useBean> 속성으론
(1)id : 주어진 페이지에서 해당 빈 인스턴스를 식별하는 역할
(2).scope : page, request, session, application
(3)class : 빈클래스의 효과적인 관리를 위해 일반적으로 패키지로 묶어 관리한다. 빈 클래스는 패키지명을 지정해줘야 하지만,
import  또는 <%@page %> 지시자 태그를 통해 클래스 이름만으로 사용이 가능하다.
(4)type : 수퍼클래스나 이 빈이 구현한 다른 인터페이스 타입으로 참조할 필요가 있을 경우 세팅
(5)beanName : 중요치 않음(매번 초기화가 복잡한 빈의 경우.. 직렬화를 이용해 사본을 db,file등에 넣어두고 beanName을 이용해
                      인스턴스화 시킴)
(6)태그 몸체 : <jsp:useBean>  </jsp:useBean> 사이에 존재하는 초기화 코드 조각

2.인덱스 프로퍼티 접근하기
<B>Tomorrow's Forecast </B>: <%= weather.getForecast(0) %>  //스클립틀릿중 표현식
<BR>
<B>The Rest of the Week</B>
<UL>
<% for(int index=1; index<5; index++) { %>
<LI> <%=weather.getForecast(index) %> (maybe)
<% } %>
</UL>

****************************************************************************

TimerBean 예제

//페이지 정의부
<%@ page import="com.taglib.wdjsp.components.*" %>  //페이지 지시자 스크립트로 라이브러리 임포트
<jsp:useBean id="timer" class="com.manning.jsp.TimerBean" scope="session" /> //빈 정의시 id , 빈 프로퍼티 사용시 name

//사용자에게 출력부
<html>
<body>
Elaped Time: <jsp:getProperty name="timer" property="elapedMinutes" /> minutes
</body>
</html>

=> 위의 기능을 모든 jsp페이지에 넣고 싶다면? = 원하는 페이지 파일에다 <jsp:include> 빈 태그를 넣어주면 된다.


***************************************************************
//웹기반의 온라인 퀴즈 프로그램에서 위의 개념(빈의 기능 include)을 이용해본다면?
<html>
<body>
//폼 액션 정의부
<form action="/servlet/processQuestions/6">  //페이지 컨트롤링할 서블릿 설정
<b>Question 6 </b><br> //<b>는 bold인듯 하고.. br은 아마 개행 아닐까 싶다..
What is the airspeed velocity of an unlaiden European swallo?
<br> <input type="text" name="answer"> //텍스트로 입력받고 입력 값 객체의 이름을 answer로 한다.
<br> <input type="submit" value="Submit Answer"> //서블릿에 제출할 입력으로 그 객체의 이름은 Submit Answer로 한다.
</form>

//연결할 jsp 페이지(저 위에 만들어놓은 빈을 import할) 정의
<jsp:include page="/footers/ElapsedTimeFooter.html" flush="true" /> //자동 출력한다.

</body>
</html>


//ElapedTimeFooter.html 파일의 구성
<jsp:useBean id="timer" class="com.manning.jsp.TimerBean" scope="session" />
<hr>
Remember, speed is a factor in this exam! <BR> //개행인듯..
Time Used: <jsp:getProperty name="timer" property="elapsedSeconds" /> seconds


*****************************************************************************
빈을 어플리케이션(jsp,리소스들 모음인 내가 사용자에게 제공할 프로그램) 스코프에 저장했을 경우 유용성
1.서버에 저장되는 빈 인스턴스는 오직 1개이다. (매번 요청,페이지 변경,세션 변경등 시에 새로 객체 생성할 필요가 없다)
2.여러 페이지에서 공유가 가능핟.(그럼으로 동기화 처리가 중요)
3.서버(jsp컨테이너)가 인스턴스가 없으면 알아서 생성하고.. 서버 꺼질때 기록하는등 귀찮은일을 알아서 해준다.

<jsp:useBean id="ship" class="com.mannig.ShipRateBean" scope="application">
//초기화 코드조각
</jsp:useBean>
<html>
<body>
Current shipping charges are: <jsp:getProperty name="ship" property="baseCharge" />
per shipment plus <jsp:getProperty name="ship" property="perItemCharge" />
per each item shipped.
</body>
</html>

******************************************************************************
scope와 빈의 type 속성
 대게 어떤 슈퍼클래스의 서브클래스로 만들어진 빈을 조작할 때에만 사용한다.
 어떤 빈이 현재의 스코프(request,session)에 있는데, 정확한 타입을 알 수 없을경우..
 type클래스에 저장된 속성을 사용하면 된다. 

 어떤 서블릿,jsp 페이지에서 빈 컬렉션을 세션에 저장했다고 가정했을때 해당 빈의 타입
 이 자바의 Collection 인터페이스에서 갈라져 나온 클래스인것을 알지만, List인지 Set인지
 정확히 모를경우 type속성에 저장해둔 Collection 속성으로 빈을 참조할수 있다. 한마디로
 type 속성은 다형성을 지원하는 개념이다.

<jsp:useBean id="elements" type="java.util.Collection" scope="session" />


'프로그래밍 > JSP' 카테고리의 다른 글

jsp에서 빈의 사용3  (0) 2014.01.01
jsp에서 빈의 사용2  (0) 2014.01.01
jsp 스크립트  (0) 2014.01.01
part2(2013/11/27)  (0) 2014.01.01
javax.servlet.http.HttpServlet 소스코드 part1 (2013/11/27)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:57