2023.02.08 / Java Servlet

기가지니·2023년 2월 8일
1

Java Servlet

  • 싱글톤 패턴
    : 클래스로부터 객체가 하나만 만들어지는것
static영역에 객체 인스턴스를 미리 하나를 생성한다.
이 객체 인스턴스가 필요하면 getInstance()를 통해서만 조회할 수 있다.
생성자를 private으로 막아서 외부에서 new 키워드로 객체 인스턴가 생성되는 것을 막는다.

Stateless
요청시 마다 스트림을 연결해서 데이터를 주고받는 방식
http가 이 방식을 씀

Statefull
연결이 지속되어있는 방식
(채팅같이 데이터 실시간 연결)

💥 statefull과 stateless의 개념을 알아두자


Client의 입력을 받아보아요
1) textfield에서 값을 받아오려면?
2) POST방식
3) 서블릿 경로 설정

- http://~~~ (이거 잘 안씀)
- 절대경로
- 슬래시가 없는 경우

@ 연습해보자!

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>입력 연습입니다</h1>
	<!-- 클라이언트가 서버쪽에 데이터를 보낼때
		 GET, POST방식으로 데이터를 보낼 수 있어요
		 GET은 여러가지 방법으로 사용할 수 있는데,
		 POST는 기본적으로 HTML form tag를 이용해요! -->
		 <!-- form의 action 속성에 호출(submit)할 서버쪽 프로그램을 명시해요 -->
		 <!-- 먼저 절대 경로로 써볼게요 method를 명시하지 않으면 무조건 GET방식이에요 -->
<!--	<form action="http://127.0.0.1:8080/input/InputText"
		  method="post">
		<span>사용자 ID:</span>
		<input type="text" name="userID">
		<br><br>
		<button type="submit">서버로 전송</button>
		
	</form> -->
	<!-- action속성에 절대경로를 사용하고 있어요
		 절대경로 http://~~
		 일반적으로 절대경로보다 상대경로를 많이 써요
		 상대경로 => context root를 기준으로 경로 설정 
		 		  /로 시작하는 경우 => domain까지 지칭
		 		  => http://127.0.0.1:8080/input/ -->
	 <form action="/InputText"
		  method="post">
		<span>사용자 ID:</span>
		<input type="text" name="userID">
		<br><br>
		<button type="submit">서버로 전송</button>
		
	</form>
	<br><br><br>
	<a href="http://127.0.0.1:8080/input/InputText?userID=신사임당">신사임당을 호출할거에요</a>
</body>
</html>
package controller;

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 TextInputServlet
 */
@WebServlet("/InputText")
public class TextInputServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	// field를 만들 수 있어요
	int count = 0;	// 이 field는 client thread에 의해 공유돼요
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TextInputServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		request.setCharacterEncoding("UTF-8");
		count += 1; // 진짜 공유 되는지 확인해보자
		// 1. 입력받고
		String data = request.getParameter("userID");
		// 2. 로직처리하고
				
		// 3. 출력처리하면 돼요
		//	1) contentType을 설정
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter(); //데이터 연결 통로 뚫기
		out.println("<html><head></head><body>");
		out.println("<br><br>");
		out.println(data + "님 환영");
		out.println("GET방식");
		out.println("</body></html>");
		
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 클라이언트의 요청을 처리하면 돼요 count += 1; => statefull 이런거 하지 말아요 동기화 문제가 발생할 수 있어요
		// 싱글톤인 경우에 가능하나, 이도저도 아니게될 수 있어요
		// POST방식일 경우!
		// 클라이언트로부터 서블릿으로 전송된 문자에이터는 iso_8859_1인코딩으로 되어있어요(한글처리 불가)
		// 인코딩을 바꿔서 한글처리를 해줘야해요
		request.setCharacterEncoding("UTF-8");
		count += 1; // 진짜 공유 되는지 확인해보자
		// 1. 입력받고
		String data = request.getParameter("userID");
		// 2. 로직처리하고
				
		// 3. 출력처리하면 돼요
		//	1) contentType을 설정
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter(); //데이터 연결 통로 뚫기
		out.println("<html><head></head><body>");
		out.println(data + "님 환영");
		out.println("</body></html>");
		
		out.close();
		
		
	}

}
profile
지니야 코딩 해줘

0개의 댓글