*웹 어플리케이션이란?
: 독립적으로 수행되는 것이 아니라 반드시 웹 브러우저 상에서 수행되는 애플리케이션.
↔ 독립 애플리케이션 : 데스크톱 상에서 독립적으로 실행되어 수행되는 프로그램.
ex) 한글, MS 워드 , MS 엑셀, AcroEdit 등
# 웹 어플리케이션이 Tomcat에서 구현될 때의 규칙
: 임의의 웹 어플리케이션은 wedapps 폴더 하위에 하나의 폴더로 구성
→ wedapps 폴더 하위에 새폴더를 추가하면 아파치는 주소를 생성한다. 즉, 두 개의 폴더를 생성하면 두 개의 ServletContext 이 생긴다.
#개념
: 웹 어플리케이션은 오직 하나의 ServletContext 와 매핑된다.
: 서로 다른 두 개의 웹 어플리케이션은 독립적인 ServletContext 객체와 매핑되어 각자 독립적인 공간에 자신만의 정보를 관리한다.
: ServletContext는 하나의 웹 어플리케이션 내에 여러 JSP페이지와 Servlet들이 공동으로 활용할 수 있는 저장소로 활용된다.
#웹 어플리케이션 폴더와 URL간의 매핑
: URL에 웹 어플리케이션 지정 없이 http://localhost:8080 으로 요청하여 자신의 서버로 들어간다. 그리고 webapps 폴더 밑의 ROOT 폴더로 접근하여 URL로 지정한 파일에 접근하여 실행한다.
→ index.html, index.jsp : 파일명까지 정확하게 입력하지 않아도 폴더명만으로도 찾아지는 디폴트 파일
<실습>
: 현재 수행 JSP의 Context와 실제 경로 확인하기.
1. 이전 시간에 만든 jspbook 폴더에 path.jsp 파일을 만든다.
→ 이전 시간에 한 것과는 다르게 인코딩 범위를 건드리지 말고, 파일 범위만 모든 파일로 해서 .jsp까지 잊지 말고 적어 jsp파일을 생성한다.
2. 내부에 다음과 같은 코드를 작성한다.
[코드]
<%@ page contentType=”text/html;charset=utf-8″ %> <html>
<head><title>context의 경로</title></head> <body>
현재 수행 JSP의 context (웹 어플리케이션) 경로: <%= request.getContextPath() %> <br/> 현재 수행 JSP의 context 실제 경로: <%= application.getRealPath(“/”) %>
</body>
</html>
#코드 분석
<주요 코드>
- request.getContextPath()
- application.getRealPath(“/”)
: 웹 어플리케이션의 하드디스크상 실제 경로를 리턴
<기타 코드>
- charset : 한글 있을 때만 사용하면 됨
- utf-8: 다국적어 인식. 자바 – 유니코드 :: 한글이 깨지면 euc-kr로 바꿔주면 됨.
- <%= : 표현식.
- <br> : 줄바꿈 태그
- <body> : 실제 메인에 들어가는 태그
- get이 붙으면 모두 접근자 : 값을 가져오려고 접근한다.
- set이 붙으면 모두 설정자 : 값을 설정, 할당함. 접근자와 반대 개념.
3. startup 파일을 실행시켜 서버를 구동하고, http://localhost:8080/jspbook/ch02/path.jsp 를 주소창에쳐서 실행시킨다.
여기서 ch02는 이전에 만들어놓은 jspbook 내부에 만든 폴더의 이름이다.
*JSP
:: 프레젠테이션 로직 + 약간의 비즈니스 로직이 바로 JSP. JSP만 만들면 jsp, html, servlet 세 개가 만들어진다.
# Servlet?
: sun이 웹개발 표준으로 개발한 것. 비즈니스 로직을 컨트롤러 역할이라 함.
:: 자바코드 작성 → 컴파일 → 클래스 파일 생성. 자바코드는 헤드 태그 뒤에 넣어주어야 한다.
- Model2 : 서블릿 + jsp + 자바빈즈
→ C:\apache-tomcat7.0.52\work\Catalina\localhost\jspbook\org\apache\jsp\ch02 에 있는path_jsp.jave
- 구성 요소 : 주석, 패키지, 인포트 문장. 서블릿 파일에서 실제로 우리가 JSP파일에 작성한 내용은 모두 out.write() 혹은 out.println() 안에 작성되어 있다.
#폴더의 기능
- conf : 환경
- winapps의 ROOT 파일 : 실행이 잘 안 될 경우에는 이 파일에 넣으면 된다. 무조건 실행된다.
#JSP는 대소문자가 구분되므로 추가한 파일을 실행시킬 때, 대소문자 구분을 분명하게 해주어야 실행이 된다.
#지난 시간에 만든 jspbook 폴더를 인식하게 하려면?
→ web container 가 인식하는 경로는 webapps이므로 jspbook을 인식시키려면 셧다운 후 다시 스타트업을 해야한다.
프로그램을 실행시킬 때는 쓰는 port 번호 8080은 나중에 수정하는 것이 가능하다.
#ROOT 폴더의 단점?
→ 아무나 다 볼 수 있다. 따라서 ROOT가 아니라 webapps 내에 다른 폴더를 만들어서 거기에 넣는 게 좋다.
실행을 시킬 때에는 webapps 자체가 ROOT로 인식되기 때문에 뒤에 오는 경로만 적어주면 된다.
# WEB-INF 폴더?
: 환경 설정, 관련 Serlvet 및 Utility 클래스와 JavaBeans와 라이브러리들을 위치시키는 폴더
- 이것은 우리가 만든 jspbook 폴더 내부에 만들면 된다. 그리고 이 폴더 내부에 classes 폴더와 lib 폴더를 추가시킨다.
- 이 파일 내부에는 web.xml이라는 파일과 위에서 추가한 두 개의 폴더, 그리고 tld, images라는 파일을 넣을 수 있는데, xml 파일은 웹 어플리케이션 배치 정의자 역할을 한다. 즉, 이 파일 내부에 적힌대로 클래스 파일 이름과 java파일 이름을 정의해야 제대로 실행이 된다. classes 폴더는 Servlet 및 JavaBeans 클래스를 포함한 여러 클래스들이 위치하는 폴더로 자바파일을 만들어서 컴파일 한 것을 넣어두면 된다. images폴더는 이름대로 그림 파일을 저장하는 곳이다. lib 폴더는 라이브러리 역할을 하는 jar 파일이 위치하는 폴더이다. JDBC 드라이버나 태 그 라이브러리를 구성하는 jar 파일이 여기 위치하는 폴더이고, tld 폴더는 태그 라이브러리 관련 설정 파일들이 위치한다. (태그 라이브러리는 나중에 공부한다.)
# JSP의 처리 과정 및 Servlet과의 관계
: JSP 파일은 실행이 될 때 일단 Servlet인 Java 소스파일로 변환되고 다시 클래스 파일로 컴파일이 된다. 이 클래스 파일이 JSP/Servlet 컨테이너인 Tomcat 내에서 실행되어 그 결과가 최종적으로 웹 브라우저로 전달되는 것이다. 이것을 그림으로 나타내면 다음과 같다.
[그림 2.1] JSP의 처리 과정 및 Servlet과의 관계
위 그림에서 웹 브라우저에서 요청을 할 때, JSP 파일이 서블릿 파일 (자바파일) 로 변환된다. 컴파일 후 클래스 파일이 생성되고, 그 후에 출력된다. 이 과정을 응답이라고 한다.
#Tomcat?
: 개발자에게 코딩하기 복잡한 Servlet 대신에 스크립트 언어인 JSP로 작성하게 하고 JSP/Servlet 컨테이너인 Tomcat이 내부에 서 JSP 파일을 Servlet으로 변환 및 컴파일하여 클래스 파일을 메모리에 적재한 후 실행하여 응답한다.
#Servlet 파일의 구조
-꼭 작성해주어야 하는 것들
1. 세 개의 임포트문
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
:: 모든 서블릿을 불러오는 문장들이다.
2. 필요 메소드 3개
2-1.
public void _jspInit(){
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
:: 초기화 관련 내용이 들어가있음.
2-2.
public void _jspDestroy() {
}
::메모리에서 소멸되야 할 내용이 들어감. 현재 단계에서 우리가 만드는 자바파일에는 위와 같이 내용이 없음.
2-3.
public void _jspService(final javax.servlet.http.HttpServletRequest request, finaljavax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
:: 해야할 일을 여기에 넣어두면 됨.해야할 일은 do로 표현됨.
# JSP 파일 재요청시의 동작 과정
: 변환 및 컴파일 과정은 해당 JSP를 웹 브라우저에서 맨 처음 요청했을 때에만 이루어진다. 한 번이라도 요청했던 JSP 파일을 다시 임의의 사용자가 재효청하면 이미 메모리에 적재된 클래스를 재실행한다. JSP로 작성된 웹 페이지의 대부분의 응답흔 하드디스크에 대한 접근 없이 바로 메모리에서 응답을 주기 때문에 대체로 평균 응답 시간이 매우 짧다. 이 과정을 그림으로 나타내면 다음과 같다.
[그림 2.2] 재요청 과정 그림
위의 그림을 분석해보자.
1 : 코드 작성이 완료되었다.
1→2 : 웹 브라우저에서 요청하는 순간 JSP파일이 java파일로 변환되고, 이것을 컴파일하여 클래스 파일을 생성해준다.
2→3 : JSP파일을 수정했음을 시간의 변화로 알 수 있다.
3→4 : 브라우저에서 재접근을 하자 JSP 파일이 최종적으로 저장된 시각과 클래스 파일의 죄종 저장 시각을 확인하여 어떤 것이 더 최근의 자료인지를 확인하는 것을 알 수 있다.
4→5 : java파일과 클래스 파일을 변환 및 컴파일 과정을 거쳐 다시 수정해주고 최신의 정보를 이용해 그 결과를 웹 브라우저에게 보내준다.
여기서 종합적인 JSP 파일의 처리 과정을 그림으로 살펴보자.
[그림 2.3] 종합적인 과정
여기서 마름모는 그 여부를 판단하는 과정임을 알 수 있다.
서블릿은 내부적으로 언어를 자바를 사용하는데, 그 이유는 자바가 데이터베이스를 관리하는 것이 쉬운 언어이기 때문이다.
#서블릿의 문제점
: 범위가 넓어 배우기가 어려운 자바 언어를 알아야만 한다.
서블릿의 생성 배경과 문제점을 그림으로 보자.
[그림 2.4] 서블릿의 역사
- JSP는 서블릿을 기반으로 한 기술로, jsp가 서블릿을 대체하는 기술이 아니라 상호보완적인 기술이라는 것을 알아야 한다.
위 그림에서 MVC는 Model-View-controller로, 컴퓨터 소프트웨어 개발의 구조적 패턴이다. 여기서 C는 비즈니스 로직을 나타낸다.
#서블릿의 장점
·Java를 기반으로 하므로 Java API를 모두 사용할 수 있다.
·쓰레드를 기반으로 하므로 웹 어플리케이션 서버 자원을 효율적으로 활용할 수 있다.
·웹 어플리케이션에서 효율적인 자료 공유 방법을 제공한다. ·비즈니스 로직과 프리젠테이션 로직을 분리할 수 있다.
·컨트롤러와 뷰의 역할 분담으로 인해 웹 디자이너와 개발자 간의 효율적인 업무 분담이 가능하다.
·유지보수가 수월하다. ·기능 확장이 용이하다.
·Servlet 컨텍스트 리스너 및 필터 Servlet 등 고급 프로그래밍 기법을 통해 보다 효과적인 웹 어플리케이션 설계가 가능해진다.
여기서 서블릿의 동작 과정과 생명주기를 그림으로 한 번 보자.
[그림 2.5] 서블릿의 생명 주기 및 동작과정
위 그림에서 init 함수로 인해 각종 초기화 작업이 수행되고, service 함수로 인해 모든 사용자의 요청이 GET 또는 POST 방식으로 처리된다. 이 서비스 함수가 서블릿에서 가장 중요한 부분이다.
-요청 방식
·GET방식 : 단순히 가져오기만 함. 주소창에 내가 검색한 키워드가 뜨는 것.
·POST방식: 정보 값이 보여지지 않음.
위의 방식에 따라서 doGet() 혹은 doPost()함수가 호출된다. 서블릿 개발자는 이 두 메소드에 대부분의 필요한 기능을 구현한다.
하지만 doGet()메소드에서 다시 doPost()를 호출하고 doPost() 내부에만 관련 처리 과정을 코딩하는 편이 편하다.
<서블릿 프로그램 실습>
#과정
1. 톰켓 아파치 폴더로 들어감
2. lib로 들어감.
3. 서블릿-api 압축 파일을 복사
4. C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext에 붙여넣기
→ 위의 jdk1.7.0_51는 각자가 깔아놓은 jdk버전에 따라 달라진다.
5. 다시 톰캣폴더로 돌아온다. = 아파치폴더.
6. C:\apache-tomcat-7.0.52\webapps\jspbook에 WEB-INF 폴더를 만들어줌.
7. 내부에 classes 폴더과 jave_sources 폴더을 만들어줌.
→ 우리가 만드는 자바 소스 파일은 jave_sources 에 넣어주고, 이를 컴파일해서 생성되는 클래스 파일은 classes 에 넣어줄 것이다.
8. web.xml 파일을 WEB-INF에 넣음.
→ web.xml 파일은 파일명은 그대로하고, 내부 소스는 맨 아래에 있으니 그것을 그대로 복사한 후 붙여넣기하여 생성하면 됨.
9. HelloWorldServlet.java 파일을 WEB-INF 파일에 넣음 (10 단계의 큰 의미)
10. HelloWorldServlet.java 파일을 만들어서 자바소스s 파일에 넣음.
[코드]
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class HelloWorldServlet extends HttpServlet {
public void init() { // Servlet 객체 최초 생성시 한번만 호출
System.out.println(“Init!!!”); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletExce ption { // Servlet 요청시 매번 호출
System.out.println(“doGet!!!”);
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(“<html><body bgcolor=\”yellow\”>Hello Servlet!</body></html>”);
public void destroy() { // Servlet이 메모리에서 삭제될 때 한번만 호출System.out.println(“destroy!!!”);
11. HelloWorldServlet.java의 위치 주소를 복사한다.
12. cmd 창에 cd(change directory) 를 치고 붙여넣기 한다.
→ HelloWorldServlet.java 파일이 존재하는 곳으로 이동.
13. dir을 쳐서 해당 위치에 존재하는 디렉토리들을 본다.
14. cmd 창에서 javac 명령어를 사용하여 우리가 만든 자바 파일을 컴파일한다. 컴파일이 정상적으로 처리되었다면 아무런 안내도 뜨지 않고 다음 입력을 받을 준비를 한다.
→ javac HelloWorldServlet.java 라고 치면 됨. 생성되는 클래스 파일을 4단계의 부가 설명과 같이 classes 폴더 내부에 넣어준다.
15. web.xml 파일의 내부에 있는 class 명으로 실행을 시킨다.
→ 예시 : http://localhost:8080/jspbook/helloServlet
16. 웹 브라우저에서 확인함.
17. F5 키를 누를 때마다 서버창에 실행이 될 때 서버에 출력하라고 소스에 작성했던 내용들이 계속해서 뜸.
→ 초기화 메소드에서 출력하라고 했던 init! 이라는 문장이 맨 처음 한 번, doGet메소드를 호출할 떄마다 출력하라고 했던 doget!!!이라는 문장이 새로고침을 할 때마다 계속해서 출력된다.
#xml : 태그를 직접 만들어주어야 한다.
→ 주소와 클래스 이름, 서블릿 이름은 여기에 있어! 하고 알려줘야 함.
#이름이 일치해야 하는 것들은 완전히 일치해야 한다. 서블릿 프로그램이 제대로 만들어졌음에도 실행이 되지 않는 가장 크고 많은 이유들이다.
——————————————————————————————
web.xml 파일 내부 소스
:
<?xml version=“1.0″ encoding=“utf-8″?>
<web-app xmlns=“http://java.sun.com/xml/ns/javaee“
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“
xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd“
version=“2.5″>
<description>
JSPBOOK Examples.
</description>
<display-name>JSPBOOK Examples</display-name>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
<!–<jsp-config>
<jsp-property-group>
<url-pattern>/ch06/*</url-pattern>
<include-prelude>/common/variable.jspf</include-prelude>
<include-coda>/common/footer.jspf</include-coda>
</jsp-property-group>
</jsp-config>–>
<servlet>
<servlet-name>readInitParamJSP</servlet-name>
<jsp-file>/ch08/readInitParam.jsp</jsp-file>
<init-param>
<param-name>e-mail</param-name>
<param-value>hong@mail.com</param-value>
</init-param>
<init-param>
<param-name>emailHost</param-name>
<param-value>151.68.167.201</param-value>
</init-param>
<init-param>
<param-name>webMaster</param-name>
<param-value>홍길동</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>readInitParamJSP</servlet-name>
<url-pattern>/ch08/readInitParam.jsp</url-pattern>
</servlet-mapping>
<context-param>
<param-name>appName</param-name>
<param-value>jspbook</param-value>
</context-param>
<context-param>
<param-name>appVersion</param-name>
<param-value>1.0</param-value>
</context-param>
<context-param>
<param-name>MasterID</param-name>
<param-value>jspbook</param-value>
</context-param>
<context-param>
<param-name>MasterPassword</param-name>
<param-value>112233</param-value>
</context-param>
<!–
<error-page>
<error-code>404</error-code>
<location>/ch10/error/404errorHandler.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/ch10/error/500errorHandler.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ch10/error/nullPointerErrorHandler.jsp</location>
</error-page>
–>
<resource-ref>
<description>MYSQL POOL</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>
</web-app>
출처 : http://peagcom.wordpress.com/