servlet이라는 새 프로젝트를 만들었다.

애플리케이션 서버에 Tomcat이 안 뜨면, 새로 만들기 클릭해서 Tomcat 폴더 클릭하면 된다.

새 프로젝트를 만든 뒤, 실행하면 이렇게 나온다.

Hello Servlet 링크를 누르면 밑에 있는 페이지로 이동하는데,

url에 /hello-servlet이 추가되어있다. 이유는
@WebServlet(name = "helloServlet", value = "/hello-servlet")
여기서 value를 /hello-servlet 이것으로 주었기 때문!
package com.koreait.servlet;
import java.io.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
// 서블릿이 최초 로딩될 때 단 1회만 실행되는 초기화 메서드
public void init() {
message = "Hello World!";
}
// 클라이언트의 GET 요청을 처리
// HttpServletRequest: 클라이언트 요청 정보를 담은 객체
// HttpServletResponse: 서버에서 클라이언트로 전달될 응답 정보를 담은 객체
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// response.setContentType("text/html");
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
// try-with-resources 문법으로 안전하게 사용
// <!DOCTYPE html> HTML5 명시
try (PrintWriter out = response.getWriter()){
out.println("<!DOCTYPE html>");
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
}
// 서블릿이 톰캣 종료 또는 언로드 시 호출
// 리소스 해제, 커넥션 풀 반환
public void destroy() {
}
}
폴더 구조(250609)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>controller</title>
</head>
<body>
<h2>컨트롤러 테스트</h2>
<p><a href="join.korea">회원가입</a></p>
<p><a href="login.korea">로그인</a></p>
<p><a href="info.korea">회원정보</a></p>
<p><a href="modify.korea">회원정보 수정</a></p>
<hr>
<p><a href="regist.ajax?userid=apple&password=1111&age=20&gender=여자">회원가입</a></p>
<p><a href="login.ajax?userid=apple&password=1111">로그인</a></p>
</body>
</html>
package com.koreait.servlet.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
// 이름에 관계없이 .korea 끝나는 모든 URL 매핑
// http://localhost:8081/servlet_war_exploded/controller/join.korea (get, post)
@WebServlet("*.korea")
public class MyController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyController(){}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doAction(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doAction(req, resp);
}
protected void doAction(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String uri = req.getRequestURI();
String contextPath = req.getContextPath();
String command = uri.substring(contextPath.length());
System.out.println(uri); // /servlet_war_exploded/controller/join.korea
System.out.println(contextPath); // /servlet_war_exploded
System.out.println(command); // /controller/join.korea
if(command.equals("/controller/join.korea")){
System.out.println("회원가입 작업!!");
}else if(command.equals("/controller/login.korea")){
System.out.println("로그인 작업!!");
}else if(command.equals("/controller/info.korea")){
System.out.println("회원정보 작업!!");
}else if(command.equals("/controller/modify.korea")){
System.out.println("회원정보 수정 작업!!");
}
}
}
command에 따라 다르게 출력이 된다.
한글이 깨지는 경우,
Run -> Edit Configurations
VM options:-Dfile.encoding=UTF-8 -Duser.language=en -Duser.region=en
이렇게 하면 한글이 잘 나온다!

http://localhost:8081/servlet_war_exploded/controller/join.korea 실행 결과
.korea 앞에만 변경해서 ex(info.korea, login.korea) 이런 식으로 실행하면 각각의 결과를 확인할 수 있다.
/servlet_war_exploded/controller/join.korea
/servlet_war_exploded
/controller/join.korea
회원가입 작업!!
/servlet_war_exploded/controller/info.korea
/servlet_war_exploded
/controller/info.korea
회원정보 작업!!
/servlet_war_exploded/controller/login.korea
/servlet_war_exploded
/controller/login.korea
로그인 작업!!
package com.koreait.servlet.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("*.ajax")
public class MyController1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyController1(){}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doAction1(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doAction1(req, resp);
}
protected void doAction1(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String uri = req.getRequestURI();
String contextPath = req.getContextPath();
String command = uri.substring(contextPath.length());
System.out.println(req.getParameter("userid"));
System.out.println(req.getParameter("password"));
String userid = req.getParameter("userid");
String password = req.getParameter("password");
String age = req.getParameter("age");
String gender = req.getParameter("gender");
if(command.equals("/controller/regist.ajax")) {
resp.setContentType("application/json; charset=UTF8;");
resp.getWriter().write("{\"userid\":\"" + userid +"\", \"msg\":\"가입되었습니다.\"}");
}else if(command.equals("/controller/login.ajax")) {
resp.setContentType("application/json; charset=UTF8;");
resp.getWriter().write("{\"userid\":\"" + userid +"\", \"msg\":\"로그인되었습니다.\"}");
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax</title>
<script>
function ajaxRegist(){
const userid = document.querySelector("input[name='userid']").value
const password = document.querySelector("input[name='password']").value
const age = document.querySelector("input[name='age']").value
const gender = document.querySelector("input[name='gender']:checked")?.value
fetch("regist.ajax", {
method: "POST",
headers: {
'Content-Type':'application/x-www-form-urlencoded'
},
body: "userid=" + userid + "&password=" + password + "&age=" + age + "&gender=" + gender
}).then(function(response){
return response.json()
}).then(function(data){
console.log((data))
}).catch(function(err){
console.log(err);
})
}
function ajaxLogin(){
const userid = document.querySelector("input[name='userid']").value
const password = document.querySelector("input[name='password']").value
fetch("login.ajax", {
method: "POST",
headers: {
'Content-Type':'application/x-www-form-urlencoded'
},
body: "userid=" + userid + "&password=" + password
}).then(function(response){
return response.json()
}).then(function(data){
console.log((data))
}).catch(function(err){
console.log(err);
})
}
</script>
</head>
<body>
<p>아이디: <input type="text" name="userid"></p>
<p>비밀번호: <input type="password" name="password"></p>
<p>나이: <input type="text" name="age"></p>
<p>성별: 남:<input type="radio" name="gender" value="남자"> 여:<input type="radio" name="gender" value="여자"></p>
<p><button type="button" onclick="ajaxRegist()">AJAX 회원가입</button></p>
<p><button type="button" onclick="ajaxLogin()">AJAX 로그인</button></p>
</body>
</html>

이렇게 콘솔에 json이 출력되는 것을 확인할 수 있다.