서블릿
: jsp 표준으로 웹 어플리케이션 개발을 위해 만들어진 표준이다.
=> 자바 프로젝트가 아닌 아래의 방식으로 프로젝트를 생성한다.
이클립스 서블릿 설정 (정석)
- 파일 생성 시 필요한 기본 설정 (-> 더 쉬운 방법이 존재. 하단에 기술)
=> 톰캣에 배포하기 위해선 WAR 파일을 준비해야함.
export로 빼내어 톰켓을 깐 폴더의 webapps에 넣음 > 톰켓의 bin에서 cmd 실행 후 start.bat 입력 > 작동 확인 후 url 입력
- 톰캣 배포시 필요한 설정 (-> 더 쉬운 방법이 존재. 하단에 기술)
1. Libraries
2. Export
이클립스 서블릿 설정 (편리를 위해 더 자주 사용함)
=> 배포마다 위와 같은 식으로 매번 할 수는 없기에 플로깅 방식으로 진행한다.
- 플로깅 방식
- Apache Tomcat 기본 설정
서블릿 동작 방식
1. 사용자(클라이언트)가 URL 클릭 > HTTP 요청메시지를 서블릿 컨테이너로 전송
2. 서블릿 컨테이너가 web.xml에 정의된 URL패턴 확인 + 어느 서블릿을 통해 처리해야 할지 검색
(로딩이 아직 안 된 경우에는 로딩 작업이 발생함. 로딩시 init()메서드 호출됨.)
3. (서블릿 컨테이너가) 요청을 처리할 개별 스레드 객체를 생성 > service()메서드 호출
(HttpServletRequest 및 HttpServletResponse 객체를 생성하여 넘겨준다.)
4. (service() 메서드는) 메서드 타입을 확인 > 적절한 메서드 호출
(doGet, doPut, doDelet 등)
5. 요청 처리가 완료되면 HttpServletRequest 및 HttpServletResponse 객체 소멸됨
6. 컨테이너로부터 서블릿이 제거되는 경우 destroy() 메서드 호출
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class T01ServletLifeCycle extends HttpServlet{
/*
* 서블릿이란?
* 서블릿 컨테이너(서블릿 엔진)에 의해 관리되는 자바기간 웹 컴포넌트로서, 동적인 웹컨테츠 생성을 가능하게 해준다.
*/
public T01ServletLifeCycle() {
// 생성자
System.out.println("[T01ServletLifeCycle] 생성자 호출됨");
}
@Override
public void init() throws ServletException {
// 초기화 코드 작성...
System.out.println("[T01ServletLifeCycle] init() 호출됨");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// 실질적인 서비스 처리가 시작되는 곳... (자바의 메인 메서드 역할)
System.out.println("[T01ServletLifeCycle] service 호출됨");
super.service(arg0, arg1);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//메서드 방식이 GET 방식인 경우 호출함
System.out.println("[T01ServletLifeCycle] doGet 호출됨");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 메서드 방식이 POST 인 경우 호출함
System.out.println("[T01ServletLifeCycle] doPost 호출됨");
}
@Override
public void destroy() {
// 서블릿 객체 소멸시(컨테이너로부터 서블릿 객체 제거시) 필요한 코드 작성
System.out.println("[T01ServletLifeCycle] destroy 호출됨");
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
</head>
<body>
<p> 방가방가 메인페이지 입니다... </p>
</body>
</html>
=> web.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_3_0.xsd" version="3.0">
<display-name>ServletTest</display-name>
<servlet>
<servlet-name>T01ServletLifeCycle</servlet-name>
<servlet-class>kr.or.ddit.basic.T01ServletLifeCycle</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T01ServletLifeCycle</servlet-name>
<url-pattern>/T01ServletLifeCycle</url-pattern>
</servlet-mapping>
</web-app>
package kr.or.ddit.basic;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class T02ServletTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Request 객체 메서드
System.out.println("getCharacterEncoding() : " + req.getCharacterEncoding());
System.out.println("getContentLength() : " + req.getContentLength());
System.out.println("getQueryString() : " + req.getQueryString());
System.out.println("getProtocol() : " + req.getProtocol());
System.out.println("getMethod() : " + req.getMethod());
System.out.println("getRequestURI() : " + req.getRequestURI());
System.out.println("getRemoteAddr() : " + req.getRemoteAddr());
System.out.println("getRemotePort() : " + req.getRemotePort());
String name = req.getParameter("name"); // 요청 메시지로부터 name값 가져오기
System.out.println("name => " + name);
// 요청객체에 정보 저장하기
req.setAttribute("tel", "5555-5555");
req.setAttribute("addr", "대전시");
// 요청객체에서 저장된 정보 가져오기
System.out.println("tel => " + req.getAttribute("tel"));
System.out.println("addr => " + req.getAttribute("addr"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
서블릿 파라미터 테스트
- 요청 메시지로부터 파라미터 데이터 가져오는 방법
getParameter() - 파라미터값이 한개인 경우에 사용함.
getParameterValues() - 파라미터값이 여러개인 경우에 사용함 ex)checkbox
getParameterName() - 요청 메시지에 존재하는 모든 파라미터 이름을 가져올때 사용함.
formdata.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>입력폼 예제</title>
</head>
<body>
<form method="post" action="/ServletTest/T03ServletParameterTest">
<label for="username">유저명:</label><br>
<input type="text" name="username" id="username"><br>
<label for="password">패스워드:</label><br>
<input type="password" name="password" id="password"><br>
<hr>
<label for="birthDay">생년월일:</label><br>
<input type="date" name="birthDay" id="birthDay"><br>
<hr>
<input type="radio" id="male" name="gender" value="male">
<label for="male">Male</label><br>
<input type="radio" id="female" name="gender" value="female">
<label for="female">Female</label><br>
<input type="radio" id="other" name="gender" value="other">
<label for="other">Other</label><br>
<hr>
<input type="checkbox" id="cb01" name="hobby" value="ch01">
<label for="cb01">낚시</label>
<input type="checkbox" id="cb02" name="hobby" value="ch02">
<label for="cb02">등산</label>
<input type="checkbox" id="cb03" name="hobby" value="ch03">
<label for="cb03">하이킹</label>
<input type="checkbox" id="cb04" name="hobby" value="ch04">
<label for="cb04">독서</label><br>
<hr>
<label for="rlgn">종교</label>
<select id="rlgn" name="rlgn">
<option value="01">불교</option>
<option value="02">기독교</option>
<option value="03">힌두교</option>
<option value="04">기타</option>
</select>
<hr>
<label for="food">좋아하는 음식</label>
<select id="food" name="food" multiple="multiple">
<option value="01">소고기</option>
<option value="02">돼지고기</option>
<option value="03">물고기</option>
<option value="04">채식</option>
</select>
<br>
<br>
<input type="submit" value="Submit">
</form>
</body>
</html>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class T03ServletParameterTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 요청 메시지로부터 파라미터 데이터 가져오는 방법
*
* - getParameter() - 파라미터값이 한개인 경우에 사용함.
* - getParameterValues() - 파라미터값이 여러개인 경우에 사용함 ex)checkbox
* - getParameterName() - 요청 메시지에 존재하는 모든 파라미터 이름을 가져올때 사용함.
*/
// getParameter() 호출 전에 설정해야 함.
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String hobby = req.getParameter("hobby");
String rlgn = req.getParameter("rlgn");
String[] food = req.getParameterValues("food"); // 여러개의 값이 동일한 name으로 들어올 시 사용
///////////////////////////////////////////////
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.print("<html><body><p>" + username + "</p>"
+ "<p>" + password + "</p>"
+ "<p>" + gender + "</p>"
+ "<p>" + hobby + "</p>"
+ "<p>" + rlgn + "</p>");
if(food != null) {
for (String f : food) {
out.print("<p>food : " + f + "</p>");
}
}
// 모든 파라미터 정보 가져오기
Enumeration<String> paramNames = req.getParameterNames();
while(paramNames.hasMoreElements()) {
String param = paramNames.nextElement();
out.print("<p>파라미터 정보 : " + param + " => "
+ req.getParameter(param) + "</p>");
}
out.print("</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
+ UTF-8 설정 3가지
// 1.
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
// 2.
resp.setContentType("text/html;charset=UTF-8");
// 3.
resp.addHeader("Content-Type", "text/html;charset=UTF-8");
'자바' 카테고리의 다른 글
[Java 고급] 28장 세션 (1) | 2024.02.21 |
---|---|
[Java 고급] 27장 쿠키 (0) | 2024.02.21 |
[Java 고급] 25장 UDP 방식의 통신, HTTP 통신 (0) | 2024.02.16 |
[Java 고급] 24장 TCP 방식의 통신 (0) | 2024.02.16 |
[Java 고급] 23장 소켓 (1) | 2024.02.15 |