반응형

 

 

 

 

선언문

  • 선언문 : <%! %>
  • 선언문은 JSP 페이지 내에서 필요한 멤버변수나 메소드가 필요할 때 선언해 사용하는 요소
  • 선언문의 문법
  • <%! 문장 %>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

id : <%=getId() %>

<%!
	String id = "u001";
	public String getId(){
		return id;
	}
%>

</body>
</html>

exam1.jsp

 

 

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.59
 * Generated at: 2020-11-11 09:16:10 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class exam1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {


	String id = "u001";
	public String getId(){
		return id;
	}

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP들은 오직 GET, POST 또는 HEAD 메소드만을 허용합니다. Jasper는 OPTIONS 메소드 또한 허용합니다.");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\n");
      out.write("<!DOCTYPE html>\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("<meta charset=\"UTF-8\">\n");
      out.write("<title>Insert title here</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("\n");
      out.write("id : ");
      out.print(getId() );
      out.write('\n');
      out.write('\n');
      out.write("\n");
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

exam1_jsp.java

 

 

 

String id = "u001";
public String getId(){
return id;
}

 

-> 이 부분이 메소드로 작성이 된 걸 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

스크립트릿

  • 스크립트릿 : <% %>
  • 가장 일반적으로 많이 쓰이는 스크립트 요소
  • 주로 프로그래밍의 로직을 기술할 때 사용
  • 스크립트릿에서 선언된 변수는 지역변수
  • 스크립트릿의 문법
  • <% 문장%>

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<% 
	for(int i=1; i<=5; i++){
%>
<h<%=i %>> 아름다운 한글나라 <h<%=i %>>
<%
	}
%>

</body>
</html>

exam2.jsp

 

 

 

 

서블릿으로 변환된 주요부분 )

for(int i = 1; i <= 5; i++){

      out.write('\n');
      out.write('<');
      out.write('H');
      out.print(i );
      out.write("> 아름다운 한글 </H");
      out.print(i );
      out.write('>');
      out.write('\n');

}

 

 

 

소스코드 )

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>


<H1> 아름다운 한글 </H1>

<H2> 아름다운 한글 </H2>

<H3> 아름다운 한글 </H3>

<H4> 아름다운 한글 </H4>

<H5> 아름다운 한글 </H5>

</body>
</html>

 

 

 

 

 

 

 

 

표현식(Expression)

  • 표현식 : <%=%>
  • JSP 페이지에서 웹 브라우저에 출력할 부분을 표현 (즉, 화면에 출력하기 위한 것)
  • 스크립트릿내에서 출력할 부분은 내장객체인 out 객체의 print() 또는 println() 메소드를 사용해서 출력
  • 표현식의 문법
  • <%=문장%>

 

 

 

 

 

주석(Comment)

  • JSP페이지에서 사용할 수 있는 주석
  • HTML주석, 자바주석, JSP주석

 

JSP 주석: 서블릿으로 안 바뀜. <%--로 시작해서 --%>

자바 주석: 자바로 바뀌는데 실행은 안됨. //주석, /*여러 줄 주석*/

HTML 주석: 자바로 바뀌고 자바로 실행도 됨. 브라우저에서 HTML을 보여줄 때 화면에 안 보여줌 <!—로 시작해서 -->

 



주석 실습코드

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%-- JSP 주석입니다. --%>
<!-- html 주석입니다. -->

<% 
	// java 주석입니다. 
	for(int i=1; i<=5; i++){
%>

<h<%=i %>> 아름다운 한글나라 <h<%=i %>>

<%
	}
%>

</body>
</html>

 

 

-> 소스코드에는 html 주석밖에 보이지 않는다.

반응형
반응형

 

 

JSP 등장 배경

  • 마이크로소프트에서 ASP(Active Server Page)라는 쉽게 웹을 개발할 수 있는 스크립트(script) 엔진을 발표함 (1998년
  • 1997년에 발표된 서블릿은 ASP에 비하여 상대적으로 개발 방식이 불편함
  • ASP에 대항하기 위하여 1999년 썬마이크로시스템즈에서 JSP를 발표
  • JSP는 실제로 서블릿 기술을 사용

 

 

 

 

 

- 1 부터 10까지 출력하는 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sum10</title>
</head>
<body>

<% 
    int total = 0;
    for(int i = 1; i <= 10; i++){
        total = total + i;
    }
%>

1부터 10까지의 합 : <%=total %>

</body>
</html>

sum10.jsp

 

 

 

<%=total %> 은 서블릿에서 out.print(total) 과 동일하다.

<% > 사이에는 자바 언어를 사용할 수 있는 것 같다.

 

 

 

 

 

 

 

 

 

 

JSP가 HTML 과 닮았다고 해서 HTML 처럼 동작하는 것이 아니라,

서블릿으로 변환되고 서블릿과 동일한 라이프 사이클로 돌아간다는 것을 이해해야 한다. 

 

톰캣이 JSP 를 서블릿으로 변환시킨다. JSP에 작성된 코드는 서블릿의 service() 안에 들어가서 작동한다.

workspace 안에 있는 파일을 확인해보면,

 

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.59
 * Generated at: 2020-11-11 07:53:59 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class sum10_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP들은 오직 GET, POST 또는 HEAD 메소드만을 허용합니다. Jasper는 OPTIONS 메소드 또한 허용합니다.");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
      out.write("<title>sum10</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("\n");
 
    int total = 0;
    for(int i = 1; i <= 10; i++){
        total = total + i;
    }

      out.write("\n");
      out.write("\n");
      out.write("1부터 10까지의 합 : ");
      out.print(total );
      out.write("\n");
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

-> _jspService 에 코드가 서블릿 형식으로 들어가있는 것을 확인할 수 있다.

무수한 out.write 가 보인다...

 

 

 

 

 

 

 

 

 

 

 

 

JSP의 실행순서

  1. 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.
  2. 브라우저가 요청한 JSP가 최초로 요청했을 경우만 JSP로 작성된 코드가 서블릿으로 코드로 변환한다. (java 파일 생성)
  3. 서블릿 코드를 컴파일해서 실행가능한 bytecode로 변환한다. (class 파일 생성)
  4. 서블릿 클래스를 로딩하고 인스턴스를 생성한다.
  5. 서블릿이 실행되어 요청을 처리하고 응답 정보를 생성한다.

 

 

 

 

- 라이프 사이클을 알아보기 위한 테스트코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello~~~~

<%
	System.out.println("jspService()");
%>

<%!
	public void jspInit(){
		System.out.println("jspInit()");
	}
%>

<%!
	public void jspDestroy(){
		System.out.println("jspDestryo()~~~!!!");
	}
%>

</body>
</html>

 

 

<%! %> 안에 작성된 메소드는 서블릿에서 service() 안에 작성되는 것이 아니라, 밖에서 작성이 된다.

따라서 서블릿 라이프사이클과 동일하게 init()와 destroy()가 작동된다.

 

반응형
반응형

 

 

 

 

1. 서블릿 Request, Response 동작 방식

 

요청과 응답

WAS는 웹 브라우저로부터 Servlet요청을 받으면,

  • 요청할 때 가지고 있는 정보를 HttpServletRequest객체를 생성하여 저장합니다.
  • 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse객체를 생성합니다.
  • 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달합니다.

 

HttpServletRequest

  • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용합니다.
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있습니다.
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있습니다.

 

HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse객체를 생성하여 서블릿에게 전달합니다.
  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송합니다.

 

 

- Request 정보를 출력해서 알아보자

package examples;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/header")
public class HeaderServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public HeaderServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		Enumeration<String> headerNames = request.getHeaderNames();   // 모든 header 이름을 문자열로 받아준다.
		while(headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();			// header 이름
			String headerValue = request.getHeader(headerName);		// header 값
			out.println(headerName + " : " + headerValue + " <br> ");
		}		
		
		out.println("</body>");
		out.println("</html>");
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

Request 정보

 

 

 

 

 

2. URL 파라미터 

 

http://localhost:8080/firstweb/param?age=23&name=naeun

위의 URL에서 ? 뒤에 있는 것을 '파라미터'라고 한다.

&를 기준으로 구분하여 인식한다.

age = 23 이고, name = naeun 이다.

 

 

 

package examples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ParameterServlet
 */
@WebServlet("/param")
public class ParameterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ParameterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
			
		response.setContentType("text/html");		// 응답을 text, html 타입으로 보낼 거에요
		PrintWriter out = response.getWriter();     // 클라이언트와의 통로 생성
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		String name = request.getParameter("name"); // 요청정보에서 이름의 값을 가져온다. 
		String age = request.getParameter("age");
		
		out.println("name : " + name + "<br>");		
		out.println("age : " +age + "<br>");
		
		out.println("</body>");
		out.println("</html>");
		
	}

}

 

 

-> URL 에 설정해주는 대로 값이 변경되어 나타난다. (동적인 페이지)

 

 

 

 

 

 

3. 이 외의 클라이언트가 요청하는 다른 정보들 출력해보기

 

반응형
반응형

 

 

버전에 따른 Servlet 작성 방법

 

1. Servlet 3.0 spec 이상에서 사용하는 방법

  • web.xml 파일을 사용하지 않습니다.
  • 자바 어노테이션(annotation)을 사용합니다.
  • 앞에서 실습했던 first web에서 사용합니다.

2. Servlet 3.0 spec미만에서 사용하는 방법

  • servlet을 등록할 때 web.xml 파일에 등록합니다.

 

 

 

 

 

1. Servlet 3.0 spec 이상에서 사용하는 방법

 

- @WebServlet("/ten") 이라는 어노테이션이 추가된다.

- URL mapping은 임의로 지정할 수 있다.

 

package exam;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/ten")
public class TenServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();  // 통로
		out.print("<h1>1-10까지 출력</h1>");
		for(int i=1; i<=10; i++) {
			out.print("<h2>"+i+"</h2>");
		}
		out.close();
		
	}
}

TenServlet.java

 

 

 

 

 

 

 

 

 

2. Servlet 3.0 spec미만에서 사용하는 방법

 

- 서블릿을 추가하면 xml에 서블릿 관련 내용이 삽입된다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>exam25</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>TenServlte</display-name>
    <servlet-name>TenServlte</servlet-name>
    <servlet-class>exam.TenServlte</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TenServlte</servlet-name>
    <url-pattern>/ten</url-pattern>
  </servlet-mapping>
</web-app>

web.xml

 

package exam;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 어노테이션 없음
public class TenServlte extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlte() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();  // 통로
		out.print("<h1>1-10까지 출력</h1>");
		for(int i=1; i<=10; i++) {
			out.print("<h2>"+i+"</h2>");
		}
		out.close();
		
	}

}

TenServlte.java

 

 

 

 

 

 

 

 

 

 

Servlet 생명 주기

 

1. 서블릿의 생명주기를 알기 위해 테스트 코드를 작성한다.

 

package examples;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
       
	
    public LifecycleServlet() {
        System.out.println("LifecycleServlet 생성!!");
        
    }


	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 호출!!");
	}


	public void destroy() {
		System.out.println("destroy 호출!!");
	}

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service 호출!!");
	}

}

 

LifecycleServlet.java

 

 

 

 

2. 결과

 

1) 처음 실행 시,

생성자

init

service

 

2) 새로고침 시,

service

 

3) 기존 코드 변경 시,

destroy

 

4) destroy 후 코드 변경 시,

생성사

init

service

 

 

 

 

 

 

 

 

 

 

 

Servlet 생명주기

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인합니다.
  •  if (메모리에 없음) {
     - 해당 서블릿 클래스를 메모리에 올림
     - init() 메소드를 실행
    }
     - service()메소드를 실행
  • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됩니다.
  • 응답해야 하는 모든 내용은 service() 에 구현해야 한다 !!

 

 

 

 

 

그렇다면, doGet() 에서는 service() 가 없었는데 어떻게 실행이 된 것일까?

doGet()은 HttpServlet 이 가지고 있는 service 메소드를 상속받아서 실행된다.

 

 

 

service(request, response) 메소드

HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현합니다.

  • 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
  • 클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출

 

 

 

😆service() 대신에 doGet()과 doPost()를 넣어 보았다 !

package examples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
      

	public LifecycleServlet() {
        System.out.println("LifecycleServlet 생성!!");
        
    }


	public void init(ServletConfig config) throws ServletException {
		System.out.println("init test 호출!!");
	}


	public void destroy() {
		System.out.println("destroy 호출!!");
	}

	// url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 doGet()이 실행된다.
    @Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
    	resp.setContentType("text/html");
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");
		out.println("<form method='post' action='/firstweb/LifecycleServlet'>");	// submit 버튼이 눌렸을 때, action 주소로 요청해주세요 
		out.println("name : <input type='text' name='name'><br>");					// , 메서드는 post이므로 post 메서드를 실행한다.
		out.println("<input type='submit' value='ok'><br>");                                                 
		out.println("</form>");
		out.println("</body>");
		out.println("</html>");
		out.close();
		
	}


	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.setContentType("text/html");
		PrintWriter out = resp.getWriter();
		String name = req.getParameter("name");			// doGet에서 설정한 name 을 받아
		out.println("<h1> hello " + name + "</h1>");    // 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식 
		out.close();
		
	}


}

 

 

 

1) url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 먼저 doGet()이 실행된다.

 

 

 

 

2) out.println("<form method='post' action='/firstweb/LifecycleServlet'>");

-> "submit 버튼이 눌렸을 때, action 주소로 요청해주고, post 메소드를 실행해주세요" 라고 말하고 있다.

 

 

3) String name = req.getParameter("name");

-> doGet에서 설정한 name 을 받아

 

4) out.println("<h1> hello " + name + "</h1>");  

-> 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식 

 

 

 

 

 

 

반응형
반응형

 

자바 웹 어플리케이션(Java Web Application)

WAS에 설치(deploy)되어 동작하는 어플리케이션입니다.

자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함됩니다.

 

 

-> WEB-INF, web.xml 파일이 자바 웹 어플리케이션의 폴더에 반드시 있어야하는 등

자바 웹 어플리케이션의 구조를 지켜야한다.

 

 

 

 

서블릿이란?

자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할입니다.

서블릿을 정의해보면 서블릿(servlet)은 WAS에 동작하는 JAVA 클래스입니다. 

서블릿은 HttpServlet 클래스를 상속받아야 합니다.

서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두 가지(JSP, 서블릿)를 조화롭게 사용해야 합니다.

예를 들어, 웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현합니다.

 

즉, URL 요청을 처리하는 프로그램이다.

 

 

 

 

URL 주소는 아래와 같이 지정이 된다.

http://localhost:8080/{프로젝트이름}/{URL Mapping값}

 

이 때, URL Mapping 값은 아래와 같이 서블릿을 만들 때 설정할 수 있다.

 

 

 

 

 

 

 

- HTTP 메서드 : GET, POST, PUT, DELETE

 

1) GET - 웹 브라우저가 서버에게 문서를 요청할 때 사용하는 방식

-> doGet();

 

 

 

반응형
반응형

 

 

컴퓨터에 운영체제를 설치해야만 컴퓨터를 사용할 수 있는 것처럼, 자바를 이용하여 작성된 웹 어플리케이션은 WAS가 있어야만 실행할 수 있다. 이때 가장 많이 사용되는 WAS가 아파치 톰캣이다.

 

 

 

1. 톰캣 홈페이지에서 버전 8 다운받기

 

http://tomcat.apache.org 

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. The Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket specifications ar

tomcat.apache.org

맥북에서는 tar.gz 파일을 받아서 압축 해제하면 된다.

 

 

 

 

 

2. apps라는 디렉토리 생성하고 거기에 톰캣 폴더를 넣어준다.

 

mkdir ~/apps
cd ~/apps
mv ~/Downloads/apache-tomcat-8.5.24 ~/apps/

터미널

 

3. 쉘확장자를 가진 파일들의 실행권한을 준다.

 

chmod +x ./bin/*.sh

 터미널

 

4. ls -al 로 권한이 부여되었는지 확인

-rwxr-xr-x@와 같이 마지막에 x 가 붙어있으면 정상적으로 권한이 부여된 것이다.

 

 

5. startup.sh 파일을 실행하여 톰캣을 켜준다.

 

./bin/startup.sh 

터미널

 

 

 

* 만약 아래와 같은 오류가 발생한다면

Cannot find bin/catalina.sh
The file is absent or does not have execute permission
This file is needed to run this program

 

아래 명령어를 실행하고 5번의 startup.sh 파일을 다시 실행시켜준다.

chmod +x bin/catalina.sh
반응형

+ Recent posts