JSP 공부한것 요약
1. jsp 설정부분에서는
문서의 타입
커스텀 태그
표현언어의 사용 엽부
사용할 자바 클래스 지정
을 한다.
2. JSP페이지의 구성 요소
○ 디렉티브 : JSP페이지에 대한 설정 정보를 지정할때 사용
사용 예 : <%@ 디렉티브이름 속성1="값1" 속성2="값2" ... %>
디렉티브의 종류 : page - JSP페이지에 대한 정보를 지정, 문서의타입, 출력버퍼의 크기 에러페이지등
taglib - JSP에서 사용할 태그 라이브러리를 지정
include - JSP페이지의 특정 영역에 다른 문서를 포함시킨다.
○ 스크립트 : 스크립트릿 - 자바코드를 실행한다.
표현식 - 값을 출력한다.
선언부 - 자바 메소드를 만든다.
○ 표현언어 : JSP 페이지 내부에서 사용되는 간단한 스크립트 언어이다. (자바를 모르는 사람들을 위한언어)
○ 기본(내장)객체 : request, response, session, application, page, out, pageContext, exception 등
○ 정적인 데이터
○ 액션태그 : 액션태그는 XML문서의 태그와 같은 모양을 취한다.
예) <jsp:include page="header jsp" flush="true" />
○ 커스텀태그 : JSP를 확장시켜 주는 기능, 사용자가 직적 개발해주어야 한다. 액션태그와 같이 태그 형태로 기능을 제공
2-1. 디렉트브 중 page 디렉티브 <%@ page
page 디렉트브는 기본이 되는 정보를표기하기 떄문에 jsp 소스의 가장 첫줄에 입력하는 것이 일반적이다.
속성 : language : jsp 스크립트 코드에서 사용되는 프로그래밍 언어를 지정한다. 기본값 = java
contentType : jsp가 생성할 문서의 타입을 지정한다. 기본값 = text/html
contentType="text/html; charset=euc-kr" %>
import : jsp페이지에서 사용할 자바 클래스를 지정한다.
import = "java.utile.Calendar" %>
import = "java.util.Date" %>
import = "java.utile.Calendar, java.utile.Date" %> 한줄에 여러개도 가능
import = "java.util.*" %>
※ 클래스는 특별한 기능을 하는 모듈
※ 패키지는 클래스를 모아놓은 단위
session : jsp 페이지가 세션을 사용할지의 여부를 지정한다. 기본값 = true
buffer : jsp페이지의 출력버퍼 크기를 지정한다 none일 경우 버퍼를 사용 안한다. 최소값=8kb
autoFlush : 출력버퍼가 다 찼을 경우 자동으로 버퍼에 있는 데이터를 출력 스트림에 보내고 비울지의 여부를 나타낸다.
true일 경우 버퍼 내용을 웹브라우저에 보낸후 버퍼를 비우고, false일때는 에러를 발생시킨다. 기본값 = true
info : jsp페이지에 대한 설명을 입력한다.
errorPage : jsp 실행도중 에러발생시 보여줄 페이지를 지정
isErrorPage : 현재 페이지가 에러가 발생할 때 보여지는 페이지인지의 여부를 지정한다.
true 일때 에러페이지, false일때는 에러페이지가 아니다. 기본값 = flase
pageEncoding : jsp페이지 자체의 캐릭터 인코딩을 지정한다.
isELIgnored : true일 경우 표현 언어를 지원하며 false일경우 표현언어를 지원하지 않는다.
2-2. 스크립트
- Scroptlet : JSP페이지에서 자바 코드를 실행할 때 사용되는 코드의 목록
<%
int sum = 0;
for ( int i=0 ; i<=10 ; i++){
sum = sum+1;
%>
- 표현식 : <%= 값 %>
- 선언부 : 함수를 작성할 때
<%!
public 리턴타입 메소드이름(파라미터 목록){
자바코드 1;
자바코드 2;
return 값;
}
%>
실제 jps로 웹 어플리케이션을 작성할 때에는 선언부를 쓰지 않고 클래스를 작성해서 사용한다.
2-3. 기본(내장)객체
-@request : 웹 브라우저의 요청과 관련이 있다.
* 웹브라우저 관련 정보 읽기 기능
* 서버와 관련된 정보 읽기 기능
* 클라이언트가 전송한 요청 파라미터,헤더, 쿠키 읽기 기능
* 속성 처리 기능
String getRemoteAddr() : 클라이언트 IP 구하기
long getContentLength() : 클라이언트가 전송한 요청 정보의 길이
String getCharacterEncoding() : 클라이언트가 요청 정보 전송시 사용한 캐릭터의 인코딩을 구한다.
String getContentType() : 클라이언트가 요청 정보를 전송시 사용한 컨텐츠 타입을 구한다.
String getProtocol()
String getMethod()
String getRequestURI() : 웹브라우저가 요청한 URL에서 경로를 구한다. (/chap02/requestInfo.jsp)
String getContextPath() : jsp페이지가 속한 웹 어플리케이션의 콘텍스트 경로를 구한다. (/chap02)
String getServerName() : 연결할 때 사용한 서버 이름을 구한다.
int getServerPort() : 서버가 실행 중인 포트 번호를 구한다.
웹브라우저에 입력한 정보는 파라미터로 전송 된다.
String getParameter(String name) : 이름이 name인 파라미터 값을 구한다.
String[] getParameterValues(String name) : 이름이 name인 모든 파라미터의 값을 배열로 구한다.
java.utile.Enumeration getParameterNames() : 웹브라우저가 전송한 파라미터의 이름을 구한다.
java.util.Map getParameterMap() : 웹브라우저가 전송한 파라미터의 맵을 구한다.
<%@ page contentType="text/html; charset=euc-kr" %> <%@ page import="java.util.Enumeration" %> <%@ page import="java.util.Map" %> <% request.setCharacterEncoding("euc-kr"); %> <html> <head><title>요청 파라미터 출력</title></head> <body> <b>request.getParameter() 메소드 사용</b><br> name 파라미터 = <%= request.getParameter("name") %> <br> address 파라미터 = <%= request.getParameter("address") %> <p> <b>request.getParameterValues() 메소드 사용</b><br> <% String[] values = request.getParameterValues("pet"); if (values != null) { for (int i = 0 ; i < values.length ; i++) { %> <%= values[i] %> <% } } %> <p> <b>request.getParameterNames() 메소드 사용</b><br> <% Enumeration enum = request.getParameterNames(); while(enum.hasMoreElements()) { String name = (String)enum.nextElement(); %> <%= name %> <% } %> <p> <b>request.getParameterMap() 메소드 사용</b><br> <% Map parameterMap = request.getParameterMap(); String[] nameParam = (String[])parameterMap.get("name"); if (nameParam != null) { %> name = <%= nameParam[0] %> <% } %> </body> </html> <!-- 체크박스나 라디오 버튼은 선책하지 않으면 파라미터 자체가 전송되지 않지만, 텍스트입력과 같은 일반적인 입력 요소들은 값을 입력하지 않더라도 빈 문자열("")이 파라미터의 값으로 전달 된다. --> |
요청 헤더 정보의 처리
String getHeader(String name) : 지정한 이름의 헤더 값을 구한다.
java.utile.Enumeration gerHeaders(String name) : 지정한 이름의 헤더 목록을 구한다.
java.utile.Enumeration getHeaderName() : 모든 헤더의 이름을 구한다.
int getIntHeader(String name) : 지정한 헤더의 값을 정수값으로 읽어온다.
long getDateHeader(String name) : 지정한 헤더의 값을 시간 값으로 읽어온다.( 1970.1.1 이후로 흘러간 1/1000초 단위의 값)
-@response : 웹 브라우저의 요청과 관련이 있다.
void addDateheader(String name, long date) : name헤더에 date를 추가한다.
void addHeader(String name, String value) : name 헤더에 value 값을 추가한다.
void addIntHeader(String name, int value) : name 헤더에 정수값 value 값을 추가한다.
void setDateHeader(String name,long date) : name헤더의 값을 date로 지정한다.
void setHeader(String name, String value) :
void setIntHeader(String name,int value) :
boolean constinsHeader(String name) : 이름이 name 인헤더를 포함하고 있을 경우 true를 리턴
response 객체에거 가장 많이 사용되는 기능은 redirect 기능이다.
response.sendRedirect("/index.jsp");
response.sendRedirect("http://hybridego.net/"); <-- 외부 연결이 가능하다.
<%@ page import = "java.net.URLEncoder" %> <% String value = "자바"; String encodedValue = URLEncoder.encode(value); response.sendRedirect("/index.jsp?name=" + encodedValue); %> |
★Enumeration 쓰는 방법 Enumeration enum = request.getHeaderNames(); While ( enum.hasMoreElements() ) { String headerName = (String)enum.nextElement(); ………….. } |
★랜덤함수 쓰는 방법 <%@ page contentType="text/html; charset=euc-kr" %> <%@ page import = "java.util.Random" %> <html> <head><title>break 사용 예</title></head> <body> <% Random random = new Random(); for (int i = 1 ; i <= 20 ; i++) { int number = random.nextInt(10) + 1; %> <%= i %> 번째 = <%= number %> <br> <% if (number == 7) break; } %> </body> </html> |
<%@ page buffer = "none" autoFlush="false" %>
-@out 객체의 메쏘드들
int getBufferSize() : 버퍼의 크기를 구한다.
int getRemaining() : 현재 버퍼의 남은 크기를 구한다.
void clear() : 버퍼의 내용을 비운다. 만약 이미 버퍼가 플러시 된 경우 IOException을 발생시킨다.
void clearBuffer() : 버퍼의 내용을 비우는데 버퍼 플러시 된 경우에도 IOException 발행 안시킨다.
void flush() : 버퍼 플러쉬 한다.
boolean isAutoFlush() : 버퍼가 다 찼을때 자동으로 플러시할 경우 true를 리턴한다.
-@pageContext 의 메소드들 : 하나의 JSP 페이지와 1:1로 매핑되는 객체
ServletRequest getRequest() : request 기본 객체를 구한다.
ServletResponse getResponse() : response 기본객체를 구한다.
HttpSession getSession() : session 기본 객체를 구한다.
ServletContext getServletConfig() : config기본객체를 구한다.
JspWriter getOut() : out기본객체를 구한다.
Exception getException() : exception 기본객체를 구한다.
Object getPage() : page 기본 객체를 구한다.
-@application : 특정 어플리케이션과 관련된 기본 객체
String getinitParameter(String name) : 이름이 name인 웹 어플리케이션 초기화 파라메터의 값을 읽어온다. 없으면 null.
Enumeration getInitParameternames() : 웹 어플리케이션 초기화 파라미터의 이름 목록을 리턴한다.
String getServerinfo() : 서버정보를 구한다.
String getMajorVersion() : 서버가 지원하는 서블릿 규약의 메니저 버전을 리턴한다.
String getMinorVersion() : 서버가 지원하는 서블릿 규약의 마이너 버전을 리턴한다., 버전의 소수 부분을 리턴한다.
void log(String msg) : 로그메세지 msg를 기록한다.
void log(String msg, Throwable throwable) : 로그 메시지 msg를 기록한다. 예외정보도 함께 로그 파일에 기록한다.
String getRealPath(String path) : 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원의 시스템 상에서의 자원 경로를 턴한다.
java.net.URL getResource(String path) : 웹어플리케이션 내에서 지정한 경로에 해당하는 자원에 접근할 수 있는 URL 객체를 리턴한다.
java.io.InputStream getResourceAsStream(String path) : 웹어플리케이션 내에서 지정한 경로에 해당하는 자원으로부터 데이터를 읽어올 수 있는 InputStream을 리턴한다.
3. Scope
PAGE 영역 - pageContext 기본객체
REQUEST 영역 - request 기본객체
SESSION 영역 - session 기본객체
APPLICATION 영역 - application 기본객체
위의 네가지 기본 객체는 다음의 메소드를 제공한다.
void setAttrivute(String name, Object value) : 이름이 name인 속성값을 value로 지정한다.
Object getAttribute(String name) : 이름이 name 인 속성의 값을 구한다. 지정한 이름의 속성이 존재하지 않을 경우 null을 리턴
void removeAttribute(String name) : 이름이 name인 속성을 삭제한다.
java.util.Enumeration getAttributeNames() : 속성의 이름 목록을 구한다.(pageContext 기본 객체는 이 메소드를 제공하지 않는다.)
지정할때 는 아래와 같이 하고
session.setAttribute("session_start", new java.util.Date());
session.setAttribute("memberid","madvirus");
application.setAttribute("application_temp",new File("c://temp"));
읽어올때는 다음과 같이 한다.
Date date=(Date)session.getAttribute("session_start");
String memberID = (String)session.getAttribute("memberid");
File tepDir = (File)application.getAttribute("application_temp");
기본타입을 쓰고 싶을 때는 wrapper 클래스를 사용해야 한다.
Integer intValue = new Integer(100);
request.setAttribute("ratio", intValue);
Integer intValue = (Integer)request.getAttribute("ratio");
int value = intValue.intValue();
4. 에러처리
page디렉티브의 errorPage 속성을 사용하여 에러를 처리한다.
<%@ page errorPage = "/error/viewErrorMessage.jsp" %> 이렇게 지정하고 여기에서 지정한 viewErrorMessage.jsp 페이지에서는 다음과 같이 세팅한다.
<%@ page isErrorPage="true" %> 이 페이지는 에러 페이지라는 것을 앞에 표시한다.
이렇게 하면 exception 기본 객체를 사용할 수 있게 된다.
JSP에서는 WEB-INF/web.xml 파일에서 각각의 에러 상태 코드별로 보여줄 페이지를 지정할 수 있도록 하고 있다.
<web-app>
<error-page>
<error-code>에러 코드</error-code>
<location>에러페이지의 URI</location>
</error-page>
</web-app>
<error-page>
<exception-type>java.lang.NullPointerException(/exception-type> 으로 하면 예외 종류별 에러페이지를 작성할 수 있다.
<location>에러페이지의 URI</location>
</error-page>
-- 에러페이지의 우선숭의 및 에러페이지 지정 형태
1. page 디렉티브의 errorPage 속성
2. JSP 페이지에서 발생한 예외타입이 web.xml의 <exception-type> 에서 지정한
3. <error-code>
4. 아무것도 해당 안되면 톰캣 기본 에러
5. 페이지 이동
<jsp:forward page="이동할 페이지" /> 액션 태그를 이용한 이동
추가로 정보를 전달하고 싶을때
<jsp:forward page="moveTo.jsp">
<jsp:param name="first" value="BK" />
<jsp:param name="last" value="Choi" />
</jsp:forward>
파라미터를 이용한 정보 전달
request.setAttribute(String name, Object value) 로 넘긴다.
리다이렉트를 이용한 페이지 이동
<%
String paramString = "code=A000&type=C";
response.sendRedirect("/to/move.jsp?"+paramString);
%>
자바스크립트를 이용한 페이지 이동
6. jsp페이지 모듈화
<jsp:include> 액션태그를 이용한 페이지 모듈화
<jsp:include page=sub.jsp" flush="true" /> 여기에서 flush를 true로 설정하면 sub.jsp에서 response.setheader()처럼 헤더를 지정하거나 추가해 주는 메소드를 실행해도 헤더가 반영되지 않는다.
포함할 페이지에 값을 전달하기
<jsp:include page="moveTo.jsp" flush="false">
<jsp:param name="first" value="BK" />
<jsp:param name="last" value="Choi" />
</jsp:forward>
*include 디렉티브를 이용한 중복된 코드 삽입
<%@ include file="포함할 파일" %>
※<jsp:include> 액션태그는 jsp 파일을 컴파일한 결과 값을 가져온다.
하지만 <%@ include > 디렉티브는 그상태 그대로 코드를 가져와서 한꺼번에 컴파일 한다.
※ include 디렉티브를 사용해서 포함하는 파일의 경우 일반 파일과 구분짓기 위해서 확장자를 jspf로 사용한다.
여기서 jspf는 JSP Fragment 즉, jsp의 소스코드 조각을 의미한다.
<?xml version="1.0" encoding="euc-kr"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>8장 예제</display-name> <description> 8장의 예제 소스 코드 및 실행 코드 </description>
<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>
</web-app> |
비교 |
<jsp:inlcude> |
include 디렉티브 |
처리시간 |
요청시간에 처리 |
jsp파일을 자바 소스로 변환 할 때 처리 |
데이터 전달 방법 |
request 기본 객체나 <jsp:param>을 이용한 파라미터 전달 |
페이지 내의 변수를 선언한 후, 변수에 값 저장 |
용도 |
화면의 레이아웃의 일부분을 모듈화 할 떄 주로 사용 |
다수의 JSP 페이지에서 공통으로 사용되는 변수를 지정하는 코드나 저작권과 같이 공통의 문장을 포함한다. |
기능 |
병도의 파일로 요청처리 흐름을 이용 |
현재파일에 삽입시킴 |
7. 쿠키와 세션
7-1. 쿠키 사용
○절차 : 쿠키 생성 - 쿠키 저장 - 쿠키 전송
○쿠키의 구성 요소 : 이름(쿠키 구별하는데 씀), --<알파벳과 숫자만 쓸수 있다.>
값(쿠키 이름과 관련된 값),
유효시간(쿠키 유지 시간),
도메인(쿠키를 전송할 도메인),
경로(쿠키를 전송할 요청 경로)
○생성하기
<%
Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie);
%>
○쿠키 메소드들
String getName() : 쿠키의 이름을 구한다.
String getValue() : 쿠키의 값을 구한다.
void setValue(String vlaue) 쿠키의 값을 지정
void setDomain(String pattern) : 이 쿠키가 전송될 서버의 도메인을 지정한다.
String getDomain() : 쿠키의 도메인을 구한다.
void setPath(String uri) :쿠키를 전송할 경로를 지정한다.
String getPath() : 쿠키의 전송 경로를 구한다.
void setMaxAge(int expiry) : 쿠키의 유효 시간을 초 단위로 지정한다. 음수를 입력하면 웹브라우저 닫을 때 쿠키도 같이 삭제 된다.
int getMaxAge() : 쿠키의 유효 시간을 구한다.
○쿠키 값 읽어오기
Cookie[] cookies = requeset.getCookies();
○쿠키 값 변경 및 삭제
<%@ page contentType = "text/html; charset=euc-kr" %> <%@ page import = "java.net.URLEncoder" %> <% Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (int i = 0 ; i < cookies.length ; i++) { if (cookies[i].getName().equals("name")) { Cookie cookie = new Cookie("name", URLEncoder.encode("JSP프로그래밍")); response.addCookie(cookie); //cookies[i].setValue(URLEncoder.encode("자바와 JSP")); //response.addCookie(cookies[i]); } } } %> <html> <head><title>값 변경</title></head> <body> name 쿠키의 값을 변경합니다. </body> </html> --------------------------------------------------------------------------------------------------------------- 삭제는 다음과 같이 한다. <%@ page contentType = "text/html; charset=euc-kr" %> <%@ page import = "java.net.URLEncoder" %> <% Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (int i = 0 ; i < cookies.length ; i++) { if (cookies[i].getName().equals("name")) { Cookie cookie = new Cookie("name", ""); cookie.setMaxAge(0); response.addCookie(cookie); } } } %> <html> <head><title>쿠키 삭제</title></head> <body> name 쿠키를 삭제합니다. </body> </html> |
○쿠키 도메인
.hybridego.net - 점으로 시작하는 경우 관련 도메인 모두 쿠키를 전송
mail.hybridego.net www.hybridego.net, asdf.hybridego.net 등으로 모두 전송 된다.
www.hybridego.net - 특정 도메인에 대해서만 쿠키를 전송한다.
7-2. 세션 사용
세션은 기본적으로 하나의 웹 브라우저에 하나의 세션을 생성한다.
○세션 생성하기
<%@ page contentType = … %>
<%@ page session = "true" %>
페이지 디렉티브의 session속성의 기본값이 true 이기 때문에 별도로 지정하지 않아도 세션이 기본적으로 생성 된다.
○세션 메소드
String getId() : 세션의 고유 ID를 구한다.
long getCreationTime() : 세션이 생성된 시간을 구한다. (1970-1-1일 이후 흘러간 시간, 단위는 1/1000초
long getLastAccessedTime() : 웹 브라우저가 가장 마지막에 세션에 접근한 시간
<%@ page contentType = "text/html; charset=euc-kr" %> <%@ page session = "true" %> <%@ page import = "java.util.Date" %> <%@ page import = "java.text.SimpleDateFormat" %> <% Date time = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); %> <html> <head><title>세션정보</title></head> <body> 세션ID: <%= session.getId() %> <br> <% time.setTime(session.getCreationTime()); %> 세션생성시간: <%= formatter.format(time) %> <br> <% time.setTime(session.getLastAccessedTime()); %> 최근접근시간: <%= formatter.format(time) %> </body> </html> |
※ 쿠키대신 세션을 사용하는 이유
쿠키는 네트워크를 통한 전송 도중 다른사람이 볼 수도 있지만 세션은 서버에만 있기 때문에 안전하고
웹 브라우저에서 쿠키사용을 막으면 쿠키를 생성할 수 없지만 세션은 상관이 없다.
○세션 종료
session.invalidate();
session.removeAttribute("이름"); 이렇게 세션을 삭제해도 로그 아웃한 효과를 볼수 있다.
○세션 타임아웃 설정
- web.xml에
<session-config>
<session-timeout>50</session-timeout> 분단위
</session-config>
이렇게 설정
- session 기본객체가 제공하는 setMaxInactiveInterval() 메소드 사용
<%
session.setMaxInactiveInterval(60*60); 초단위
%>
8. jsp에서 자바빈 활용하기
JavaBean은 데이티를 표현하는 것을 목적으로 하는 자바 클래스이다.
public class BeanClassname implements java.io.Serializalble {
/*값을 저장하는 필드 */
private String value;
/*BeanClassName 의 기본 생성자 */
public BeanClassName(){
}
/*필드의 값을 읽어 오는 값 */
public String getValue() {
return value;
}
public void setValue(String value){
this.value - value;
}
}
자바빈 규약에 따르는 클래스를 자바빈이라고 부른다.
자바빈 클래스는 데이터저장 필드, 데이터를 읽어오는 메소드, 데이터를 저장하는 메소드로 구성된다.
<jsp:useBean id="info" class="hybridego.member.MemberInfo" scope="request" />
위의 액션태그는 다음과 같은기능을 한다.
memberinfo info = (Memberinfo)request.getAttribute("info");
if (info==null){
info = new MemberInfo();
request.setAttribute("info", info);
}
<jsp:useBean id="info" type="hybridego.member.MemberInfo" scope="request" /> 이렇게 쓰면 지정한 영역에 이미 객체가 존재한다고 가정한다. 객체가 존재하지 않을 경우 에러를 발생시킨다.
<jsp:getProperty name = "info" property="name" />
<jsp:setProperty name = "info" property="name" value="전호철" />
value 속성 대신 param 속성을 활용할 수도 있다.
param속성은 값을 프로퍼티의 값으로 지정할 때 사용된다.
<jsp:setProperty name="info" property="name" param="name" /> 이렇게 하면 name 파라메터값을 지정한다.
<jsp:setProperty name="info" property="*" /> 이렇게 하면 각각의 파라메터값이 각각의 프로퍼티에 들어간다.
'JSP' 카테고리의 다른 글
자바빈(Java Bean) 컴포넌트 (0) | 2007.06.18 |
---|---|
[JSP] 세션을 이용한 로그인 처리 (0) | 2007.05.03 |
JSP 맛보기 (0) | 2007.04.06 |