공부/그냥 공부
[JSP] Java Server Page
ㄱ ㅣ린
2023. 3. 26. 02:30
※ JSP (Java Server Page)
- Java EE에서 동적으로 웹페이지(HTML)를 생성하기 위해 제공하는 기능.
- Servlet 기능 개선
- class안에 HTML코드를 작성하는 방식
- 디자이너와 개발자간의 업무구분이 되지않는다
- 제작하여 서비스하기 복잡하다
- 개발자가 컴파일하지 않는다. (Web Container가 자동 컴파일)
- 디자이너와 개발자간 업무구분이 어느정도 가능
- + CSS(Client Side Script): Front-End에서 실행되는 스크립트 언어
- JavaScript, ActionScript --> HTML안에서 작성되고 실행되는 언어
- SSS(Server Side Script): Back-end에서 실행되는 스크립트 언어
- JSP, ASP, PHP --> 요청되면 동적으로 HTML을 생성하는 언어
# JSP Tags
- JSP에서 기능을 정의할 때 사용하는 태그들
- JSP가 자바로 변경될 때 코드가 생성되고, 사용자들에게 태그의 내용이 보이지 않는다.
- 5가지 종류
태그명 | 태그 | 설명 | |
지시자 (directive) | page | <%@ page .. %> | JSP페이지의 환경설정용 |
include | <%@ include .. %> | 다른 JSP를 끼워넣을 때 사용 | |
스크립트렛 (scriptlet) | <% %> | JSP에서 method안에 정의하는 자바코드를 작성할 때 지역변수 선언, 제어문 |
|
표현식 (expression) | <%= %> | 웹 브라우저로 출력할 때 | |
선언 (declaration) | <%! %> | JSP에서 method를 정의할 때 JSP에서 instance variable, static variable를 선언할 때 |
|
주석 (comment) | <%-- --%> | JSP태그의 실행을 막을 때 |
- 스크립트렛 Scriptlet
- 형식) <% %>
- JSP에서 method안에 정의하는 자바코드를 작성할 때
- Scriptlet안에서 정의한 코드는 JSP가 자바소스로 변경될 때, _jspService()안에 코드가 생성
- 표현식 Expression
- 형식) <%= 값 %>
- JSP에서 발생한 값을 웹 브라우저로 출력하기 위해 사용
- JSP가 자바로 변경될 때 _jspService method안에 out.print()로 변경된다.
- JSP: <%= 값 %> → 코드변환: out.print(값);
- Error: out.print method에는 파라미터가 하나만 존재하기 때문에 <%= 값, 값 %%> → out.print(값, 값);
- 선언 (Declaration)
- 형식) <%! 코드 → _jspService가 아닌 class field에 코드가 생성된다 %>
- ¡ 주의: JSP나 Servlet은 객체를 사용하여 접속자를 구분하기 어렵기 때문에, 객체마다 생성되는 instance 변수로 접속자를 구분하기 어렵다 !
- 내장객체를 사용할 수 없다
- 주석 (Comment)
- 형식) <%-- --%>
- JSP tag의 실행을 막을 때 사용
- 지시자 (Directive)
- 형식) <%@ %>
- page 지시자
- 문법) <%@ page 속성="값" 속성="값" %>
- JSP 페이지의 환경 설정용
속성명 | 기본값 | 하는일 | 확장값 |
language | java | JSP페이지에서 사용할 언어 설정 | OOP언어를 완벽하게 지원하는 언어 |
extends | HttpJspBase (WAS마다 다름) |
JSP가 자바소스로 변경될 때 상속받을 부모 클래스 설정 | 웹서비스를 할 수 있는 코드가 구현된 class |
isThreadSafe | "true" | JSP에서 Thread에 대한 사용설정 | "false" - JSP를 접속자바다 프로세스를 생성하여 사용할 때 |
buffer | "8kb" | JSP가 HTML로 생성될 때 사용할 Stream의 크기 | "8kb, 16kb, 32kb" |
autoFlush | "true" | 스트림의 내용을 분출 | "false" |
info | "" | JSP페이지의 간단한 설명 | JSP페이지의 간단한 설명 |
contentType | "text/html" | JSP가 응답될 때 생성할 파일 설정. (MIME type 설정 - web.xml에서 확인) | web.xml에 설정된 MIME-type들 |
pageEncoding | "UTF-8" | JSP파일 내에서 사용할 charset 설정 | 사용할 charset |
session | "true" | JSP에서 WAS가 제공하는 Session을 사용할 때 | "false" |
errorPage | "" | JSP페이지에서 error가 발생할 때 이동할 페이지의 설정 | Error가 발생했을 때 응답할 페이지의 URL |
isErrorPage | "false" | JSP가 다른 JSP에서 문제가 발생했을 때 보여줄 에러 페이지인지의 설정 | "true" |
isELlgnored | "false" | JSP에서 EL의 사용여부 | "true" - EL을 사용하지 않음 |
trimDirective WhiteSpaces |
"false" | JSP에서 지시자를 사용할 때 발생하는 enter를 없앨 때 | "true" - 지시자에 의해 발생되는 공백을 없앤다 |
import | JSP운영에 필요한 패키지 | JSP에서 다른 패키지의 클래스를 사용할 때 | "패키지명.클래스명" - 필요한 패키지를 사용 |
- include 지시자
- 문법) <%@ include file="JSP URI" %>
- http://localhost/jsp/project/test.jsp == URL
- http://localhost/jsp/project/test.jsp == URI (서버의 정보를 포함하지 않은 주소(다른 서버 접속 불가))
- 여러 JSP가 하나의 JSP에 합쳐져서 한번에 보여줄 때 사용
- 주의: JSP의 page지시자가 다른 값을 가지게 되면 error가 발생할 수 있다
- JSP가 자바소스로 변경될 때 합쳐진다. 다른 JSP 변수나 method를 사용할 수 있다(변수나 method가 공유된다.)
- web browser에서 source 보기 했을 때 하나의 HTML 처럼 보이도록 만든다
- 공통디자인보다는 여러 페이지에서 사용되는 공통코드를 정의할 때 주로 사용한다. (로그인 되었는지 세션을 체크하는 코드)
- <jsp:include>, <c:import> 보다 동작속도가 빠르다
- 문법) <%@ include file="JSP URI" %>
# JSP 요청
- GET 방식과 POST 방식으로 요청
- <a>, <form>, location
- GET 방식 요청: <a>, <form>, location
- <a> : <a href="요청 JSP URL">링크</a>
- <form> : <form method="get" action="요청 JSP URL"> <input type="button"/> </form>
- <input type="button"> : Javascript에서 유효성 검증 후 document.submit(); 호출하여 back-end 페이지를 요청한다
- location : location.href="요청 JSP URL";
- POST 방식 요청: <form>
- <form method="post" action="요청 JSP URL"> <input type="button"/> </form>
- <input type="button"> : Javascript에서 유효성 검증 후 document.submit(); 호출하여 back-end 페이지를 요청한다
- <form method="post" action="요청 JSP URL"> <input type="button"/> </form>
# 내장 객체
- _jspService method 안에 선언되어 있는 객체들
내장객체명 | 데이터형 | 하는 일 |
request | HttpServletRequest | - 접속자의 정보 얻기 - 요청 파라미터 얻기 - forward로 페이지 이동(RequestDispatcher 함께 사용) - session, cookie 얻기 - forward로 이동한 페이지에서 사용될 값 저장, 관리 |
response | HttpServletResponse | - 응답방식 설정 (MIME type 설정) - redirect로 페이지 이동 - download - cookie 설정 |
session | HttpSession | 접속자 별 데이터를 저장하고 관리 |
out | JspWriter | 웹 브라우저로 출력 |
application | ServletContext | 모든 접속자가 사용하게 될 공통 값 저장, 관리 |
pageContext | PageContext (ServletConfig) | 접속한 페이지에서만 사용될 값 저장, 관리 |
exception | Throwable | - page 지시자의 isErrorPage="true" 상태에서만 존재하는 내장객체 - 예외처리에 사용 |
+ scope 객체: 접속자가 사용하는 값을 저장하고 관리하는 객체. pageContext, request, seesion, application
- 접속자 정보 얻기
- request 내장객체 (HttpServletRequest) 사용
- 요청 방식 : request.get // get, post
- 접속자 ip address : request.getRemoteAddr();
- 접속자 port : request.getRemotePort();
- 요청 URL : request.getRequestURL(); // http://localhost:80/jsp/project/test.jsp
- 요청 URI : request.getRequestURI(); // jsp/project/test.jsp
- 요청 프로토콜 : request.getProtocol(); // http
- 요청 서버주소 : request.getServerName(); // localhost (서버 ip, domain)
- 요청 서블릿 경로 : request.getServletPath(); // project/test.jsp
- 서버 포트 : request.getServerPort(); // 80
- QueryString : request.getQueryString(); // 이름=값&이름=값
- parameter : request.getParameter("이름"); // 값
- parameter values : request.getParameterValues("이름"); // [값, 값,,,]
# Web Parameter 받기
- HTML Form Control의 값 받기
- HTML Form Control에 name 속성의 값이 유일하면 request.getParameter를 사용하고, name 속성의 값이 중복되면 request.getParameterValues(); 를 사용한다.
- name 속성이 같은데 getParameter를 사용하면 가장 처음 값 하나만 입력된다
- 파일 전송(enctype="multipart/form-data")이 아닌 parameter 전송방식 (enctype="application/x-www-for-urlencoded" 방식)
# GET과 POST 방식에서 한글 처리
- GET방식인 경우 decoding된 글자가 저장된다 (한글 안깨짐)
- POST방식인 경우 decoding되지 않은 글자가 저장된다. (한글 깨짐)
- request가 사용되기 전에 수행한다. request.setCharacterEncoding("charset");
# out
- jspWriter 클래스로 생성된 객체로 scriptlet안에서 web browser로 출력할 때
- out.print(" "); out.println(" ");
# response
- 응답방식 설정 ( response.setContentType() ), 관계유지 객체사용(Cookie 설정), 페이지 이동 ( response.sendRediret() ), file Download
# 서버 내 페이지 이동
- forward (request)
- 데이터 처리 페이지와 view 페이지를 분리하여 만들 때 (Model2 방식의 개발에서 주로 사용)
- 요청 시에 페이지 이동
- 웹 브라우저는 페이지 이동을 모른다 (이전 페이지에 요청 parameter을 이동한 페이지에서 사용할 수 있다. URL이 변경되지 않는다.)
- scope객체에 값을 저장하여 이동한 페이지로 값을 보낼 수 있다.
- 사용법)
- 1. 이동할 페이지를 설정하여 RequestDispatcher에 할당
- RequestDispatcher rd = request.getRequestDispatcher("URI"); // 다른 서버로 보낼 수 없다.
- 2. request scope 객체에 값 설정 - 이동할 페이지로 값을 넘겨줄 때
- request.setAttribute("이름", 값);
- 3. 이동
- rd.forward(request, response);
- 1. 이동할 페이지를 설정하여 RequestDispatcher에 할당
- request 내장객체 (scope 객체)를 사용한 값 설정과 값 얻기
- 값 설정: request.setAttribute("이름", Object값);
- 값 얻기: 입력된 클래스명 객체명 = (Casting)request.getAttribute("이름");
- redirect (response)
- 정상적인 요청이 있을 때 응답되는 페이지에서 비정상적인 요청(페이지를 URL을 사용하여 직접 요청)이 발생했을 때 사용한다.
- 요청 URL을 변경하여 보여줄 때 사용
- response 내장객체를 사용하여 페이지를 이동한다.
- 이동한 페이지에서 이전페이지에 요청한 값을 사용할 수 없다.
- 접속자 브라우저에 응답된 후 접속자 브라우저에서 자동 재요청을 수행한다. (URL이 변경된다.)
- 사용법) response.sendRedirect("이동할 URL");
# 관계 유지
- 웹은 비연결성 (요청이 발생하면 응답해주고 연결을 끊는다.)
- 장점: 접속자수가 많아도 연결을 유지하지 않아 저사양의 컴퓨터로도 웹서버를 구성할 수 잇다
- 단점: 서버에서 발생한 데이터를 접속자에 실시간으로 보내줄 수 없다 (server push가 될 수 없다). client pull로 해결할 수 있다(접속자가 지정한 시간애 재요청하여 데이터를 받는다)
- 서버는 접속자의 상태를 알 수 없다 (접속자가 현재 가진 값을 서버에서 알 수 없다.)
- 서버가 접속자의 상태(값)을 알 수 있도록 저장하는 기술 개발 ==> 세션, 쿠키
- 세션 Session
- 접속자의 정보를 서버 측 메모리에 저장하는 기술
- 접속자가 어떤 브라우저를 사용하더라도 정보를 저장할 수 있다 (모든 접속자에 적용할 수 있다.)
- 모든 값이 저장가능 (Object을 저장)
- 자바에서는 session을 사용하기 위해 HttpSession 인터페이스를 제공한다.
- 쿠키 Cookie
- 접속자의 정보를 접속자 HDD에 file로 저장하는 기술
- 문자열만 저장가능 (1MByte까지만 저장)
- 접속자의 웹 브라우저가 쿠키를 지원하지 않으면 정보를 저장할 수 없다 (접속자가 직접 제어 가능 - 중요 정보를 저장하지 않음)
- 세션 Session
# 세션 Session
- 내장객체로 제공
- 페이지 지시자에 session="true" 인 상태에서 내장객체를 사용할 수 있다.
- 세션이 필요한 이유
- 웹은 접속자가 요청하면 커넥션이 연결되고, HTML이 응답되면 연결이 끊어진다 ( 이전 페이지에서 사용한 값이 다음 페이지에서 사용될 수 없다 )
- 세션 사용
- 접속자의 웹 브라우저에 id를 부여하고 식별하여 정보를 저장하고, 웹 브라우저가 종료되면 사라진다
- apache tomcat 에서는 세션 유지 시간을 30분으로 설정하고 있다. (web.xml에 <session-timeout>을 설정한다)
- 사용법)
- 1. 세션 얻기. WAS가 실행되면 세션이 생성된 상태
- session="true" => 내장객체로 바로 사용가능
session="false" => 요청 객체로부터 세션을 얻는다HttpSession session = request.getSession();
- session="true" => 내장객체로 바로 사용가능
- 2. 세션의 생존시간 설정 (web.xml에서 할 수 있다.) - 한번 설정하면 모든 jsp에 동일 시간으로 설정된다.
- session.setMaxInactiveInterval(초)
- 3. 값 할당 - 값은 Object이기 때문에 모든 값을 할당할 수 있다.
- session.setAttribute("이름", 값);
- 4. 값 사용 - 할당된 값은 모든 jsp에서 사용자를 식별하여 사용할 수 있다.
- 데이터형 변수명 = (Casting)session.getAttribute("이름");
- 5. 세션 값 삭제
- session.removeAttribute("이름");
- 6. 브라우저에 할당된 session 무효화
- session.invalidate();
- 1. 세션 얻기. WAS가 실행되면 세션이 생성된 상태
# 쿠키 Cookie
- 접속자의 정보를 접속자 HDD의 file에 저장하는 방식
- 문자열만 저장가능
- 사용법)
- 쿠키 심기
- 1. 쿠키 생성
- Cookie cookie = new Cookie("이름", "값");
- 2. 생존시간 설정 (생존시간을 설정하지 않으면 브라우저가 실행되는 동안만 유지)
- cookie.setMaxAge(초); // 초*분*시*일*월*년
- 3. 쿠키 심기 (접속자 컴퓨터에 파일 생성)
- response.addCookie(쿠키객체);
- 1. 쿠키 생성
- 쿠키 읽기
- // 1. 쿠키들 얻기 (JSESSIONID는 기본으로 얻어진다)
Cookie[] cookies = request.getCookies();
Cookie c = null;
for(int i=0; i < cookies.length; i++) {
c = cookies[i];
// 2. 쿠키 이름얻기
String name = c.getName();
// 3. 쿠키 값얻기
String value = c.getValue();
}
- // 1. 쿠키들 얻기 (JSESSIONID는 기본으로 얻어진다)
- 쿠키 삭제
- method가 없음(비연결성)
- 1. 삭제할 쿠키와 같은 이름으로 쿠키 생성
- Cookie c = new Cookie("이름", "");
- 2. 생존시간을 0으로 설정
- c.setMaxAge(0);
- 3. 쿠키 심기
- response.addCookie(c);
- 쿠키 심기
# 표준 액션
- JSP에서 제공하는 기능을 가진 태그들 (JSP tag와 다르게 작성하면 정해진 일을 수행)
- 형식) <jsp: 태그명 속성="값"> 내용 </jsp: 태그명>
<jsp: 태그명 속성="값"/> // element 내용 없는 경우- <jsp: include> : 여러 개의 JSP를 합쳐서 보여줄 때 사용 (디자인을 합칠때)
- <jsp: forward> : forward로 페이지 이동할 때
<jsp: param> : forward로 이동할 때 parameter를 생성 전달할 때 사용 - <jsp: useBean> : bean(VO)를 생성할 때, web parameter를 받을 때
<jsp: setProperty> : setter method 호출
<jsp: getProperty> : getter method 호출 - <jsp:include>
- 여러 개의 JSP를 한번에 보여줄 때 사용
- <%@ include %>보다 처리속도는 느리지만 지시자의 충돌이 발생하지 않고, 변수, method에 공유가 되지 않는다. => 공통 디자인을 제작(ex. footer)
- 사용법) <jsp:include page="끼워넣을 JSP"/>
- <jsp:useBean>
- VO를 객체 생성할 때, Web parameter를 받을 때
- web parameter처리
- 사용자가 서버로 전달하는 값
- <jsp:useBean>을 사용하면 request.getParameter를 사용하지 않고 web parameter를 받을 수 있다
- 사용법)
- VO 생성 ( ¡ instance variable명과 HTML Form Control의 이름이 같아야한다 )
public class MemberVO {
private String name, id;
private int age;
getter&setter method 정의
} - 값을 받는 JSP에서 useBean태그 선언
¡ 패키지명은 import로 처리할 수 없고 full path로 처리한다 !
<jsp:useBean id="객체명" class="패키지명.클래스명" scope="page"/>
<jsp:useBean id="mv" class="day.MemberVO"/>
// 모든 parameter를 받기 위해
<jsp:setProperty name="객체명" property="*" /> // *=모든 setter method
<jsp:setProperty name="mv" property="*" />
- VO 생성 ( ¡ instance variable명과 HTML Form Control의 이름이 같아야한다 )
- <jsp:getProperty>
- getter method 를 호출하여 웹 브라우저에 출력하는 일
- 사용법)
- <jsp:getProperty name="객체명" property="method명" />
get을 제외한 method명을 소문자로 작성
getMyName() { } ==> myName - <jsp:setProperty name="객체명" property="method명" value="값" />
set을 제외한 method명을 소문자로 작성
setMyName(String ){ } ==> myName
- <jsp:getProperty name="객체명" property="method명" />
- useBean action tag의 scope 속성
- page: JSP가 호출될 때마다 생성되고, VO가 JSP에서만 사용된다
- request: JSP가 호출될 때마다 생성되고, VO가 forward로 이동한 페이지에서도 사용된다
- session: 웹 브라우저마다 하나의 객체가 생성되고, 생성된 객체는 모든 JSP에서 사용된다
- application: 최초 접속자에 의해 하나의 객체가 생성되고, 생성된 객체는 모든 접속자가 공유하여 사용한다
- <jsp:forward>
- fowrad 방식(데이터처리와 뷰를 구분해서 제작할 때)으로 페이지를 이동할 때 사용
- 이동한 JSP로 web parameter를 생성하여 넘길 때
<jsp:param name="이름" value="값" /> 태그를 사용한다 // 값은 web parameter로 전송되기 때문에 문자열로만 전송된다 - 문법)
- 단순 페이지
<jsp:forward page="이동할 JSP URI" /> - 웹 파라메터를 생성하여 이동
<jsp:forward page="이동할 JSP URI" >
<jsp:param name="이름" value="값" />
</jsp:forward>
- 단순 페이지
- EL(Expression Language)
- 표현언어: JSP 화면 출력을 하기위해 만들어진 언어
- page directive에 isELIgnored="false"인 상태에서 사용할 수 있다.
- 변수의 값, scope 객체의 값, web parameter값, 간단한 연산결과를 출력한다.
- 사용법) ${ 코드 }
연산자의 사용) ${ 값 연산자 값 }
사용가능한 연산자[ 단항(!, +, -), 산술(+,-,*,/), 관계(>,<,<=, >=, ==, !=), 논리(&&, ||), 삼항( ?: ) ]
EL에서는 문자가 존재하지 않는다.
Null은 출력하지 않는다. empty: 비어있는 값을 비교하여 true | false로 반환한다
web parameter 출력) ${ param.폼컨트롤명 }, ${ paramValues.폼컨트롤명[인덱스] }
param객체 사용한다. - 변수 출력
- EL에서는 변수를 직접 출력할 수 없기 때문에 Scope 객체 사용
- 사용법)
- page => pageScope.이름
request => requestScope.이름
session => sessionScope.이름
application => applicationScope.이름 - 1. Scope객체에 값 설정
pageContext.setAttribute("이름", 값);
requestContext.setAttribute("이름", 값);
sessionContext.setAttribute("이름", 값);
applicationContext.setAttribute("이름", 값); - 2. EL에서 Scope 객체에 값 사용
$ { pageScope.이름 }
$ { requestScope.이름 }
$ { sessionScope.이름 }
$ { applicationScope.이름 }
- page => pageScope.이름