봉봉의 개인 블로그
2017-06-08-P 본문
JSP지시어 [Directive]
<%@ %>
JSP지시어(Directive)는 위와 같은 혁식으로 표현되며 JSP 파일 내에서 JSP 를 실행할 컨테이너에서 해당 페이지를 어떻게 처리할 것인가에 대한 설정 정보들을 지정해주는데 사용된다. 지시어는 page지시어 ,include지시어,taglib 지시어 3가지로 나누어 진다.
Page 지시어
Page 지시어는 JSP 페이지에 대한 속성을 지정하는 지시어로 형식에 맞춰 사용된다.
Page 지시어의 속성
langueage : 스크립트 요소에서 사용할 언어설정
extends : 상속받을 클래스를 설정
import : import할 패키지,클래스 설정
session : HttpSession 사용 여부를 설정
buffer : JSP페이지의 출력버퍼 크기를 설정
autoFlush : 출력버퍼가 다 찼을 경우 처리방법을 설정
isThreadSafe : 다중 스레드의 동시 실행 여부를 설정
info : 페이지 설명
errorPage : 에러 페이지로 사용할 페이지를 지정
contentType : JSP 페이지가 생성할 문서의 타입을 지정
isErrorPage : 현재 페이지를 에러 페이지로 지정
pageEncoding : 현재 페이지의 문자 인코딩 타입 설정
include 지시어
include 지시어는 특정한 JSP 파일 또는 HTML 파일을 해당 JSP 페이지에 삽입할 수 있도록 하는 기능을 제공하는 지시어이다. 여러 JSP 페이지에서 공통되는 부분이 많을 때 이러한 공통되는 부분을 따로 파일로 만들어 include 지시어로 삽입하면 매번 같은 내용을 입력하지 않고도 간단하게 공통되는 부분을 포함시킬 수 있다.
<%@ inclued file=""%> 이와 같이 사용이 된다.
Taglib 지시어
taglib 지시어는 JSTL 이나 커스텀 태그 등 태그 라이브러리를 JSP 에서 사용할 때 접두사를 지정하기 위해 사용된다. taglib 지시어는 uri속성과 prefix 속성의 두가지 속성으로 이루어 지는데 uri 속성은 태그 라이브러리에서 정의한 태그와 속성 정보를 저장한 TLD 파일이 존재하는 위치를 지정하고 , prefix속성에는 사용할 커스텀 태그의 네임 스페이스(name space)를 지정한다.
<%@ taglib uri="" prefix=""%> 와 같이 사용이 된다.
JSP스크립트 요소
선언문(Declaration)
선언문은 JSP 페이지 에서 자바코드에서 말하는 멤버 변수와 메소드를 선언하기 위해 사용된다.
선언문은 다음과 같이 사용된다 <%!%> 와 같이 사용된다.
스크립트릿 안에 <%%>안에 선언된거와 <%!%> 선언된 것의 차이점은 <%%>안에 선언된 변수등은 지역변수느낌이고 <%!%> 안에 선언된 문은 전역변수 느낌으로 service 밖에 선언되있다고 생각하면 편하다.
표현식(Expression)
표현식은 선언문 또는 스크립틀릿 태그에서 선언된 변수 값이나 메소드의 리턴값을 스크립틀릿 태그 외부에서 출력하기 위해 사용되는 방법으로 다음과 같이 사용한다
<%=변수%>
<%=리턴값이 있는 메소드%>
<%=수식(변수또는 리턴값이 있는 메소드를 포함할수 있슴)%>
이런식으로 표현하지만 나중에 JSP 에서는 표현식을 사용하지 않고 ${값} 이런식으로 표현하게 된다.
내장객체
request : 클라이언트의 HTTP요청정보를 저장한 객체(HTTP 헤더정보,파라미터등)
response : HTTP 요청에 대한 응답 정보를 저장한 객체
session : 클라이언트의 세션 정보를 저장한 객체
pageContext : 페이지 실행에 필요한 컨텍스트 정보를 저장한 객체
out : 응답 페이지 전송을 위한 출력 스트림 객체
application : 동일한 애플리케이션의 컨덱스트 정보를 저장한 객체
config : 해당 페이지의 서블릿 설정 정보(초기화 정보 ) 를 저장한 객체
page : 해당 페이지 서블릿 객체 (인스턴스)
exception : 예외 처리를 위한 객체
request
String = getParameter(String name)
String[] = getParameterValues(String name)
Enumeration = getParameterNames()
HTTP 헤더 정보와 관련된 메소드들
리턴 타입 = 메소드명 : 설명
String = getHeader : HTTP 요청헤더에 headerName 으로 지정된 이름으로 할당된 값을 리턴한다. headerName 으로 지정된 이름이 없을 경우 null을 리턴한다.
Enumeration = getHeaders : headerName 으로 지정된 이름으로 할당된 모든값을 java.util.Enumeration 객체로 리턴한다.
Enumeration = getHeaderNames() : HTTP 요청 헤더에 포함된 모든 헤더 이름을 java.util.Enumeration 객체로 리턴한다.
int = getIntHeader : headerName 헤더의 값을 int타입으로 리턴한다.지정된 헤더값을 int로 변환할수 없을 경우에는 NumberFormatException이 발생하고 headerName 헤더가 없을 경우에는 -1을 리턴한다.
response
리턴 타입 = 메소드명 : 설명
setHeader : 응답에 포함될 헤더 정보에 headerName 의 이름으로 headerValue 값을 설정해 추가한다.
addCookie : javax.servlet.http.Cookie 타입의 쿠키 객체를 응답헤더에 추가한다.
sendRedirect : 지정된 URL로 요청을 재전송한다.
setContentType : 응답 페이지의 cintentType을 설정한다.
pageContext
리턴 타입 = 메소드명 : 설명
ServletRequest = getRequest : 클라이언트의 요청 정보를 담고 있는 객체를 리턴한다.
SErvletResponse = getResponse : 용청에 대한 응답 객체를 리턴한다.
JspWrite = getOut : 응답출력스트림을 리턴한다.
Objext = getPage : 서블릿 인스턴스 객체를 리턴한다.
ServletConfig = getServletConfig : 서블릿의 초기 설정 정보를 담고 있는 객체를 리턴한다
ServletContext = getServletContext : 서블릿의 실행 환경 정보를 담고 있는 객체를 리턴한다.
HttpSession = getSession : 클라이언트의 세션 정보를 담고 있는 객체를 리턴한다.
forward : 현재 페이지의 요청과 응답에 관한 제어권을 URL로 지정된 주소로 영구적으로 넘긴다. forward 된 페이지의 요청 처리가 종료되면 응답도 종료된다.
include : 현재 페이지의 요청과 응답에 관한 제어권을 URL로 지정된 주소로 임시로 넘긴다. include 된 페이지의 처리가 끝나면 제어권은 다시 원래의 페이지로 돌아온다. 따라서 include 로 지정된 페이지의 내용을 원래 페이지에 삽입하는 효과를 가진다.
영역객체
영역 = 영역객체 : 설명
page = pageContext : 해당 페이지가 클라이언트에 서비스를 제공하는 동안에만 유효
(서블릿 인스턴스의 _jspServicer() 메소드가 실행되는 동안에만 유효)
request = request : 클라이언트의 요청이 처리되는 동안 유효
(포워딩 또는 include 를 이용하는 경우 여러개의 페이지에서도 요청 정보가 계속 유지되므로 request 영역의 속성을 여러 페이지에서 공유할수 있다,)
session = session : 세션이 유지되는 동안 유효
(하나의 브러우저에 1개의 세션이 생성되므로 같은 웹브라우저 내에서 실행되는 페이지들이 속성을 공유할수 있다.)
application = application : 웹 어플리케이션이 실행되고 있는 동안 유효
(웹 컨테이너에서 해당 어플리케이션은 오직 하나만이 실행되므로 4가지 영역중 가장 큰 영역에 해당한다.)
웹 컨테이너를 종료하면 어플리케이션 영역 객체가 소멸된다.
속성과 관련된 메소드들
리턴타입 = 메소드명 : 설명
Object = getAttribute : key 값으로 등록되어 있는 속성을 Object 타입으로 리턴
(key 값에 해당하는 속성이 없을 경우 null을 리턴)
Enumeration = getAttributeNames : 해당영역에 등록되어 있는 모든 속성들의 이름을 Enumeration 타입으로 리턴
setAttribute : 해당영역에 key 값의 이름으로 obj 객체를 등록
removeAttribute : key 값으로 등록되어 있는 속성을 제거
액션태그
JSP에서 제공하는 액션 태그는 크게 다음과 같이 나눌수 있다.
페이지 흐름 제어 액션(forward/include 액션)
자바빈 사용 액션(useBean 액션)
애플릿 사용 액션(plugin 액션)
forward 액션태그
jsp 에서의 액션태그의 사용법은 다음과 같다.
1.<jsp:forward page="이동할페이지"/>
2.<jsp:forward page="이동할페이지"></jsp:forward>
이런식으로 사용하면된다
XML 문법을 이용하여 구현된 기능이므로 위에서 보여지듯이 태그의 끝에 종료 태그가 반드시 있어야한다. 즉 단독으로 태그가 쓰여졌을 경우에는 1번과 같이 사용하여야하며 해당태그의 하위에 본문이 있을때에는 반드시 2번처럼 사용해 주어야한다.
include 액션태그
jsp 에서의 액션태그의 사용법은 다음과 같다.
1.<jsp:include page="포함될 페이지" flush="false"/>
2.<jsp:include page="포함될 페이지" flush="false"></jsp:include>
이런식으로 사용하면 된다.
자바빈[javabean]
자바빈을 사용하는 이유는 디자인 부분과 비즈니스 로직 부분을 분리하기 위함이다.자바빈을 사용하게 되면 디자이너는 디자니너의 역할만, 프로그래머는 프로그래머의 역할만 할수 있게 된다.
JSP에서 세션 관리
session 객체의 메서드
setAttribute(String attrName,Object attrvalue) : 세션 영역에 속성을 생성한다.
removeAttribute(String attrname) : 파라미터로 지정된 이름의 속성을 제거한다.
getAttribute(String attrName) : 지정된 이름의 속성 값을 반환한다.
getid() : 클라이언트의 세션 ID 값을 반환한다.
setMaxInactiveInterval(int seconds) : 세션의 유지 시간을 설정한다.
getMaxinactiveInterval() : 세션의 유지시간을 반환한다.
invalidate() : 현재의 세션의 정보들을 모두 제거한다.
Cookie 객체의 메서드
setValue(String value) : 쿠키 값을 설정한다.
setMaxage(int seconds) : 쿠키 만료 기간을 지정한다.
getvalue() : 쿠키 값을 얻어온다.
getMaxage() : 쿠키 만료 기간을 얻어온다.
getName() : 쿠키 이름을 얻어온다.
예외 처리
page 지시자의 errorpage 속성 사용
즉 늘 보던 404 나 500에러 말고 임의로 만든 에러 페이지를 보여줄수 있다.
만약 에러가 나면 모든 페이지에서 적용이 되야 하기 때문에 이런 겹치는 부분들은
web.xml에서 exception-type 에서 설정하여 모든 페이지에 사용할수있다.
이런방법을 이용하여 include 도 사용이 가능하다.
파일 업로드 하기
예제를 보면서 설명하겠다 예제에서는 Part 인터페이스를 사용한 MultipartConfig 어노테이션을 이용하였지만 그 외에도 COS 라이브러리,Multipartrequest 등 파일을 업로드할수있는것들이 있다.
예제를 보기전에 Part 인터페이스에서 제공되는 메서드들에는 다음과 같은 것이 있다.
delete() : Part에 담겨있는 파일 항목을 관련된 임시 디렉토리를 포함하여 삭제한다.
getContentType() : Part 객체의 컨텐트 타입을 String 형태로 반환한다.
getHeader(java.lang.String name) : 인자로 지정된 헤더의 정보를 String 형태로 반환한다.
getGeaderNames() : Part 객체의 헤더 정보들을 Collection<String>행태로 반환한다.
getHeaders(java.lang.String name) : 인자로 지정된 헤더의 정보들을 Collection<String> 형태로 반환한다.
getInputStream() : Part의 내용을 읽어 들일수있는 InputStream 타입의 객체를 반환한다.
getName() : Part 객체의 이름을 String 타입으로 반환한다.
getSize() : 파일의 크기를 바이트 단위의 long 타입으로 반환한다.
write(java.lang.String fileName) : Part객체의 파일을 인자로 지정된 파일 이름으로 디스크 상에 출력한다.
위와 같은 메서드 들이 있다
이제 예제를 살펴보겠다.
먼저 파일을 업로드 할수 있는 form 을 만들어준다.
위와 같은 파일 업로드 폼을 만들어준다.
이때 enctype은 multipart/form-data 로 해줍니다.
간단하게 폼에서 partuploadpro1 을 요청하여 처리할 내용으로는 파일의 마인타입을 보고 그게 만약 img 파일이면 그걸 작게 만들어 썸네일의 형식으로 변환하여 저장하는 방식이다.
이걸 받아서 처리할수 있는 servlet 을 만들어 줍니다.
위와 같이 servlet 을 작성해줍니다 설명을 하자면 먼저 18번 줄에서 servlet을 맵핑합니다 그래서 18번라인의 문장처럼 요청을 하게되면 method 방식에 맞게 get 이나 post 가 실행되게 됩니다.
지금은 post 방식으로 데이터를 넘겼기 떄문에 dopost 메서드만 필요하게 됩니다.
그리고 19번 줄과 같이 적어주게 되면 원래의 request 는 문자로 넘어 오게 되지만 저렇게 MultipartConfig 를 통해 request 를 래핑해주게 되면 request 를 래핑하게 되어 안에 파일의 형태도 받을수있는 상태가 된다.
그렇게 해서 post 방식으로 데이터가 넘어왔기때문에 23번 줄에서 먼저 한글 처리를 할수있게 encoding 을 먼저 해주게 됩니다. 그후 25번 라인에서 request 안에 있는 writer 를 받아와서 writer 안에 담아줍니다.
그후 파일같은 경우는
래핑되어서 넘어올때 데이터가 구분자가 들어가서 넘어오기때문에 그부분을 한 part 로 구분하여
Part 타입의 part 변수를 선언하고 request 안에 getPart 를 통해 partfile1 의 값을 Part에 담아줍니다.
그후 29번줄과 같이 적어서 part 안에 인자의 정보를 String 형태로 반환하여 contentDisposition 안에 담아줍니다
그후 마찬가지로 31 번줄과 같이 content-type(마인타입) 의 인자의 정보를 String 형태로 반환하여 contenttype에 담아줍니다.
그후 if 문을 통해서 받아온 content-type 즉 마인타입을 이용해 img 파일이아닌 파일들을업로드 했을때 else 문을 이용해서 다시 업로드 폼으로 돌아가게 만들고 img 파일이 올라왔을때 if 문이 실행되게끔 조건문을 만들어 줍니다. 조건이 일치하여 if 문이 실행이 되면 35번 줄과 같이 contentDisposition 안에 lastIndexof 를 통해 .이있는 곳까지의 숫자를 구해서 그 int 를 int 타입의 dotposition 안에 담아줍니다.
그후 String 타입의 temp 를 만들고 그안에 contentDisposition 안에 문자를 subString 을 이용해 dotPosition숫자부터 contentDisposition 길이의 -1 만큼을 잘라서 담아줍니다 이렇게 하는 이유는 확장자 명을 알아내기 위함이고 길이의 -1 만큼 잘라내는 이유는 맨 마지막에 " 이 붙어있기때문에 .jpg 이런식으로 확장자 명을 가지고 오기 위함이다.
그후 UUID api 를 이용하여 파일의 이름을 랜덤으로 만들것이다.
UUID 클래스 타입으로 uuid 를 만들고 그안에 UUID 안에 있는 randomUUId 메서드를 실행에 uuid 에 담아줍니다
받은 그 uuid를 toString() 을 통해 String 형태로 값을뽑아내고 그값을 String 타입의 filename 안에 담아줍니다.
그후 41번줄과 같이 filename 에 += temp 를 추가하여 asdfasdfasdfweffsdfsdf.jsp 같은 형태를 만들어줍니다.
그후 42번줄을 통해 filename 으로 된 파일을 19번에서 location 에 위치에 내용을 저장합니다.
그러면 업로드한 파일이 location에 적힌 위치에 저장이 된다.
그러면 이제 이걸 다시 썸네일 형식으로 작게 만들어서 다시 저장하는걸 해볼것이다
43번줄과 같이 방금 만들 파일을 불러와 줍니다
그후 44번줄과 같이 적어 빈file 을 만들어줍니다.
그후 내용을 ImageIO.read 를 통해 원본파일의 내용을 하나하나읽어서 bufferedImage 로 선언된 변수 srcbi 안에 담아줍니다. 그후 이게 원본 파일이라면 작게 썸네일화된 img 의 빈 파일이 필요하기 때문에 47번줄과 같이 적어서 빈 img 도화지 같은곳을만들어 줍니다.
그리고 48번의 줄에서 Graphics2D 를 이용해 빈 img 도화지 같은곳을 불어와서 변수Graphics2D 타입의 변수 g 에 담아줍니다.
그후 g.drawImage를 이용해 원본파일의 내용을 0,0 부터 50,50 까지 채워 넣어줍니다.
그후 50번 줄과같이 ImageIo.write 통해서 drawImage 통해 채워준 destbi 의 내용을 temp.subString(1) 의 확장자명을 붙어 destfile 안에 담아서 파일화 해줍니다. 그러면 썸네일 같은 작은 img 파일이 생성이 되어있습니다.
'학원에서 배운것들 > TEA - P' 카테고리의 다른 글
2017-06-14-P (0) | 2017.06.14 |
---|---|
2017-06-09-P (0) | 2017.06.09 |
2017-06-07-P (0) | 2017.06.07 |
2017-06-02-P (0) | 2017.06.02 |
2017-06-01-P (0) | 2017.06.01 |