OpenFrameWork

오픈프레임워크_Day42

px 2015. 5. 13. 15:47
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 항목 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
4. Action Tag (html 처럼 정적태그가 아닌 동적태그)
(1) <접두사:태그명 속성...></접두사:태그명>
(2) 표준 액션 태그(기본제공) : <jsp:태그명>
          Bean 태그 1) ~ 3)
          1) <jsp:useBean ...
          2) <jsp:setProperty ...
          3) <jsp:getProperty ...
          4) <jsp:forward ...
          5) <jsp:include ...
          6) <jsp:params ...
          7) <jsp:param ...
(3) 사용자 정의 액션 태그

5. <jsp:include />
(1) 페이지 이동 및 복귀
(2) 이동 및 복귀하면서 파라미터 전달 가능

6. <jsp:forward />
(1) 페이지 이동(서버측 이동, 권한 넘김, 강력한 이동, 시작페이지의 제어권까지 넘겨줌)

7. Java Beans
(1) 특징
          1) 자바로 만든 프로그램
          2) 서버에서 실행
          3) JSP에서 분리된 java 코드(재활용이 가능한 컴퍼넌트 개념)

(2) Bean Tag
          1) <jsp:useBean
                    - 인스턴스 생성
                    - 만약 인스턴스가 이미 생성되어 있다면 그 인스터스를 참조
          2) <jsp:setProperty 
                    - setter메서드 호출
          3) <jsp:getProperty 
                    - getter메서드 호출

(3) Bean 규약
          1) 반드시 패키지로 생성
          2) 반드시 public 사용
          3) 프로퍼티 규약
                    - getter메서드 -> 출력 기능도 포함되어 있음
                              반드시 get(소문자)으로 시작
                              get다음에 시작되는 첫번째 문자는 대문자로 작성
                              반드시 return type이 존재(void불가)
                              반드시 매개변수는 없어야 한다.
                    - setter메서드
                              반드시 set(소문자)으로 시작
                              set다음에 시작되는 첫번째 문자는 대문자로 작성
                              반드시 return type이 void여야 한다.
                              반드시 매개변수가 있어야 한다.

(4) Bean의 사용범위(Context영역에 따른)
          1) page
          2) request
          3) session
          4) application

-----------------------------------

* JSP 1세대, 2세대
지금까지 배운 것은 HTML안에 java 코드를 집어 넣음, 간단한 사이트에는 좋음
그러나 규모가 커지면서, 유지보수에 불편을 느낌
이를 1세대 jsp임

2세대 jsp
java코드를 html안에 넣지 않고 외부로 뺌
html안에 java코드 자리를 액션태그로 대체
-----------------------------------
* Presentation Logic
jsp는 표현을 위해서 사용하기를 지향
jsp의 목표이자 역할, java 코드를 더이상 jsp에서는 쓰지 않도록
더 이상 <%! , <%=, <% 를 쓰지 않아야 한다 => 보통 프로토타입 만들때 사용
이러한 노력을 위한 첫번째 노력 Action Tag의 Bean 태그
-----------------------------------
* 액션 태그와 지시자의 include 차이점!!


-----------------------------------
* 액션 태그 주석 처리
<%-- --%>
-----------------------------------
* <jsp:include ...의 범위
request 범위 부터 동작
-----------------------------------
***. 페이지 이동 기술
사용자가 페이지 이동여부를 알고 있느냐로 아래 두가지 기술을 구분
1. 클라이언트측 이동 기술 - 사용자가 직접 링크를 눌러서 이동한 경우
          - HTML
                <a></a>
                <meta>

          - Javascript
               location
               history

          - Java
               sendRedirect()

2. 서버측 이동 기술 - 사용자에게 페이지 이동사실을 알릴 필요가 없거나 알려서는 안되는 경우, 서버 자체적으로 이동
                    - 같은 프로젝트안에서만! 이동가능, 다른 웹사이트, 프로젝트로 이동 불가능!!
          - java
               <jsp:include />
               <%@ page errorPage="..."%>
               <jsp:forward />  : 가장 강력한 이동기술, 권한까지 이양, 이동 후 돌아오지 않음
-----------------------------------
* 변수는 가장 작은 범위를 사용하라! 보통 request 사용
----------------------------------- 
* <jsp:forward page 사용시
해당 페이지에 버퍼는 모두 무시가 되고 이동만 함
----------------------------------- 
* Bean 
jsp에서 java만 분리된 코드를 Bean이라고 함

원래는 컴퍼넌트의 의미로 사용
별로도 만들어진 모듈 = 컴퍼넌트, 재사용이 가능

컴퍼넌트와 같은 의미지만 이름을 Bean으로 명명

java bean은 원래 응용프로그램을 말하는 건데
웹 프로그래밍 기준으로는 위의 jsp에서 java만 분리된 코드를 말함

Servlet 특징과 비교

Bean 특징
1) 자바로 만든 프로그램
2) 서버에서 실행
3) jsp와 소통이 가능

Bean이 나온 가장 큰 이유
- 디자인이 나오기 전에 작업이 불가능
- 디자인에 코드를 끼워 넣다가 불상사가 발생, 혹은 디자이너가 코드를 건드리다 문제 발생 가능
- 하나의 코드를 개발자, 디자이너가 같이 일해서 문제 분업 불가능
- 디자인이 나오기 전에 프로그램이 가능하게 해줌


Bean 클래스 만들시 주의사항
- 반드시 패키지를 만들어라!
----------------------------------- 
프로퍼티(Property)
Attribute 

어떤 관점, 상황에 따라서 다름

class - > 메서드 와 속성을 묶은 것

상황에 따라서 융통성 있게 이해를 해야함

클래스 입장에서는 메서드
클래스 안에 있는 메서드를 가져올 때, 가져오는 입장에서는 속성
----------------------------------- 
* JSP에서 set,get 프로퍼티 사용시 주의사항
property 내용으로 첫글자를 반드시 소문자로 해야함
----------------------------------- 
* 스크립트릿 (<% , <%= ...)
스크립트릿에서 만든 것은 Bean에서 사용 불가능
Bean에서 만든 것은 스크립트릿에서 사용 가능
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* Eclipse 프로젝트 새로 만듬1
Dynamic Web Project - ActionTagApp
Tomcat 8.0 선택 ,web.xml 체크
아래 위치에 폴더 만듬
/ActionTagApp/WebContent/include
----------------------------------- 
* Eclipse 프로젝트 새로 만듬2
Dynamic Web Project - BeanApp
Tomcat 8.0 선택 ,web.xml 체크
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/includeTest.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>includeTest.jsp</title>
</head>
<body>
<%!
     int i = 100;
%>

<jsp:include page="inc/header.jsp"/>
여기는 include Action Tag 예제입니다.
<%@include file="inc/footer.jsp" %>
<%--<jsp:include page="inc/footer.jsp"/>--%>
</body>
</html>
----------------------------------- 
3-2
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/inc/header.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
여기는 header.jsp 입니다.<br/>
작성자 : 홍길동<br/>
<%
     int i = 200;
%>
<%=i%>
<hr/>
----------------------------------- 
3-3
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/inc/footer.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<hr/>
<div align="center">
     <b>여기는 footer 부분입니다.</b>
     &copy;Copyright 2015.
</div>
<%=i%>
----------------------------------- 
3-4
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/exam1.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>exam1.jsp</title>
</head>
<body>
<h1>exam1.jsp</h1>
<%
     request.setAttribute("first", "request 객체");
     session.setAttribute("first", "session 객체");
     application.setAttribute("first", "application 객체");
     pageContext.setAttribute("first", "pageContext 객체");
%>
request : <%=request.getAttribute("first") %><br/>
session : <%=session.getAttribute("first") %><br/>
application : <%=application.getAttribute("first") %><br/>
pageContext : <%=pageContext.getAttribute("first") %><br/>

<%-- <jsp:include page="exam2.jsp"/> --%>
<%@include file="exam2.jsp" %>
<hr/>
request : <%=request.getAttribute("second") %><br/>
session : <%=session.getAttribute("second") %><br/>
application : <%=application.getAttribute("second") %><br/>
pageContext : <%=pageContext.getAttribute("second") %><br/>

</body>
</html>
----------------------------------- 
3-5 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/exam2.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>exam2.jsp</title>
</head>
<body>
<h1>exam2.jsp</h1>
request : <%=request.getAttribute("first") %><br/>
session : <%=session.getAttribute("first") %><br/>
application : <%=application.getAttribute("first") %><br/>
pageContext : <%=pageContext.getAttribute("first") %><br/>

<%
     request.setAttribute("second", "request 객체");
     session.setAttribute("second", "session 객체");
     application.setAttribute("second", "application 객체");
     pageContext.setAttribute("second", "pageContext 객체");
%>
</body>
</html>
-----------------------------------  
3-6 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/exam3.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam3.jsp</h1>
exam4에게 데이터전달<br/>
<jsp:include page="exam4.jsp">
     <jsp:param value="scott" name="id"/>
     <jsp:param value="seoul korea" name="addr"/>
</jsp:include>
</body>
</html>
-----------------------------------  
3-7 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/include/exam4.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam4.jsp</h1>
id : <%=request.getParameter("id")%><br/>
addr : <%=request.getParameter("addr")%><br/>
</body>
</html>
-----------------------------------  
3-8 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/exam1.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam1.jsp</h1>
<form action="exam2.jsp">
     <input type="text" name="name"/>
     <input type="submit" value="전송"/>
</form>
</body>
</html>
-----------------------------------  
3-9 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/exam2.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam2.jsp</h1>
<%=request.getParameter("name") %>

<%-- <jsp:include page="exam3.jsp"/> --%>
<jsp:forward page="exam3.jsp"/>
</body>
</html>
-----------------------------------  
3-10 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/exam3.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam3.jsp</h1>
<%=request.getParameter("name") %>
</body>
</html>
-----------------------------------  
3-11 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/exam4.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>exam4.jsp</h1>
<form action="exam4_proc.jsp" method="post">
     이름 : <input type="text" name="name"/><br/><br/>
     주소 : <input type="text" name="addr"/><br/><br/>
     <input type="submit" value="전송"/>
</form>
</body>
</html>
-----------------------------------  
3-12 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/kr.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h2>저희 사이트를 방문해주셔서 대단히 감사합니다.</h2>
당신이 등록한 데이터는 다음과 같습니다.<br/>
<hr/>
<ul>
     <li>이름 : <%=request.getParameter("name") %></li>
     <li>주소 : <%=request.getParameter("addr") %></li>
     <li>언어 : <%=request.getParameter("lang") %></li>
</ul>
</body>
</html>
-----------------------------------  
3-13 
Workspace : ~\JSP\EclipseWork
/ActionTagApp/WebContent/forward/en.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h2>Thank you very much for visiting my site.</h2>
Your registered data are.<br/>
<hr/>
<ul>
     <li>name : <%=request.getParameter("name") %></li>
     <li>address : <%=request.getParameter("addr") %></li>
     <li>language : <%=request.getParameter("lang") %></li>
</ul>
</body>
</html>
-----------------------------------  
3-14
Workspace : ~\JSP\EclipseWork 
/ActionTagApp/WebContent/forward/exam4_proc.jsp

<%
     request.setCharacterEncoding("euc-kr");
     String toWhere = "kr.jsp";
     String from = request.getRemoteAddr();
     String lang = "korean";
     if(from.endsWith("127.0.0.1")){
          toWhere = "en.jsp";
          lang = "english";
     }
%>
<jsp:forward page="<%=toWhere%>">
     <jsp:param value="<%=lang %>" name="lang"/>
</jsp:forward>
-----------------------------------  
3-15 
Workspace : ~\JSP\EclipseWork
/BeanApp/WebContent/simpleBean1.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>간단한 Bean 예제</h1>
<!-- CalendarBean cal = new CalendarBean(); -->
<jsp:useBean id="cal" class="bean.simple.CalendarBean"/>
<!-- cal.getYear() -->
오늘은 <jsp:getProperty property="year" name="cal"/>년
<jsp:getProperty property="month" name="cal"/>월
<jsp:getProperty property="date" name="cal"/>일 입니다.
</body>
</html>
-----------------------------------  
3-16
Workspace : ~\JSP\EclipseWork 
/BeanApp/src/bean/simple/CalendarBean.java

package bean.simple;

import java.util.Calendar;

public class CalendarBean {
     private Calendar cal = Calendar.getInstance();

     public int getYear() {
          return cal.get(Calendar.YEAR);
     }

     public int getMonth() {
          return cal.get(Calendar.MONTH) + 1;
     }
     
     public int getDate() {
          return cal.get(Calendar.DATE);
     }     
}
-----------------------------------  
3-17
Workspace : ~\JSP\EclipseWork 
/BeanApp/WebContent/simpleBean2.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%@ page import="bean.simple.*" %>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
별도로 분리된 자바코드(즉 빈)메 메시지를 하나 저장한다.<br/>
예를 들어 "자바 빈을 정복하자~~"라는 메시지를 bean에 저장시킨다.<br/>
그런 후에 그 메시지를 다시 가져와서 jsp에서 출력을 하도록 한다.<br/>
<br/>
<%
     String strMsg = "자바 빈을 정복하자~~";
%>
Message : <%=strMsg %>

<hr/>
<jsp:useBean id="msg" class="bean.simple.MessageBean" scope="page"/>
<jsp:setProperty property="message" name="msg" value="자바 빈을 정복하자~~"/>
Message : <jsp:getProperty property="message" name="msg"/>

<hr/>

<%
     MessageBean mb = new MessageBean();
     mb.setMessage("이것은 스크립트릿으로 작성한 코드이다.");
%>
<%= mb.getMessage() %><br/>
<%= msg.getMessage() %>

</body>
</html>
-----------------------------------  
3-18
Workspace : ~\JSP\EclipseWork 
/BeanApp/src/bean/simple/MessageBean.java

package bean.simple;

public class MessageBean {
     private String msg;

     public String getMessage() {
          return msg;
     }

     public void setMessage(String msg) {
          this.msg = msg;
     }     
}
-----------------------------------  
3-19
Workspace : ~\JSP\EclipseWork 
/BeanApp/WebContent/pageScope.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>주사위 게임</h1>
<!-- 반복 호출이 아니라면 useBean에 묶어준다. 그러면 한번만 호출됨 -->
<jsp:useBean id="dice" class="bean.page.DiceBean" scope="page">
     <jsp:setProperty property="minNumber" name="dice" value="1"/>
     <jsp:setProperty property="maxNumber" name="dice" value="6"/>
</jsp:useBean>
<h2>주사위의 눈금은  <jsp:getProperty property="randomNumber" name="dice"/> 입니다.</h2>
<form method="post" action="pageScope.jsp">
     <input type="submit" value="주사위 다시 굴리기">
</form>
</body>
</html>
<!-- 
     Property Spec
     -------------
     name               r/w          data type           explain
     ===========================================================
     randomNumber     r          int                    임의의 값 생성
     maxNumber          r/w          int                    생성 가능한 최대값
     minNumber          r/w          int                    생성 가능한 최소값
-->
-----------------------------------  
3-20
Workspace : ~\JSP\EclipseWork 
/BeanApp/src/bean/page/DiceBean.java

package bean.page;

import java.util.Random;

public class DiceBean {
     private int maxNumber;
     private int minNumber;
     private Random random = new Random();
     
     public int getMaxNumber() {
          return maxNumber;
     }
     public void setMaxNumber(int maxNumber) {
          this.maxNumber = maxNumber;
     }
     public int getMinNumber() {
          return minNumber;
     }
     public void setMinNumber(int minNumber) {
          this.minNumber = minNumber;
     }     
     public int getRandomNumber(){
          return random.nextInt(maxNumber - minNumber +1) + minNumber;
     }     
}
-----------------------------------  
3-21
Workspace : ~\JSP\EclipseWork 
/BeanApp/WebContent/requestScope.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<!DOCTYPE html >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<jsp:include page="inc/header.jsp"/>
<form>
     머릿말에 들어갈 내용 :<br/>
     <textarea rows="2" cols="60" name="header"></textarea>
     <br/><br/>
     꼬릿말에 들어갈 내용 :<br/>
     <textarea rows="2" cols="60" name="footer"></textarea>
</form>
<jsp:include page="inc/footer.jsp"/>
</body>
</html>
-----------------------------------  
3-22
Workspace : ~\JSP\EclipseWork 
/BeanApp/WebContent/inc/footer.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
[머릿말]<br/>
<hr/>
-----------------------------------  
3-23
Workspace : ~\JSP\EclipseWork 
/BeanApp/WebContent/inc/header.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<hr/>
[꼬릿말]<br/>
-----------------------------------  
###################################
4. 과제
-----------------------------------
4-1

----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 

-----------------------------------