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();
}
}