코딩 화이팅 2023. 3. 7. 16:08

URL  : 웹 상의 자원을 참조하기 위한 웹 주소

웹 페이지 : 웹 브라우저를 통해서 보여지는 화면

웹 서버 : 클라이언트 요청에 맞는 응답(웹 페이지)를 제공

웹 어플리케이션 : 웹 서버를 기반으로 실행되는 응용 소프트웨어

웹 어플리케이션 서버 : 요청이 오면 알맞은 프로그램을 실행하여 응답 만들고 제공하는 서버

Servlet

  • Server+Applet의 합성어
  • 자바를 이용하여 웹에서 실행되는 프로그램을 작성하는 기술
  • 자바를 이용하여 웹페이지를 동적으로 생성할 수 있음
  • Servlet은 자바 코드 안에 HTML을 포함

Interface Servlet

package com.ssafy.myServlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//해당 클래스를 servlet으로 만들기 위해서
//Servlet(인터페이스) 이라는 것을 구현해야됨.
public class myServlet1 implements Servlet{

	@Override
	public void destroy() {
		//servlet이 파괴될 때
	}

	@Override
	public ServletConfig getServletConfig() {
		//무엇인가 servlet 설정을 건드림
		return null;
	}

	@Override
	public String getServletInfo() {
		// servlet정보
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// servlet 초기화
		
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// 클라이언트로부터 요청이 들어오면 처리를 하는 것
		
	}
	
}

Class GenericServlet

package com.ssafy.myServlet;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//GenericServlet 추상클래스
public class myServlet2 extends GenericServlet{
	
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		//서비스만 구현하면 됨.
	}
	
}

Class HttpServlet(주로 사용)

package com.ssafy.myServlet;

import javax.servlet.http.HttpServlet;

public class myServlet3 extends HttpServlet{
	//doXXX 이런 것을 하나라도 작성 해야됨.
}

web.xml을 이용하여 등록

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>Hello</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>Hello Servlet!</h1>");
		writer.append("</body>");
		writer.append("</html>");
	}
    //일단 request, response가 가능한 파일 하나를 입력
    ================================================================================
    package com.ssafy.myServlet;

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;

//web.xml을 이용하여 직접 등록함 경로는 /myServlet
public class myServlet4 extends HttpServlet{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request : 클라이언트가 Tomcak에게 요청하는 통로
		//response : Tomcak이 클라이언트에게 응답하는 통로
		PrintWriter writer = response.getWriter();
		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>Hello</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>myServlet4</h1>");
		writer.append("</body>");
		writer.append("</html>");
	}
}
//HttpServlet을 상속한 클래스를 만들어 입력한 파일을 복사
================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>BackEnd_02_Servlet</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>
  <servlet-name>myServlet</servlet-name>
  <servlet-class>com.ssafy.myServlet.myServlet4</servlet-class>
  풀패키지명을 적어줘야됨.
  </servlet>
  <servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/myServlet</url-pattern>
  </servlet-mapping>
 
  http://localhost:8080/BackEnd_02_Servlet/myServlet
    실행하면 나오는 url주소
</web-app>
//WEB-INF안에 lib안에 web.xml에 들어가 servlet부분에 위와 같이 입력
//그 후 서버를 실행시키면 나오는 결과창

어노테이션을 이용한 등록

package com.ssafy.myServlet;

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("/myServlet2")
public class myServlet5 extends HttpServlet{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request : 클라이언트가 Tomcak에게 요청하는 통로
		//response : Tomcak이 클라이언트에게 응답하는 통로
		PrintWriter writer = response.getWriter();
		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>Hello</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>myServlet5</h1>");
		writer.append("</body>");
		writer.append("</html>");
	}
}

Servlet 생명주기(Life-Cycle)

  • 서블릿 인스턴스가 존재하지 않으면 다음과 같은 작업 수행
    1. 서블릿 클래스 로드
    2. 서블릿 클래스 인스턴스 생성
    3. 서블릿 인스턴스 초기화
    4. 웹 컨테이너에 의한 서비스 메서드 호출
    5. destroy 메서드를 호출하여 서블릿 종료
package com.ssafy.lifecycle;

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;

/**
 * Servlet implementation class LifeCycle
 */
@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	int initCount=1;
	int doGetCount=1;
	int destroyCount=1;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
	//생성자
    public LifeCycle() {
        System.out.println("생성자 호출");
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출  "+initCount++);
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출"+destroyCount++);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet 메서드 호출"+doGetCount++);
	}

}
//
//아무것도 없는 창이 하나 새로 생긴다.
//새로운 창이 생기고 생성자, init, doGet메서드가 한번씩 호출
생성자 호출
init 메서드 호출1
doGet 메서드 호출1
//f5를 누를 때마다 doGet 메서드가 호출된다.
doGet 메서드 호출2
doGet 메서드 호출3
doGet 메서드 호출4
doGet 메서드 호출5
doGet 메서드 호출6
doGet 메서드 호출7
doGet 메서드 호출8
doGet 메서드 호출9
doGet 메서드 호출10
//아무 값이나 변경 후 저장을 하면 destroy메서드 호출
destroy 메서드 호출1

Servlet Parameter

action이  default값이고 method가 GET일 때

<h2>GET Form</h2>
	<form action="" method="GET">
<!-- 	action=""->여기로 요청을 보낼게요.내 주소로 다시 요청을 보내는 것과 같음 -->
<!-- 	method에 아무것도 안 적으면 default는 GET -->
		<!-- name 속성필요. -->
		<input type="text" name="id">
<!-- 		name->쿼리스트링의 key -->
		<input type="submit">
	</form>

GET method면 name은 쿼리스트링의 key이고 주소값에 id에 입력한 아이디 값이 들어간다.

 

action이 default값이고 method가 POST일 때

<h2>POST Form</h2>
	<form action="" method="POST">
<!-- 		name 속성필요.  -->
		<input type="text" name="id"> 
		<input type="submit">
	</form>

POST method면 GET과 같이 name은 쿼리스트링의 key이지만 주소값에 id값이 보이지 않는다. 하지만 입력은 된 상태라고 f12를 눌러보면 알 수 있다.

 

<form action="/gogo" method="GET">

<h2>Action1</h2> -->
<!-- 	<form action="/gogo" method="GET"> -->
<!-- 		<!-- name 속성필요. --> 
<!-- 		<input type="text" name="id"> -->
<!-- 		<input type="password" name="pw"> -->
<!-- 		<input type="submit"> -->
<!-- 	</form> -->

action에 /가 들어가있다면 /다음부터 바로 입력한 값이 나온다. 아직 입력만 하고 뒤에 처리한게 없어서 404오류가 나온다.

 

<form action="gogo" method="GET">

<h2>Action1</h2>
	<form action="gogo" method="GET">
<!-- 		<!-- name 속성필요. --> 
		<input type="text" name="id">
		<input type="password" name="pw">
		<input type="submit">
	</form>

위와 다르게 action에 /가 없다면 주소가 다 나온 뒤에 입력한 값이 나온다. 아직 입력만 하고 뒤에 처리한게 없어서 404오류가 나온다.

 

Input_text.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>GET Form</h2>
	<form action="ServletParameter" method="GET">
		<input type="text" name="text">
		<input type="submit">
	</form>
</body>
</html>
//ServletParameter라는 Servlet에 호출하기 위해 ServletParameter Servlet을 생성

package com.ssafy.parameter;

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 SerVletParameter
 */
@WebServlet("/ServletParameter")
public class SerVletParameter extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String text=request.getParameter("text");
		
		System.out.println(text);
//
ssafy
안녕하세요.

제출란에 ssafy와 안녕하세요.를 입력하면 콘솔창에 제출하자마자 바로 입력된다. 입력되고 나서는 response를 주지 않았기 때문에 아무런 창도 뜨지 않는다

 

request하고 response까지 하는 방법

package com.ssafy.parameter;

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 SerVletParameter
 */
@WebServlet("/ServletParameter")
public class SerVletParameter extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String text=request.getParameter("text");
		
		System.out.println(text);
		
		response.setContentType("text/html; charset=UTF-8");
		//해주지 않는다면 안녕하세요.->?????. 로 입력된다
		
		//response값을 준다.
		PrintWriter writer = response.getWriter();
		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>Hello</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>"+text+"</h1>");
		writer.append("</body>");
		writer.append("</html>");
	}

}

위에 코드에서 ServletParameter Servlet코드만 이렇게 바꿔준다면 response값까지 나올 수 있다. 그리고 우리나라 말은 UTF-8로 바꿔줘야 나올 수 있다.

Frong-Controller

웹에서 발생하는 모든 요청에 대해 호출되는 Servlet을 만들어 처리함.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>구구단</title>
</head>
<body>
	<h3>몇단 을 구할까나?</h3>
	<form action="main" method="get">
		<input type="hidden" name="action" value="gugu">
		<div>단 입력</div>
		<input type="number" min="1" value="1" name="dan">
		<button>계산</button>
	</form>
</body>
</html>
===================================================================
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>사람 등록</h3>
	<form action="main" method="POST">
		<input type="hidden" name="action" value="regist">
		<label>이름 : </label>
		<input type="text" placeholder="이름을 입력하세요" name="name"><br>
		<label>나이 : </label>
		<input type="number" min="0" placeholder="나이를 입력하세요" name="age"><br>
		<input type="radio" id="man" name="gender" value="man">
		<label for="man">남자</label>
		<input type="radio" id="woman" name="gender" value="woman">
		<label for="woman">여자</label>
		
		<fieldset>
			<legend>취미</legend>
			<input type="checkbox" id="sleep" name="hobby" value="sleep">
			<label for="sleep">수면</label>
			<input type="checkbox" id="eat" name="hobby" value="eat">
			<label for="eat">먹기</label>
			<input type="checkbox" id="study" name="hobby" value="study">
			<label for="study">공부</label>
			<input type="checkbox" id="jump" name="hobby" value="jump">
			<label for="jump">점프</label>
		</fieldset>
		<input type="submit">
	</form>
</body>
</html>
===================================================================
두 html은 같은 main Servlet을 호출하고 있기 때문에 main Servlet에서 두 개의
html에서 골라줘야된다. 두 개의 hidden value가 다르기 때문에 action에서
switch문으로 둘 중에 하나를 골라줄 수 있다.
===================================================================
package com.ssafy.parameter;

import java.io.IOException;
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 MainServlet
 */
@WebServlet("/main")
public class MainServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		doProcess(request, response);//두 개의 html 중 하나를 고르게 해주는 메서드
	}	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		doGet(request, response);
	}
	
	//두 개의 html 중 하나를 고르게 해주는 메서드
	private void doProcess(HttpServletRequest request, HttpServletResponse response) {
		String action=request.getParameter("action");
		switch (action) {
		case "regist":
			//사람을 등록하는 코드
			break;
		case "gugu":
			//구구단을 하는 코드
			break;
		}
	}
}