서블릿 매핑
: 서블릿의 URL주소(full path)를 보안성, 편리성 제고 위해 간결하게 표시
http://IP주소:포트번호/프로젝트이름/패키지이름포함된클래스이름
- 1. web.xml 설정 수정
=> 여러 서블릿 사용 시 복잡해짐
- FirstServlet.java
package servlet01.ex01;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//요청, 응답 리턴
System.out.println("doGet 메소드 호출됨");
}
@Override
public void destroy() {
//서블릿 제거
System.out.println("destroy 메소드 호출됨");
}
@Override
public void init() throws ServletException {
//초기화 작업 //서블릿이 서비스에 배치되고 있음을 나타냄
System.out.println("init 메소드 호출됨");
}
}
- 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_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>servlet01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>delivery</servlet-name>
<servlet-class>servlet01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>delivery</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
=> http://127.0.0.1:8080/servlet01/first
- SecondServlet.java
package servlet01.ex01;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("second의 doGet 메소드 호출");
}
@Override
public void destroy() {
System.out.println("second의 destroy 메소드 호출");
}
@Override
public void init() throws ServletException {
System.out.println("second의 init 메소드 호출");
}
}
- 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_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>servlet01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>delivery</servlet-name>
<servlet-class>servlet01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>delivery2</servlet-name>
<servlet-class>servlet01.ex01.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>delivery</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>delivery2</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
</web-app>
- 2. java 소스코드에 annotation 설정
패키지 우클릭 - new servlet - next - urlmapping (/third) 수정
=> 오류 (톰캣 8,9버전 기준이라서 예전 패키지 import함)
=> new servlet 대신 class 로 작성 시 해결됨 (or 패키지명만 jakarta로 변경)
- ThirdServlet.java
package servlet01.ex01;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/third") ////
public class ThirdServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("third에서 init 메소드 호출");
}
public void destroy() {
System.out.println("third에서 init 메소드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("third에서 doGet 메소드 호출");
}
}
서블릿 동작 과정
사용자(클라이언트)가 웹브라우저 실행 (url)
로그인으로 id, 비번 값 서블릿으로 전달 => 요청
서블릿은 데이터베이스 조회
데이터베이스에서 서블릿으로 결과값 전달
서블릿은 클라이언트에 응답값 (ex. 로그인되었습니다) 전달 => 응답
서블릿 요청 처리
- 로그인
- webapp/login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<h2>로그인 창</h2>
<form action="login" method="get" name="formLogin">
<label for="user_id">아이디</label>
<input type="text" id="user_id" name="user_id"><br>
<!-- name : 서버로 전달되는 변수 -->
<label for="user_pw">비밀번호</label>
<input type="text" id="user_pw" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</form>
</body>
</html>
- LoginServlet.java
package servlet01.ex01;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출됨");
}
public void destroy() {
System.out.println("destroy 메소드 호출됨");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//우선 요청만 처리
request.setCharacterEncoding("utf-8");
//getParameter() : name(user_id)에 해당하는 값(value) 리턴
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 : "+user_id);
System.out.println("비밀번호 : "+user_pw);
}
}
=> http://127.0.0.1:8080/servlet01/login.html
- 체크박스
- webapp/input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>여러 타입 전송 창</title>
</head>
<body>
<h2>로그인 창</h2>
<form action="input" method="get" name="formInput">
<label for="user_id">아이디</label>
<input type="text" id="user_id" name="user_id"><br>
<fieldset>
<legend>특강신청</legend>
<input type="checkbox" name="subject" value="자바">자바
<input type="checkbox" name="subject" value="C언어">C언어
<input type="checkbox" name="subject" value="react">리액트
<input type="checkbox" name="subject" value="android">안드로이드
<input type="checkbox" name="subject" value="oracle">오라클
</fieldset>
<input type="submit" value="신청하기">
<input type="reset" value="다시입력">
</form>
</body>
</html>
- InputServlet.java
package servlet01.ex01;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/input")
public class InputServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출됨");
}
public void destroy() {
System.out.println("destroy 메소드 호출됨");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("user_id");
System.out.println(id + "님 특강 신청 완료");
String[] subject = request.getParameterValues("subject");
//해당 name에 해당하는 여러 값(value)을 배열로 받음
for (String sub:subject) {
System.out.println("신청한 과목 : "+sub);
}
}
}
- getParameterNames()
: 모든 태그의 name 속성값(key)을 Enumeration 객체로 리턴
=> 일괄 처리 메소드 (다양한 타입, 많은 입력 데이터 받을 수 있음)
=> 활용해 key, value 값 모두 얻기 가능
- input2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="input2" method="get" name="formLogin">
<label for="user_id">아이디</label>
<input type="text" id="user_id" name="user_id"><br>
<label for="user_pw">비밀번호</label>
<input type="text" id="user_pw" name="user_pw"><br>
<label for="user_email">비밀번호</label>
<input type="text" id="user_email" name="user_email">
<fieldset>
<legend>특강신청</legend>
<input type="checkbox" name="subject" value="자바">자바
<input type="checkbox" name="subject" value="C언어">C언어
<input type="checkbox" name="subject" value="react">리액트
<input type="checkbox" name="subject" value="android">안드로이드
<input type="checkbox" name="subject" value="oracle">오라클
</fieldset>
<input type="submit" value="신청하기">
<input type="reset" value="다시입력">
</form>
</body>
</html>
- InputServlet2.java
package servlet01.ex01;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.util.Enumeration;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출됨");
}
public void destroy() {
System.out.println("destroy 메소드 호출됨");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Enumeration enu = request.getParameterNames(); //여러 종류 값 받기 때문에 제네릭 뺌 //매개변수 이름 전달
while(enu.hasMoreElements()) {
String name = (String)enu.nextElement(); //key //하나씩 요소 전달
String[] values = request.getParameterValues(name); //value들 배열에 전달
for (String val : values) {
System.out.println("name = "+ name + " 값 = "+val);
}
}
}
}
서블릿 응답 처리
서블릿(서버) -> 웹 브라우저로 데이터 전송 시, 웹브라우저에 데이터 종류 미리 알려줘야 함
MIME-TYPE : 톰캣 컨테이너(웹서버)에서 미리 설정한 데이터 종류
ex. html 전송 시 text/html
새로운 데이터 종류 지정 시 톰캣 서버/web.xml에 mime-mapping 추가
- 로그인
- login2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
<h2>로그인 창</h2>
<form action="login2" method="get" name="formLogin">
<label for="user_id">아이디</label>
<input type="text" id="user_id" name="user_id"><br>
<label for="user_pw">비밀번호</label>
<input type="text" id="user_pw" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</form>
</body>
</html>
- LoginServlet2.java
package servlet01.ex02;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출됨");
}
public void destroy() {
System.out.println("destroy 메소드 호출됨");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); //mime-type 지정
PrintWriter out = response.getWriter();
String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");
String data = "<html>";
data += "<body>";
data += "<p>접속한 아이디는 " + id + "입니다";
data += "<p>비밀번호는 " + pw + "입니다";
data += "</body>";
data += "</html>";
out.print(data); //print() 통해 html 태그를 웹브라우저로 보냄
}
}
=> http://127.0.0.1:8080/servlet01/login2.html
=> 입력, submit 시 브라우저에 문구 표시
접속한 아이디는 aa입니다
비밀번호는 bb입니다
※ getWriter()
서블릿의 응답 형태 => 바이트 or 문자 가능
문자 형태로 응답하려면 데이터의 흐름(Stream)을 컨트롤해야 함 (문자로 응답 보내도록 설정해야 함)
HttpServletResponse 인터페이스의 상위 인터페이스인 ServletResponse의 getWriter() 메소드 호출
=> 스트림에 텍스트 기록 가능
'Programming > 국비학원' 카테고리의 다른 글
220923 - 서블릿 - DB 연결, 커넥션풀 (0) | 2022.09.24 |
---|---|
220922 - 서버 - 서블릿 예제 (0) | 2022.09.23 |
220920 - 서버 - 웹 애플리케이션 개발 환경 구축 (0) | 2022.09.21 |
220919 - 오라클 - 무결성 (0) | 2022.09.20 |
220916 - PL/SQL - 트리거 (0) | 2022.09.17 |