서블릿/JSP
*웹 어플리케이션이란: 웹을 기반으로 실행되는 프로그램을 말한다.
*웹어플리케이션의 간단한 동작 원리
1)클라이언트와 서버의 요청과 응답관계속에서 이루어진다.
2)서버가 제공해주는 서비스를 클라이언트가 응답 받으면 웹브라우저에 결과화면으로 출력된다.
*용어 정리
웹브라우저 - 사용자(클라이언트 측)가 요청한 웹 서버의 결과를 화면에 출력해 볼 수 있도록 하는 어플리케이션이다.
웹서버 - 웹 브라우저의 요청을 받아 들여서 이에 알맞은 결과를 웹 브라우저에 응답해 주는 역할을 한다. 요청에 필요한 페이지의 로직이나 데이터베이스와의 연동을 위해서 어플리케이션 서버에 이들의 처리를 요청한다.
대표적인 웹 서버의 종류로는 아파치(Apache)와 IIS(Internet Information Server)를 들 수 있다.
웹어플리케이션 서버 - 요청한 페이지의 로직이나 데이터베이스와의 연동을 처리하는 부분이다.
데이터베이스 - 데이터를 정보를 저장하는 곳 예를 들어 회원의 정보나 게시판에 올린 글에 대한 정보 등을 저장한다.
*웹어플리케이션의 자세한 동작 원리
이전까지는 Tomcat이 웹서버역할만 했지만, 이제부터는 웹어플리케이션서버 역할까지 한다.
*웹서버와 웹어플리케이션의 동작 부가설명
웹서버는 HTML 문서 파일을 찾아서 보내주는것이 아니라 HTML문서를 생성하는 프로그램을 호출해서 프로그램의 실행결과를 보내주는일을 한다.
호출되는 프로그램을 웹 어플리케이션이라고 한다.
*동적HTML과 정적 HTML
웹어플리케이션이 생성하는 HTML문서를 동적 HTML이라고 하고, 웹서버쪽에 파일형태로 저장되어 있는 HTML문서를 정적 HTML문서라고 한다.
JSP와 서블릿
서블릿이란 자바를 기반으로 하는 웹 애플리케이션 프로그래밍 기술이다
서블릿은 JAVA코드 기반에 HTML코드가 들어가있는 구조이다. 그래서 웹페이지를 만들기가 힘들다. <코드가 무지막지 길어짐>
그래서 만들어진것이 JSP다.
JSP는 HTML코드안에 JAVA코드가 들어가있는 구조이다. 그래서 좀 더 웹을 출력하기에 용이하고, 비즈니스 로직 처리결과를 화면에 출력하기 유용하다.
JSP/서블릿
JSP를 실행하기 위해서는 서블릿코드로 변환해야 하며, 서블릿코드는 컴파일 되어야한다.
또한 컴파일된 결과값을 화면에 출력해야 한다. 이 역할은 WAS가 담당한다.
서블릿<JAVA> : 비즈니스로직을 처리할때 좋다. 요청된 결과값을 처리할때 사용한다.
JSP<HTML> : 비즈니스로직이 처리된 결과를 받아서 화면에 출력하는 용도로 사용된다.
서블릿
서블릿 클래스 작성시 javax.dervlet.http.HttpServlet 클래스를 상속받도록 만들어야 하며, public으로 만들어야 한다.
서블릿 클래스 안에 메서드 타입에 따라 doGet 또는 doPost 메서드를 선언하며,
서블릿<.java>파일은 클래스 파일로 컴파일 되어야 한다.
컴파일된 결과물<.class>는 프로젝트명/WEB-INF/classes 하위에 위치해야 한다.
웹컨테이너는 서블릿 클래스를 가지고 서블릿 객체를 만든다음
객체를 초기화해서 웹서비스를 할 수 있는 상태로 만드는 이 작업을 거친 서블릿 객체만 서블릿이라고 할 수 있다.
WAS 의 역할 비즈니스 로직 처리 : 비즈니스 로직을 처리한다. JSP파일을 서블릿코드로 변환하고 서블릿코드를 class파일로 컴파일한다.
JSP와 SERVLET는 밀접한 관계이다.
JSP로 실행을 해도 서블릿으로 변환되어져서 실행된다.
개발 측면:
SERVLET JSP 관계 : JSP파일은 HTML에 JAVA 코드를 입력할 수 있다는것이 특징이다. 주로 화면에 뿌려주기 위한 역할이다.
SERVLET은 주로 서버의 비즈니스로직을 처리하기 위한 역할이다.
JSP는 사용자에게 입력을 받아서 SERVLET에게 던지고, 서블릿은 그것을 처리해서 다시 JSP로 전달한다.
*war 디렉터리 경로 구조
*URL 맵핑
예전엔 web.xml에서 서블릿을 등록해서 맵핑했었어.
하지만 @WebServlet()으로 등록해서 맵핑하면 됩니다.
*JSP 예제
*500error 발생 이유
서버에러에 해당한다. 서블릿코드가 클래스파일로 컴파일되어질때 에러나면 500에러가 납니다.
디버깅을 위해서 콘솔창을 보는게 심신안정에 좋습니다.
*파라미터로 데이터를 던지는 예제
// form.jsp
//form에 사용자가 데이터를 입력하면 FormServlet이라는 서블릿 파일로 파라미터와 함께 post 형식의 request를 전송합니다.
이때 <form> 태그 속성 action에 servlet파일 경로를 적어줘야 하는데
같은 경로에 있을경우
/서블릿파일이름만 적어주면 되지만
다른 경로에 있기 때문에 절대경로로 적어줘야 한다.
/프로젝트이름/서블릿파일이름
하지만 한글로 매개변수가 넘어오게 되면 반!드!시!
깨진다.
그렇기 때문에
request객체의
setCharacterEncoding()메서드를 사용하여 utf-8로 인코딩 해준다.
그리고 jsp가 전달한 전달인자를 가져오기 위하여 request객체의 getParameter()메서드를 사용한다. getParameter메서드 호출시 전달인자는 우리가 받아올 매개변수의 이름이다.
JSP에 출력하기 위해 result라는 이름으로 데이터를 저장했다.
result.jsp로 이동하기 위해 /jsp/폴더 밑에 result.jsp파일로 forward한다.
//result.jsp
*Dispatcher와 Redirect
Dispatcher와 sendRedirect의 차이 :
Dispatcher로 forward시 요청의 연장이라고 보면 된다.
따라서 두개의 페이지가 하나의 request를 공유한다.
하지만 sendRedirect는 새로운 요청을 만든다고 보면 된다.
그래서 두개의 페이지가 서로 다른 request를 갖는다.
*JSP
JSP 기술에서 웹 애플리케이션을 구연할 때 작성하는 코드를 JSP페이지라고 한다.
JSP페이지는 HTML문서의 사이에 JSP문법의 코드가 삽입되는 형태로 작성된다.
JSP페이지에 있는 HTML코드는 웹브라우저로 그대로 전송되지만, JSP문법의 코드는 웹 컨테이너 쪽에서 실행되고 결과만 웹브라우저로 전송된다.
*JSP페이지가 실행되기까지의 과정
웹컨테이너(WAS)는 JSP페이지 전체를 서블릿 클래스의 소스코드로 변환하고
소스코드를 컴파일 후 결과를 가지고 서블릿 객체를 만든다.
서블릿 객체를 초기화해서 서블릿을 만든다.
*JSP기초 문법
1)지시자
2)스크립트릿
3)표현식
*JAVA코드를 최소화 하려는 노력을 한다.
예를들어 JSP에서 for문으로 테이블을 하나 만든다고 했을때..
HTML 코드와 섞어서 만들기에 굉장히 복잡해진다..
JSTL태그를 이용해서 자바의 for문처럼 사용 할 수 있다.=>JSP에서 자바코드를 최소화 할 수 있다!
//JSP에서 스크립트릿과 HTML태그를 이용해서 테이블을 작성하는 예제.
//딱 봐도 읽기싫은 코드다.
//이 코드는 JSTL태그를 이용해서 간단하게 줄일 수 있다.
*JSP 기초 문법
*스크립트릿<% %>과 선언부<%! %>의 차이점
서블릿으로 변환했을때 차이점이 생긴다.
스크립트릿: doget doPost = 지역변수로써 메서드 안에 선언된다.
선언부: 클래스안의 멤버변수, 멤버메서드로 선언됩니다..
JSP안에 자바코드가 많이 들어가는것이 적절하지 않음
JAVA로 클래스 안에 메서드 만드는게 낫다.
*지시자 <%@ %>
웹브라우저로부터 요청을 처리하기 위해서가 아닌 웹 컨테이너가 JSP 페이지를 서블릿 클래스로 변환할때
필요한 정보들을 기술하기 위해 사용하는 문법이다.
*지시자 종류
Page 지시자<%@ page %>
include 지시자<%@ include %>:정적으로 다른 페이지를 현재 페이지에 추가할 때 사용
(해당 페이지의 코드가 현재 페이지에 그대로 들어간다고 보면 됨. 그리고 컴파일)
<※include 액션태그<jsp:include>와 비교했을때 액션태그는 해당페이지를 실행하고 난 결과를 포함하는것이다.>
Taglib 지시자<%@ Taglib %>:jstl을 사용하기 위해 지정. <커스텀태그 사용>
*Taglib 지시자 자세히
<jsp:로 시작하는 태그는 jsp에서 기본적으로 내장되어있는 액션태그다.
그래서 라이브러리가 필요없다. [예: <jsp:include>]
그외의 태그는 커스텀태그인데, 개인이나 단체들이 만든것이다.
액션태그로 복잡한 일들을 모듈화 할 수 있다.
*page 지시자 주요 Attribute
ContentType: JSP페이지가 생성하는 문서의 종류와 그 문서를 웹 브라우저로 전송할때 사용되는 인코딩 타입
import: 스크립트 요소 안에서 사용할 자바 클래스와 인터페이스를 임포트 하기 위해 사용
errorPage: 에러를 처리할 JSP페이지의 URL. 404에러뜰때 그대로 보여주지않고 지정한 특정 페이지를 예쁘게 보여 줄 수 있다.
isErrorPage: 저는 에러페이지 입니다.
pageEncoding: JSP페이지의 인코딩 타입
*주석의 종류
<!--HTML의 주석-->
/*스트립트릿 요소 여러줄*/
//스크립트릿 요소 한줄
<%-- JSP 고유의 주석 --%>
*JSP 페이지의 내장객체.
JSP페이지의 내장객체는 선언하지 않고도 사용 할 수 있는 객체이다.
JSP페이지에서 내장객체를 사용할 수 있는 이유는 WAS가 JSP페이지를 서블릿 클래스로 변환할때 자동으로 선언해주기 때문이다.
서블릿에서 doPost doGet 메서드에서는 request response 가 전달인자로 넘어온다.
JSP에서도
request response객체 와 동일한 기능을 하는것이 필요하댱!
=JSP에서 9가지의 내장객체를 미리 선언해놨기 때문에 이름만 알면 사용 할 수 있다.
*JSP페이지의 주요 내장객체
Request: doGet, doPost메서드의 request 파라미터와 동일한 역할
Application: JSP페이지가 속하는 웹 애플리케이션에 관련된 기능
Session: 세션에 관련된 기능
Page: JSP페이지로부터 생성된 서블릿
위의 4개 내장객체는 전부 다 setAttribute()와 getAttribute()메서드를 가지고 있다.
<※주의 request.getAttribute()쓸때 Object를 return하기때문에 반드시 캐스팅이 필요하다!>
또한 데이터를 저장하는데 데이터의 유효범위가 각각 다르다.
Page = 이 페이지 안에서만 유효
request = 요청하는 페이지 까지
Sesson = 세션이 유지되는 기간동안
Application 톰캣서버가 유지하고 있는동안.
//서블릿 쓰지 않고 JSP에서만 처리해보는 예제.
html에서 num1 num2를 입력받아서 같은경로의 result.jsp로 넘겨준다.
result.jsp는 JSP파일로 내장객체인 request의 getParameter메서드를 이용해서 파라미터를 받아 올 수 있다.
*액션태그 예제
JSP코드가 아니기 때문에 HTML영역에서 쓴다.
//forward 액션태그 예제. 간단하게 페이지를 forward 할 수 있다. Dispacher랑 동일하게 기능.
*out 내장객체
JSP페이지에서 출력하는 데이터는 out.print(), out.println() 메서드를 호출할 경우 뿐만 아니라 HTML코드를 통해 출력할 경우에도 모두 out 내장객체를 통해 출력된다.
Page지시자의 buffer 애트리뷰트를 이용해서 버퍼의 크기를 바꿀 수 있다.
buffer의 실제 크기를 알 고 싶을때 out 내장변수에 대해 getBufferSize라는 메서드를 호출 하면 된다.
*Application 내장객체
Application 내장 변수는 웹 애플리케이션에 관련된 여러 가지 기능을 제공한다.
Application 내장 변수에 대해 호출할 수 있는 getContextPath 메서드는 웹 애플르케이션의 URL 경로명을 return 하는 메서드이다.
getRealPath라는 메서드는 웹애플리케이션 내에서의 파일 경로명을 파일시스템 전체에서의 절대 경로명으로 바꾸는 메서드이다.
// 해당 JSP파일경로 하위에 있는 message 폴더내의 notice.txt의 전체경로<파일시스템 전체>를 불러오는 예제.
//application 객체의 getRealPath 메서드를 사용한다.
//위의 예제 실행 결과
*JSP 에서 서버에 존재하는 파일을 한줄씩 읽어서 화면에 출력하는 예제
*include 액션태그를 사용하여 페이지를 모듈화 해보자
중복되는 코드를 줄일 수 있다. 유지보수 또한 편하다.
//레이아웃을 고려하지 않은, 모든 페이지에 header와 footer를 include하는 예제.
//모든 페이지를 단순히 include하여 사용했다.
//이런방식의 단점은 레이아웃이 바뀌면 전부 다시 수정해야 한다..
*템플릿을 고려한 페이지 모듈화
위의 코드가 template.jsp이고 밑의 코드가 main.jsp이다.
최초 실행은 template.jsp에서 한다.
template.jsp코드의 특징은, header와 menu footer는 정적으로 들어가있고<프레임>
동적으로 들어갈 페이지<페이지마다 바뀌어야 할>는 변수로 처리해준다는 것이다.
처음 실행시 body파라미터가 존재하는지 확인한다. null이면 상위경로의 main.jsp를 body에 담는다.
처음 실행시 main.jsp를 출력하기 위함이다.
후에, list에서 <a>엘리먼트를 클릭하면 href에서 URL뒤로 파라미터를 넘겨준다.<URL?body=../main.jsp>
그렇다면 자연스럽게 getParameter로 페이지경로를 받게되고
더 자연스럽게 고정레이아웃을 제외한 동적으로 표시되어야 할 부분에 사용자가 클릭한 페이지가 표시되는것이다.
댓글