Servlet
웹 서비스를 위한 자바 클래스 (자바를 이용하여 웹을 만들기 위해 필요한 기술)
웹 프로그래밍에서 클라이언트의 요청(Request)을 처리하고 그 결과를 다시 클라이언트에게 응답(Response)하는 Servlet클래스의 구현 규칙을 지킨 자바 프로그래밍 기술
자바 어플리케이션 코딩을 하듯 웹 브라우저용 출력 화면(HTML) 을 만드는 방법
특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트.
-> 클라이언트 요청에 대한 서버 응답 시 미리 만들어둔 화면(정적)이 아닌 요청을 받을 때 마다 알맞은 화면을 만들어(동적) 응답함.
- HTML을 사용하여 요청에 응답
- java thread를 이용하여 동작. (요청마다 별도 thread가 생성됨)
- MVC Model2패턴에서 Controller로 이용
- http프로토콜 서비스를 지원하는javax.servlet.http.HttpServlet 클래스를 상속 받음
단점
- servlet에 작성한 html 코드 변경 시 재컴파일 해야 한다
Front 화면
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Servlet 테스트2</title>
</head>
<body>
<h2>1. checkbox 또는 name 속성 값이 같은 input 태그 값 서버로 전달하기</h2>
<form action="/ServletProject2/test1" method="get">
이름 : <input type="text" name="inputName"> <br>
성별 :
<!-- radio는 여러 개가 존재해도 하나만 선택되어 서버로 제출된다. => 서버에 한 개만 넘어간다.
name이 같은 경우 하나만 선택된다. -->
여 <input type="radio" name="gender" value="여">
남 <input type="radio" name="gender" value="남">
<br>
<!-- name 속성이 같은 input이 여러 개 서버로 전달되는 경우
서버에서 배열 형태로 받을 수 있다.
-->
취미 :
축구 <input type="checkbox" name="hobby" value="축구">
농구 <input type="checkbox" name="hobby" value="농구">
야구 <input type="checkbox" name="hobby" value="야구">
<br>
해시태그 :
<input type="text" name="hashtag">
<input type="text" name="hashtag">
<input type="text" name="hashtag">
<button>제출</button>
</form>
</body>
</html>
Get 방식
package edu.kh.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet1 extends HttpServlet{
// doGet쓰고 ctrl space하면 자동완성된다
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String inputName = req.getParameter("inputName");
// -> 요청 시 전달 받은 값 중 name 속성값이 "inputName"인 태그의 value를 얻어온다.
String gender = req.getParameter("gender");
// 요청 시 전달 받은 값 중 중복되는 name 속성이 있는 경우 // 요소는 다르지만 이름이 같은 경우
// ==> 이름이 같은 파라미터들을 하나의 배열로 저장
String[] hobby = req.getParameterValues("hobby");
String[] hashtag = req.getParameterValues("hashtag");
System.out.println(inputName);
System.out.println(gender);
System.out.println( Arrays.toString(hobby));
System.out.println( Arrays.toString(hashtag));
out.print("<!DOCTYPE html>");
out.print("<html>");
out.print("<head>");
out.print("<title>" + inputName + "님의 응답화면 </title>");
out.print("</head>");
out.print("<body>");
out.print("<h2>이름" + inputName + "님의 응답화면 </h2>");
out.print("성별은 <span style ='color:darkgreen'>" + gender + "자</span>");
out.print("<h3>선택한 취미</h3>");
out.print("<p>");
if(hobby == null) { // 선택한 취미가 없을 경우
out.print("없음");
}else {
// 취미 한 줄씩 추가
for(String h : hobby) {
out.print(h + "<br>");
}
}
out.print("</p>");
// 해시태그
out.print("<h4 style='color:yellowgreen'>");
for(String tag : hashtag) {
if (!tag.equals("")) { // 해시태그가 작성되어있는 경우
out.print("#" + tag + " ");
}
}
out.print("</h4>");
out.print("</body>");
out.print("</html>");
}
}
HttpServletRequest req : 요청관련 데이터, 정보를 가지고 있는 객체
HttpServletResponse resp : 응답 관련 정보, 스트림을 가지고 있는 객체
Parameter : 클라이언트 요청 시 전달 받은 값
응답(Response)
- 클라이언트의요청에 따라 처리된 내용을 서버 -> 클라이언트로 전달
Servlet을 이용하여 응답하는 경우
요청에 따라 응답화면 모양을 변경할 수 있다.
- 가능한 이유 : Servlet에서 상황에 따라 html코드를 새로 만들기 때문
Servlet을 이용한 응답 화면 만들기
1. 응답 화면(HTML)의 형식 지정
resp.setContentType("text/html; charset=UTF-8");
2. 만들어진 응답 화면을 전달 받을 클라이언트와의 연결 통로(스트림) 얻어오기
PrintWriter out = resp.getWriter();
getWriter : response 객체에서 클라이언트와 연결된 문자기반 스트림을 얻어온다.
3. HTML 코드를 작성하여 스트림을 이용해 출력
Servlet을 이용한 응답 화면 만들기
// 1. 응답 화면(HTML)의 형식 지정
resp.setContentType("text/html; charset=UTF-8");
// 2. 만들어진 응답 화면을 전달 받을 클라이언트와의 연결 통로(스트림) 얻어오기
PrintWriter out = resp.getWriter();
// 3. HTML 코드를 작성하여 스트림을 이용해 출력
out.print("<!DOCTYPE html>");
out.print("<html>");
out.print("<head>");
out.print("<title>" + inputName + "님의 응답화면 </title>");
out.print("</head>");
out.print("<body>");
out.print("<h2>이름" + inputName + "님의 응답화면 </h2>");
out.print("성별은 <span style ='color:darkgreen'>" + gender + "자</span>");
out.print("<h3>선택한 취미</h3>");
out.print("<p>");
if(hobby == null) { // 선택한 취미가 없을 경우
out.print("없음");
}else {
// 취미 한 줄씩 추가
for(String h : hobby) {
out.print(h + "<br>");
}
}
out.print("</p>");
// 해시태그
out.print("<h4 style='color:yellowgreen'>");
for(String tag : hashtag) {
if (!tag.equals("")) { // 해시태그가 작성되어있는 경우
out.print("#" + tag + " ");
}
}
out.print("</h4>");
out.print("</body>");
out.print("</html>");
getWriter : response 객체에서 클라이언트와 연결된 문자기반 스트림을 얻어온다.
web.xml
<?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_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ServletProject2</display-name>
<!-- 메인화면으로 지정할 파일 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 클래스를 servlet으로 지정 -->
<servlet>
<servlet-name>test1</servlet-name>
<servlet-class>edu.kh.servlet.TestServlet1</servlet-class>
</servlet>
<!-- 요청 주소를 처리할 servlet 지정 -->
<servlet-mapping>
<servlet-name>test1</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
</web-app>
'Backend > Servlet & JSP' 카테고리의 다른 글
[JSP] GET,POST/ JSP Action/ EL / Scope (0) | 2021.12.30 |
---|---|
[JSP] 정리 + 코드, vscode 설정 (0) | 2021.12.30 |
[Servlet] 예제 서블릿 1,2,3 (0) | 2021.12.04 |
[Servlet] eclipse 프로젝트 생성, vscode설정 + Run On Server 단축키 설정 (0) | 2021.11.28 |
[Servlet] 설치 :: 이클립스, 톰캣, vscode (0) | 2021.11.28 |