1. GUI 기반 Application 설계 패턴 2. 클라이언트의 요청을 받아 처리하여 응답하는 로직을 세개의 로직(Model, View, Controller)로 나누어 개발 3. Model - Business Logic(클라이언트 요청에 대한 업무 처리)을 담당 - Business Service와 Data Access Object 로 분리 - Business Service - Business 로직의 일의 흐름(work flow)을 관리 - DB 관련된 작업을 제외한 로직을 처리 - Data Access Object(DAO) - Database 관련된 로직만 처리(쿼리만 처리) - DB 관련 로직을 제외한 어떠한 업무처리도 가지지 않는다.
4. View - 처리결과를 응답하는 로직을 담당(Presentation Logic)
5. Controller - Client의 요청을 처리하는 전제 흐름을 control 하는 역할을 담당 - 처리내용 1. client의 요청을 받는다. 1-1 client가 요청시 입력한 값을 읽는다. 1-2 client로 부터 받은 값을 검증한다. 2. Business 로직을 호출한다. - Model 호출 3. 응답 처리 로직을 호출 한다. - View 호출
1. 클라이언트의 요청을 받은 component(Servlet, JSP)가 일하기 전 처리, 일한 후 처리를 담당하는 컴포넌트
2. 구현 - java.servlet.Filter를 implements - callback(lifecycle) 메소드 재정의 - init(FilterConfig) - destroy() - doFilter(ServletRequest, ServletResponse, FilterChain) * FilterChain : 다음 처리 동작에 대한 정보를 가지고 있다.
3. web.xml에 filter등록 <filter> 태그 : filter객체 등록 <filter-mapping>태그 : 필터가 호출될 url 설정
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body>
<c:if test="${requestScope.error_message!=null }"> 실행 도중 오류가 발생했습니다.<br> 오류 내용 ${error_message } </c:if> <a href='/${initParam.context_root }/index.jsp'>메인페이지로 이동</a> </body> </html>
1. custom tag library로 JSP 스펙에는 포함되지 않았지만 자바 진영에서 진행하는 태그 라이브러리. - 커스텀 태그(custom tag) : JSP에서 스크립트릿으로 작성해야할 동적 로직을 태그로 처리 - jstl.java.net에서 api를 다운로드 후 web application의 lib 폴더에 넣어 사용한다.
2. JSP에서 커스텀 태그를 사용하기 위해서는 taglib 지시자 태그 설정 필요 <%@ taglib prefix="접두어" uri="태그 라이브러리 구분자"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl.core"%> 사용 : <c:>
1. 변수 지원 - set : JSP에서 Attribute로 binding된 객체 처리 - remove : binding된 attribute 제거
2. 제어문 지원 - if : if문 - choose : 다중 조건 처리 - forEach : 반복문 처리
3. 출력지원 ① out 태그
- 태그형태의 문자열을 그대로 출력되도록 처리할 수 있다. - 속성 - value : 출력할 내용 - escapeXml : 태그 출력 여부 처리 true : 태그를 해석하지 않고 그대로 출력 false : 태그를 해석해서 출력 - default : value의 값이 null일 경우 출력할 기본 값
* WebContent 이름 : jstl/out.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!-- 이건 지정하면 이 페이지 안에서만 가능하다. --> <% request.setAttribute("text", "<b>내용입니다.</b>"); request.setAttribute("age", 20); %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> JSTL - out태그<p> <c:out value="안녕하세요<br>반가워요"/><br><!-- out의 주 기능은 value값을 있는 그대로 찍어주는 것이다. --> <c:out value="${requestScope.text }"/><br> <c:out value="${requestScope.text }" escapeXml="false"/><!-- escapeXml="false"를 하면 태그화 해서 화면에 보여준다. --> <hr> null값 출력<br> 이름 : ${requestScope.name }<br> 이름 : <c:out value="${requestScope.name }" default="이름이 없습니다."></c:out><br> 나이 : <c:out value="${requestScope.age }">나이가 없네요</c:out> </body> </html>
- 결과
② if 태그
- 단일 조건 조건문 처리. -if문과 동일 - 다중 조건 처리에는 사용할 수 없다. (if-else) - 속성 - test : 조건 설정 - 구문 <c:if test="조건"> 조건 만족시 실행할 내용 </c:if>
<!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=UTF-8"> <title>Insert title here</title> </head> <body> error.jsp<br> 오류가 발생했습니다.<br> 관리자에게 문의하세요.. admin@abc.com<br> <% request.setAttribute("error_message", "~~문제로 오류가 발생했습니다."); session.setAttribute("login_info", new CustomerDTO("a","1","홍길동","이메일",15)); %> <c:if test="${requestScope.error_message != null }"><!-- 에러 메세지가 있으면 아래 구문을 넣어주고 아니면 찍지마라 --> 오류메세지 : ${requestScope.error_message } </c:if><br> <c:if test="${not empty requestScope.error_message }"><!-- not 대신 ! 를 사용할 수도 있다. --> 오류메세지 : ${requestScope.error_message } </c:if> <hr> 메뉴 : 마이페이지 QnA 장바구니 <c:if test="${sessionScope.login_info.age>=19 }"> 성인입장페이지 </c:if><!-- 로그인한 사람의 나이가 19세 이상일 경우에만 성인입장페이지를 보여줘라. --> </body> </html>
* 로그인한 사람이 19세 이하일 경우 결과보기
* 로그인한 사람이 19세 이상일 경우 결과보기
③ choose 태그
- 다중 조건을 처리하는 태그 - if else, switch case - choose 태그는 조건들을 묶어주는 역할 - 하위태그 - when 태그 - 선택할 조건을 표시하기 위한 태그 - 속성 : test - 조건 설정 - otherwise - else의 역할(switch case의 default 역할) - 구문 <c:choose> <c:when test="조건1"> 조건1이 true일 경우 실핼할 내용 </c:when> <c:otherwise> when의 모든 조건이 만족 하지 않을 경우 실행할 내용 </c:otherwise> </c:choose>
- 특정 횟수만큼 반복을 처리 - 속성 - begin : 시작 값 - end : 종료 값 - step : 증감 값 - var : 변화되는 값을 저장할 변수 선언 <c:forEach begin="1" end="10" step="1" var="i"> ${i} - 안녕 </forEach>
<%@page import="java.util.HashMap"%> <%@page import="myjsp.dto.CustomerDTO"%> <%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> forEach를 이용한 collection반복<br> <% String [] names = {"이순신", "홍길동", "김유신", "강감찬"}; request.setAttribute("names", names);
1. JSP 2.0에서 새로 추가된 스크립트 언어 2. 기존의 expression tag의 업그레이드 버전
3. 주요기능 - 리터럴 데이터 출력 - 각종 연산자를 제공하여 연산결과 출력을 지원 - 4개 속성 scope(page, reqeust, session, application)에 binding된 Attribute(객체)나 그 Attribute의 property값 출력 - JSTL과 연동
4. 구문 - ${출력내용} - ${10}, ${"안녕"}, ${10+20} - ${value1.value2[.value3 ..]} - 특정 객체의 property 접근 할 때 사용
- ${value1[value2]} - 컬랙션(list 계열)의 값을 출력할 때 주로 사용
- value1에는 EL 내장객체나 attribute 명이 들어와야 한다. - 구문을 실행 도중 null이 나오면 더이상 진행하지 않고 출력도 하지 않는다. - 예) ${requestScope.mto.id} ${cto.address.zipcode} ${sessionScope.list[0]}
5. JSP의 scropt(스크립트 릿, 표현식, 선언식, 지시자) 태그에는 사용 못한다. 6. action 태그내에는 사용 가능 - <jsp:include page="${dir}/a.jsp"/>
7. EL의 내장객체(기본객체) - EL은 11개의 내장객체를 제공하여 별다른 추가 코드 없이 특정 객체에 접근하여 사용할 수 있도록 한다. - JSP의 내장객체와는 다르다.(pageContext는 jsp와 같지만 쓸일이 없다) - EL 내장객체 중 pageContext를 제외하고는 모두 name - value 형태의 값을 관리한다. - ${} 내에서만 사용가능 하며 첫번째 값으로만 올 수 있다.
- scope와 관련된 내장객체 - pageScope : pageScope에 접근 - requestScope : request Scope에 접근 - sessionScope : session scope에 접근 - applicationScope : application scope에 접근
- 요청파라미터 관련 내장객체 - param : 요청파라미터 조회시 사용(하나의 이름 하나의 값이 넘어온 경우) - paramValues - 요청파라미터 조회시 사용(하나의 이름으로 여러값이 넘어온 경우)
- Header 값 관련 - header - headerValues
- 쿠키 값 조회 - cookie : ${cookie.이름.value}
- 초기 파라미터 조회(context-param으로 설정된 것) - initParam
- PageContext 객체 관련 내장객체 - pageContext
* [실습]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <!-- EL의 리터럴(literal)값 - 문자열 : ', "로 감싼다. - 숫자 -true/false - null - null+300하면 null을 0으로 바꿔줘서 계산한다. - mto가 null이 되면 mto.age가 0이 되어 30을 더해서 30 이 나온다.
1. JSP 페이지 내에 다른 컴포넌트(JSP, HTML, Servlet)를 포함 시키는 기술 - 주로 jsp나 html을 포함시킨다. - include 지시자 태그를 이용, 표준 action 태그 이용 - 기타 : JSTL(jsp standard tag library)의 import 태그 이용, tiles 프레임 워크
2. <%@ include%> 지시자 태그 이용 - copy and paste 방식 - jsp를 servlet으로 변환하기 전에 포함시킬 파일의 내용을 카피하여 붙인다. - 구문 : <%@include file="포함시킬 파일명"%>
* [실습]
jsp WebContent 이름 : include/a.jsp, b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> a.jsp <% int k =200; %> <hr> <%@include file="b.jsp" %> <hr>
- 실행결과(지시자 태그를 사용하면 소스를 그대로 붙여서 사용하기 때문에 a.jsp에 선언된 k를 b.jsp에서 인식해서 에러가 나지 않지만 아래 액션태그를 사용하면 k를 인식하지 못해서 에러를 낸다.(액션 태그는 RequestDispatcher 방식으로 요청을 하고 결과만을 받아서 중간에 있는 k를 인식하지 못한다. )
3. <jsp:include> 액션 태그 이용 - 요청 디스패치 방식 - 수행을 포함시킬 컴포넌트로 이동한 뒤 출력내용을 포함시키는 방식 - 구문 <jsp:include page="url"/> <jsp:include page="url"> <jsp:param name="name" value="value"/> </jsp:include>
* [실습]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> a.jsp <% int k =200; %> <hr> <%@include file="b.jsp" %> <hr> <jsp:include page="b.jsp"/> </body> </html>