새소식

JAVA 교육/Servlet

2019/09/30 모델2

  • -

- 지금까지 해왔던 모델 1버전을 마치고 모델 2 버전으로 로그인과 게시판을 만들어 보겠다.

[자바 개발 방식]
- .jsp 
- .java =>.java 로만 페이지를 구현 하려면, Servlet클래스를 알아야 가능합니다.
- .jsp+.java(DTO,DAO)

※ jsp 자바 코드에 덜 의존적이라 프로그래밍하기가 더 쉽지만, 보안상 문제가 크다

[01] 서블릿(Servlet)의 기본

1) 서블릿의 개요
- JSP와 서블릿은 자바 기반으로 만들어진 웹 프로그래밍 언어이다
- 서블릿이 자바 코드에 의존적이라면
  JSP는 덜 의존적이라 프로그래밍하기가 더 쉽고 편하다

2) 서블릿의 동작 원리
- Servlet클래스 작성
  GenericServlet 클래스 또는 HttpServlet클래스 상속받는다
- javax.servlet과 javax.servlet.http의 클래스와 인터페이스를 이용해 만든다
- 서블릿은 main()메소드를 갖지 않는다.
  서버가 서블릿에 요청을 전달할 때마다 서블릿의 service()메소드가 자동호출 된다

3) 서블릿의 요청과 응답의 과정에서 웹컨테이너(톰캣)가 하는일
- 객체가 있는지 유무판단, 없으면 생성
- Thread생성
- Service()호출
- Service()가 doGet()자동 호출

4) 서블릿의 요청과 응답의 과정에서 Service() 메소드가 하는일
- request가 올 때마다 doGet()호출
- doGet()은 HttpServlet에 의해 지원 받는 몇몇 Service()중 하나이다.


1. mvcTest

▶ Dynamic web project 로 프로젝트를 생성하게 되면 지금 사용하는 버전은 java runa 버전이기 때문에
servlet을 불러오지 못한다. 때문에 톰켓 폴더에서 servlet-api.jar파일을 lib 에 복사해 넣자

 

1) .jsp 구성된 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>환영합니다</title>
</head>
<body>
	<!-- JSP코트만 사용한 페이지  -->
	<strong>대한민국</strong>
	<hr>
	<span style="color:red;">오니모니하</span>
	<hr>
	<table border="1">
  <tr>
    <th>Column 1 Heading</th>
    <th>Column 2 Heading</th>
  </tr>
  <tr>
    <td>Row 1: Col 1</td>
    <td>Row 1: Col 2</td>
  </tr>
</table>

</body>
</html>

 ▶ .jsp파일에서는 HTML 코드도 사용이 가능하다

 

2) .java 로만 구성된 코드

▶ .java 로 구성된 클래스는 HttpServlet 클래스를 상속받을 것이다.

class GenericServlet{}
class HttpServlet extends GenericServlet{}

class Welcome extends HttpServlet{} -현재 내가 상속받은 클래스의 경로

 

▶ 상속받은 메소드를 override 받아 리폼하여 사용할 것이다.

@Override //<-물려받은 메소드 재정의 (리폼)
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {}
package mbcTest;

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 Welcome extends HttpServlet {

	//클래스의 부모가 class		:extends
	//클래스의 부모가 interface :implements
	
	@Override //<-물려받은 메소드 재정의 (리폼)
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
	//<form method=get>방식으로 요청하면 자동으로 doGet을 호출
		//req 내부객체 request 와 동일
		//resp 내부객체 response 와 동일
	try{
		//단순 문자열로 응답(AJAX)
		//resp.setContentType("text/plain; charset=UTF-8");
		
		//HTML 문서 구조로 응답
		resp.setContentType("text/html; charset=UTF-8");
		//요청한 사용자에세 응답하기 위한 객체
		PrintWriter out=resp.getWriter();
		out.println("");		
		out.println("<!DOCTYPE html>");
		out.println("	<html>");
		out.println("	<head>");
		out.println("	<meta charset='UTF-8'>");
		out.println("	<title>환영합니다</title>");
		out.println("	</head>");
		out.println("	<body>");
		out.println("		<strong>대한민국</strong>");
		out.println("		<hr>");
		out.println("		<span style='color:red'>오니모니하</span>");
		out.println("	<hr>");
		out.println("	<table border='1'>");
		out.println(" <tr>");
		out.println("   <th>Column 1 Heading</th>");
		out.println("   <th>Column 2 Heading</th>");
		out.println("  </tr>");
		out.println("  <tr>");
		out.println("   <td>Row 1: Col 1</td>");
		out.println("  <td>Row 1: Col 2</td>");
		out.println("  </tr>");
		out.println("	</table>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}catch(Exception e){System.out.println("요청실패"+e);}
	}//doGet() end
   
    @Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			//<form method=post> 방식으로 요청했을때 호출
		
	}//doPost() end
}//class end

3) web.xml 의 커스텀 

<!-- 서블릿 등록 -->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>net.control.Welcome</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/wel.do</url-pattern>
  </servlet-mapping>

▶ web.xml 에서 커스텀 태그를 만든후

결과확인
http://localhost:8090/mvcTest/wel.do

주소로 들어가보면 위에서 설정해준 servlet-class 로 들어가게 된다

 

4) LifeCycle

▶ 이번에 사용하는 override 는 HttpServlet 에 doGet, doPost,Service GenericServlet 에 destroy,init

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// method = get 방식 요청이 들어오면
		//부모클레스를 부른다
		super.doGet(req, resp);
		System.out.println("doGet() 호출.....");
	}// doGet end

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// method = post 방식 요청이 들어오면
		super.doPost(req, resp);
		System.out.println("doPost() 호출.....");
	}// doPost end

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		// method=get 방식으로 요청되면 doGet()호출
		// method=post 방식으로 요청되면 doPost()호출
		// 구분해서 호출하는 역할
		super.service(arg0, arg1);
		System.out.println("doService() 호출.....");
	}// service end

	@Override
	public void destroy() {
		// 서버가 중지되면 1번만 자동 실행
		super.destroy();
		System.out.println("destroy()호출....");
	}// destroy end

	@Override
	public void init() throws ServletException {
		// 서블릿이 최초로 호출될때 1번만 자동 실행
		//초기환경 구축할때 사용
		super.init();
		System.out.println("init()호출....");
	}// init end
	<servlet>
		<servlet-name>Jav</servlet-name>
		<servlet-class>net.control.LifeCycle</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>Jav</servlet-name>
		<url-pattern>/life.do</url-pattern>
	</servlet-mapping>

1) 서버 호출시 init()호출

2)  method=get 방싱의 요청이 들어오면 doGet()호출

3) method=get 방식으로 요청되면 doGet()호출
 method=post 방식으로 요청되면 doPost()호출
 구분해서 호출하는 역할

4) 서버가 중지되면 1번만 자동 실행

'JAVA 교육 > Servlet' 카테고리의 다른 글

2019/10/02 Servlet을 이용한 index.do  (0) 2019.10.02
2019/10/01 error 페이지  (0) 2019.10.01
2019/09/30 loginForm.jsp (mvc) test  (0) 2019.09.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.