<%@ 디렉티브이름 속성1="값1", 속성2="값2", ... %>
page 디렉티브 세부 설명
include 디렉티브 세부 설명
지정한 페이지를 현재 위치에 포함시키는 기능
<jsp:include> 액션 태그와 달리 다른 파일의 내용을 현재 위치에 삽입한 후 JSP파일을 자바 파일로 변환하고 컴파일하는 방식
include 디렉티브로 포함된 변수나 메소드를 JSP페이지에서 사용할 수 있음.
형태
<%@ include file="포함할파일경로" %>
사용 목적
코드 조각 자동 포함 기능
<jsp-config> <jsp-property-group> <url-pattern>/view/*</url-pattern> <include-prelude>/common/variable.jspf</include-prelude> <include-coda>/common/footer.jspf</include-coda> </jsp-property-group> </jsp-config>
<jsp-property-group> : JSP의 프로퍼티를 포함
<url-pattern> : 프로퍼티를 적용할 JSP 파일의 URL 패턴을 지정
<include-prelude> : url-pattern 태그에 지정한 패턴에 해당하는 JSP 파일의 앞에 삽입할 파일을 지정
<include-coda> : url-pattern 태그에 지정한 패턴에 해당하는 JSP 파일의 뒤에 삽입할 파일을 지정
JSP에서 문서의 내용을 동적으로 생성하기 위해 사용되는 것
스크립트 요소 종류
장점
단점
스크립트릿(Scriptlet) 세부 설명
<% 자바 코드1; 자바 코드2; %>
표현식(Expression) 세부 설명
<%= 출력값%>
선언부(Declaration) 세부 설명
<%! 자바 변수; 자바 메소드; %>
웹 어플리케이션 프로그래밍을 하는 데 필요한 기능을 기본적으로 제공
기본 객체는 request, response, session, application, page 등 많은 기본 객체 존재
request 기본 객체 세부 설명
response 기본 객체 세부 설명
out 기본 객체 세부 설명
pageContext 기본 객체 세부 설명
application 기본 객체 세부 설명
session 기본 객체 세부 설명
JSP 기본 객체와 영역
// 아래 두 표현식의 차이점은 실제 표현언어의 값을 생성 시간이 차이남. // $와 {}를 이용 // ${표현식}을 분석할 때 곧바로 값을 계산 ${표현식} // #과 {}를 이용 // #{표현식}은 실제로 값을 사용할 때 값을 계산 #{표현식}
// 접근 방법 1 ${표현1.표현2} // 접근 방법 2 ${표현1[표현2]}
// String.compareTo() 메소드를 사용하는 것과 동일 ${someValue == value}
// null, 빈 문자열, 길이가 0인 배열, 빈 Map, 빈 Collection 이면 true 반환 // 이외의 경우에는 false 반환 ${empty 값}
// true이면 값1 반환, false이면 값2 반환 ${조건 ? 값1 : 값2}
${문자열 += 문자열}
// 대괄호를 이용해 리스트를 생성, 접근할 때는 변수명[인덱스] // <c:set> 태그를 사용해서 생성 <c:set var="변수명" values"${[1,2,3,4]}" /> ${myfunc:sum(vals)} // 표현언어 변수가 필요없으면 ${myfunc:sum([1,2,3,4])}
// 키:값 형태로 저장 <c:set var="변수명" value="${ {키1:값1, 키2:값2} }" ${변수명.키1}
// {원소1, 원소2, ...} <c:set var="변수명" value="${ {값1, 값2, 값3} }" ${변수명}
${(파라미터1, 파라미터2) -> 표현언어식} ${함수명 = (파라미터1, 파라미터2) -> 표현언어식 ; ''}
<%@ taglib prefix="라이브러리명" uri="http://java.sun.com/jsp/jstl/라이브러리명" %>
<c:set>의 속성 - var : 값을 저장할 표현언어 변수의 이름 지정 - value : 표현식, 표현언어, 텍스트를 이용해 변수의 값을 지정 - scope : 변수를 저장할 영역 지정, 지정하지 않으면 page가 기본값으로 지정 (page, request, session, application 중 하나가옴) <c:set var="변수명" value="값" [scope="영역"]/> <c:set var="변수명" [scope="영역"]>값</c:set>
<c:set>의 속성 - target : 프로퍼티 값을 설정할 대상 객체를 지정, 표현식이나 표현언어 사용 가능 대상 객체는 자바빈 객체나 Map에 있어야함 - property : 설정할 프로퍼티 이름 지정 자바빈 객체인 경우 프로퍼티 이름에 해당하는 set 메소드를 제공해야함 - value : 프로퍼티의 값을 지정 주의사항 - target 속성을 설정할 때 표현언어 변수의 이름만 지정하는 실수 주의 (${표현언어 이름} 형태로 설정) <c:set target="대상객체" property="프로퍼티이름" value="값" /> <c:set var="대상객체" property="프로퍼티이름">값</c:set>
주의사항 - scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제 <c:remove var="변수이름" [scope="영역"] />
<c:if>의 속성 - test : 조건을 판별하여 참이면 태그의 내부 코드를 실행 표현식, 표현언어, 정적 문자열을 사용 가능 <c:if test="조건"> 내부 코드 </c:if>
<c:choose> <c:when test="조건1"> 내부 코드1 </c:when> <c:when test="조건2"> 내부 코드2 </c:when> <c:otherwise> 내부 코드3 </c:otherwise> </c:choose>
<c:forEach> 태그의 속성 - index : 루프 실행에서 현재 인덱스 - count : 루프 실행 횟수 - begin : 시작인덱스 설정 - end : 끝 인덱스 설정 - step : 증가 숫자 설정 - first : 현재 실행이 첫 번째 이면 true - last : 현재 실행이 루프의 마지막 실행인 경우 true - current : 컬렉션 중 현재 루프에서 사용할 객체 // Map, 배열, Collection일 경우 // begin과 end로 범위를 설정해 줄수 있음. // varStatus : 루프 정보를 담은 객체를 저장할 변수명 <c:forEach var="변수" items="Map/배열/Collection" varStatus="인덱스명"> 내부 코드 </c:forEach> // for문처럼 사용 <c:forEach var="변수" begin="시작숫자" end="끝숫자" step="증가숫자"> 내부 코드 </c:forEach>
<c:forTokens>의 속성 - items : 구분자를 통해 분리할 문자열을 입력 - delims : 분리할 때 사용할 구분자 - 그외 나머지 속성은 <c:forEach>와 동일 <c:forTokens var="변수명" items="분리할 문자열" delims="구분자"> ${item} </c:forTokens>
<c:url>의 속성 - value : 읽어올 URL, 절대 URL과 상대 URL로 지정 가능 - var : 읽어론 결과를 저장할 변수, 지정 않하면 현재 위치에 생성한 URL 출력 - scope : 변수를 저장할 영역 <c:url value="URL" var="변수명" scope="영역"> 내부 코드 </c:url>
<c:redirect>의 속성 - url : 리다이렉트할 URL - context : 컨텍스트 경로 <c:redirect url="URL" context="컨텍스트 경로"> 내부 코드 </c:redirect>
<c:out>의 속성 - value : JspWriter에 출력할 값을 나타냄. 값이 java.io.Reader의 한 종류면 Reader로부터 데이터를 읽어와 출력. - escapeXml : true이면 <,>,&,',"와 같은 문자를 &li;와 같은 형태로 변경 - default : value 속성에서 지정한 값이 없으면 사용될 값을 지정 <c:out value="출력할 값" escapeXml="참/거짓"> 기본값 </c:out> <c:out value="출력할 값" escapeXml="참/거짓" default="기본값"/>
<c:catch var="설정할이름"> 예외가 발생할 수 있는 코드 </c:catch>
<fmt:setLocale value="설정할 언어" scope="지정한 Locale이 영향을 비치는 범위" />
<fmt:requestEncoding value="인코딩방식" />
<fmt:bundle>의 속성 - basename : 사용할 리소스 번들의 이름 - prefix : bundle 태그의 내부에서 사용되는 message 태그의 key 속성의 값 앞에 자동으로 붙게 될 문자열 <fmt:bundle value="인코딩방식" prefix="message 태그 key값 앞에 붙는 문자열"/>
<fmt:message>의 속성 - key : 읽어올 메시지의 키 값 - var : 메시지를 저장할 변수 명 - scope : 변수가 저장되는 영역 - bundle : <fmt:setBundle> 태그를 사용해서 로딩한 번들로부터 메시지를 읽어올때 사용 <fmt:message value="인코딩방식" prefix="message 태그 key값 앞에 붙는 문자열"/>
<fmt:setBundle>의 속성 - basename : 읽어올 리소스 번들의 이름 - var : 메시지를 저장할 변수 명 - scope : 변수가 저장되는 영역 <fmt:setBundle var="저장할 변수" basename="번들이름" scope="저장할 영역"/>
<fmt:formatNumber>의 속성 - value : 양식에 맞춰 출력할 숫자 지정 - type : 출력할 양식 설정 (number-숫자, percent-%, currency-통화) - pattern : 직접 숫자가 풀력되는 양식 설정(java.text.DecimalFormat에 정의된 패턴 사용) - currenctCode : 통화 코드 지정 - currentSymbol : 통화를 표현할 때 사용할 기호 표시 - groupingUsed : 단위를 구분할 때 사용되는 기호를 사용할 지의 여부 결정 - var : 포맷팅한 결과를 저장할 변수 지정 - scope : 변수를 저장할 영역 지정 <fmt:formatNumber value="숫자" type="출력양식" ... />
<fmt:parseNumber>의 속성 - value : 파싱할 문자열 지정 - type : 출력할 양식 설정 - pattern : 직접 파싱할 때 사용할 양식 지정 - parseLocale : 파싱할 때 사용할 로케일 지정 - integerOnly : 정수만 파싱할지의 여부 지정 - var : 파싱한 결과를 저장할 변수 지정 - scope : 변수를 저장할 영역 지정 <fmt:parseNumber value="숫자" type="출력양식" ... />
<fmt:formatDate>의 속성 - value : 포매팅할 시간 값을 지정 - type : 날짜, 시간 또는 둘 다 포맷팅할지 여부 지정 - dateStyle : 날짜에 대해 미리 정의된 포맷팅 스타일 지정 - timeStyle : 시간에 대해 미리 정의된 포맷팅 스타일 지정 - pattern : 직접 파싱할 때 사용할 양식을 지정 - timeZone : 시간대를 변경하고 싶을 때 사용 - var : 파싱한 결과를 저장할 변수명을 지정 - scope : 변수를 저장할 영역 지정 <fmt:formatDate value="숫자" type="출력양식" ... />
<fmt:parseDate>의 속성 - value : 포매팅할 시간 값을 지정 - type : 날짜, 시간 또는 둘 다 포맷팅할지 여부 지정 - dateStyle : 날짜에 대해 미리 정의된 포맷팅 스타일 지정 - timeStyle : 시간에 대해 미리 정의된 포맷팅 스타일 지정 - pattern : 직접 파싱할 때 사용할 양식을 지정 - timeZone : 시간대를 변경하고 싶을 때 사용 - parseLocale : 파싱할 때 사용할 로케일을 지정 - var : 파싱한 결과를 저장할 변수명을 지정 - scope : 변수를 저장할 영역 지정 <fmt:parseDate value="숫자" type="출력양식" ... />
<fmt:timeZone>의 속성 - value : 포매팅할 시간 값을 지정 <fmt:timeZone value="지역"/>
tomcat
└ webapps
└ 웹어플리케이션
└ WEB-INF → 웹 어플리케이션 설정 정보를 담고 있는 web.xml파일 위치
└ classes → 웹 어플리케이션에서 사용하는 클래스 파일 위치
└ lib → 웹 어플리케이션에서 사용하는 jar 파일 위치
웹 어플리케이션 내 경로 웹 상 경로
[톰캣]/webapps/[파일경로] -> http :// host:port[/웹경로]
- '/웹경로'를 컨텍스트 경로(context path)라고 함.
- request 기본 객체에 getContextPath()메소드를 통해 컨텍스트 경로를 가져올 수 있음.
// include 디렉티브를 이용 // - 지정한 페이지가 현재 페이지에 포함되어 하나로 합쳐저 컴파일되서 변수를 서로 공유 가능 <%@ include file="포함할 페이지 경로" %\> // 액션태그를 이용 // - 두 페이지가 합쳐지는게 아니라 포함할 페이지의 제어권을 넘겼다가 다시 되돌아오는 개념 // - 두 페이지가 서로 독립적으로 컴파일되어 변수를 공유 못함. <jsp:include page="포함할 페이지 경로" flush="참/거짓">
<jsp:forward page="이동할 페이지" />
<jsp:useBean id="클래스 객체" class="클래스 경로" scope="request"/>
<jsp:setProperty name="자바빈이름" property="프로퍼티이름" value="값"/>
<jsp:getProperty name="자바빈이름" property="프로퍼티이름" />
// 태그 파일 <%@ attribute name="속성명" fragment="true" %> // jsp <%@ taglib prefix-"tf" tagdir="해당 태그 파일이 저장된 폴더명" %> <tf:태그파일명> <jsp:attribute name="속성명" /> 일반 템플릿 텍스트/EL/<jsp:include> 액션태그</jsp:attribute> </tf:태그파일명>
쿠키 생성
<% // 쿠키 객체 생성 Cookie cookie = new Cookie("cookieName", "cookieValue"); // response 기본 객체를 통해 웹 브라우저에 쿠키 정보 전송 response.addCookie(cookie); %>
쿠키 값 읽기
<% // getCookies() 메소드는 Cookie배열로 리턴, 없으면 NULL리턴 Cookie[] cookie = request.getCookies(); %>
쿠키 값 변경
쿠키 삭제
쿠키의 도메인
쿠키의 경로
쿠키의 유효시간
쿠키와 헤더
쿠키이름=쿠키값:Domain=도메인값:Path=경로값:Expires=만료시간
세션 생성
세션 종료
세션 유효 시간
// MySQL : com.mysql.jdbc.Driver // 오라클 : oracle.jdbc.driver.OracleDriver Class.forName("해당 드라이버 라이브러리 경로");
String url = "데이터베이스 URL 경로"; // jdbc:[DBMS]:[데이터베이스식별자] String userid = "데이터베이스 ID"; String password = "데이터베이스 비밀번호"; Connection conn = DriverManager.getConnection(url, userid, password);
// 쿼리 실행 전 SQL문 설정 String SQL = "select * from table where id=? "; preparedStatement pstmt = conn.prepareStatement(SQL); pstmt.setString(1, id); // 첫번째 '?' 부분에 들어갈 데이터 설정 // 쿼리 실행 및 결과 데이터 저장 ResultSet rs = pstmt.executeQuery(SQL); // 거의 select문일 경우에만 executeQuery 사용 int result = pstmt.executeUpdate(); // insert, update, delete의 성공 여부 반환
while(rs.next()){ String id = rs.getString("fid"); int idx = rs.getInt("fidx"); }
rs.close(); // ResultSet 종료 pstmt.close(); // preparedStatement 종료 conn.close(); // Connection 종료
getCharacterStream 사용 방법
Reader reader = null; try{ reader = rs.getCharacterStream("가져올 칼럼명"); if(reader != null){ StringBuilder buff = new StringBuilder(); char[] ch = new char[512]; int len = -1; while((len = reader.read(ch) != -1)){ buff.append(ch,0,len); } data = buff.toString(); } }catch(Exception ex){ 예외처리 }finally{ // Reader 종료 if(reader != null) try{reader.close();} catch(IOExeption ex){} }
Reader reader = null; try{ conn = DriverManager.getConnection(...); conn.setAutoCommit(false); 쿼리문1 실행 쿼리문2 실행 conn.commit(); // 트랜잭션 커밋 }catch(Exception ex){ if(conn != null){ conn.rollback() } // 트랜잭션 롤백 }finally{ ... }
try{ String jdbcUrl = "DB경로"; String username = "DB아이디"; String pw = "DB아이디"; ConnectionFactory connFactory = new DriverManagerConnectioinFactory(jdbcUrl, username, pw); PoolableConnectionFactory poolableConnFactory = new PoolableConnectionFactory(connFactory, null); poolableConnFactory.setValidationQuery("select 1"); // 커넥션 풀 설정 세팅 GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L); poolConfig.setTestWhileIdle(true); poolConfig.setMinIdle(4); poolConfig.setMaxTotal(50); GenericObjectPool<poolableConnection>connectionPool = new GenericObjectPool<>(poolableConnFactory, poolConfig); poolableConnFactory.setPool(connectionPool); Class.forName("org.apache.commons.dbcp2.PoolingDriver"); PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:"); driver.registerPool("커넥션풀명", connectionPool); } catch(Exception e){ throw new RuntimeException(e); }
<servlet> <servlet-name>DBCPInit</servlet-name> <servlet-class>jdbc.DBCPInit</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
jdbc:apache:commons:dbcp:풀이름
Connection conn = null try{ String jdbcUrl = "jdbc:apache:commons:dbcp:풀이름"; conn = DriverManager.getConnection(jdbcUrl); } ... finally{ if(conn != null) try{conn.close();} catch(SQLException ex){예외처리} }
<%@ taglib prefix="tf" tagdir="WEB-INF/tags/해당 커스텀 태그가 있는 폴더명" %> ... <tf:사용할태그파일명> ... </tf:사용할태그파일명>
<!-- 몸체 내용 처리 방법 1 --> <%@ tag body-content="scriptless" %> 몸체로 전달 받은 내용을 사용 <!-- 몸체로 전달받은 내용을 그대로 출력 --> <jsp:doBody /> <!-- 몸체 내용 처리 방법 2 --> <%@ tag body-content="scriptless" %> 몸체로 전달 받은 내용을 사용 <!-- 몸체로 전달받은 내용을 var속성으로 지정한 EL 변수에 저장 --> <!-- scope 속성을 이용해서 EL 변수를 저장할 영역을 지정 --> <jsp:doBody var="변수명" scope="영역" />
<%@ variable name-given="EL변수" variable-class="변수타입" scope="변수범위" %>
<%@ attribute name="속성명" rtexprvalue="false" required="true" type="java.lang.String" %> <%@ variable alias="사용자가 지정한 변수명" name-from-attribute="사용할 속성명" scope="변수범위" %> ... <c:set var="사용자가 지정한 변수명" value="..." />
... // xml 설정 // 서블릿으로 사용할 클래스 지정 <servlet> <servlet-name>매핑할 서블릿 클래스에 지정할 이름</servlet-name> <servlet-class>매핑할 서블릿 클래스 패키지 경로</servlet-class> </servlet> // 서블릿과 URL 간의 매핑 <servlet-mapping> <servlet-name>servlet태그 하위 태그인 servlet-name에서 지정한 이름</servlet-name> <url-pattern>지정할 경로 패턴</url-pattern> </servlet-mapping>
<!-- 경로를 하나만 설정할 때 --> @WebServlet("/경로"); <!-- 경로를 여러개 설정할 때 --> @WebServlet(urlPatterns = {"/경로1", "/경로2"})
<init-param> <param-name>파라미터 이름</param-name> // 초기화 파라미터 이름 지정 <param-value>파라미터 값</param-value> // 초기화 파라미터 값을 지정 </init-param>
변수 = getInitParameter("초기화 파라미터 이름") // 초기화 파라미터에 접근
사진출처 : https://scshim.tistory.com/272
사진출처 : https://hyoje420.tistory.com/36
프로퍼티이름1=프로퍼티값1 프로퍼티이름2=프로퍼티값2
String command = request.getRequestURI(); if(command.indexOf(request.getContextPath()) == 0) { command = command.substring(request.getContextPath().length()); }
... // 웹 어플리케이션에서 사용할 필터 지정 <filter> <filter-name>FilterName</filter-name> <filter-class>필터 클래스 패키지</filter-class> <init-param> 파라미터 내용 </init-param> </filter> // 특정 자원에 대해 어떤 필터를 사용할지 지정 <filter-mapping> <filter-name>FilterName</filter-name> <url-pattern>매핑주소</url-pattern> // <servlet-name> 태그를 사용하면 특정 서블릿에 대한 요청에 대해 필터를 적용 <dispatcher>REQUEST | FORWARD | INCLUDE</dispatcher> // REQUEST : 클라이언트의 요청인 경우 필터를 적용 // FORWARD : forward()를 통해서 제어 흐름을 이동하는 경우에 필터를 적용 // INCLUDE : include()를 통해서 포함되는 경우에 필터를 적용 </filter-mapping>
@WebFilter(filterName = "필터명", urlPatterns = {"주소1", 주소2})
<web-app ...> <listener> <listener-class>ServletContextListener 클래스 패키지1</listener-class> </listener> <listener> <listener-class>ServletContextListener 클래스 패키지2</listener-class> </listener> </web-app>
<web-app ...> // 주로 웹 어플리케이션의 초기화 작업을 수행하는 데 필요한 값을 설정할 때 많이 사용 <context-param> <param-name>파라미터 이름</param-name> <param-value>파라미터 값</param-value> </context-param> </web-app>
... @WebListener public Class Listener implements ServletContextListener { ... }