본문 바로가기

Servlet&JSP

간단한 Servlet 예제 구현

Servlet프로그램의 기본구성

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8">
    <title>계산기</title>
  </head>
  <body>
    <form action="Cal" method="post">
      <h1>계산할 값을 입력하세요</h1>
      <input name="a" type="number">
      <input name="b" type="number"><br><br>
      <input type="submit" name="button" value="plus">
      <input type="submit" name="button" value="minus"><br>
      <input type="submit" name="button" value="multiple">
      <input type="submit" name="button" value="divide">
    </form>
  </body>
</html>
 
cs

 

index.jsp로 ui구성

 - form action="Cal": 로직을 담당할 Java파일에 매핑역할

 - method="post": 입력값을 post를 통해 전달 -> url에 입력값이 노출되지 않음.

 

ui

 

package com.tiletocode.testservlet;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet(name = "Cal", value = "/Cal")
public class Cal extends HttpServlet {
 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        
PrintWriter out = resp.getWriter();
        int a = 0;
        int b = 0;
 
        String bt = req.getParameter("button");
        String a_ = req.getParameter("a");
        String b_ = req.getParameter("b");
 
        if (!a_.equals(""))
            a = Integer.parseInt(a_);
        if(!b_.equals(""))
            b = Integer.parseInt(b_);
 
        int result = switch (bt) {
            case "plus" -> a + b;
            case "minus" -> a - b;
            case "multiple" -> a * b;
            default -> a / b;
        };
        out.println("계산결과: " + result);
    }
}
 
cs

 

 

@WebServlet: html과 java를 name=Cal을 통해 mapping해주는 annotation.

 

 

어노테이션을 쓰지않고 web.xml에 매핑정보를 추가해줄수 있지만 코드내용이 길어져서 다소 불편한 방법.

만약 어노테이션을 쓰고싶다면 metadata-complete="false"로 설정해야 어노테이션을 인식함.

 

 

if문: html에서 전달받는값이 공백이거나 null일수도 있으므로

기본값을 0으로 설정, 전달받는값이 빈값이 아닐때만 Int로 형변환해서 변수에 저장

(getParameter 메소드로 받은값은 기본적으로 String임.)

 

switch문: 버튼의 value에 할당된 문자열에따라 다른 연산을 result에 저장해서 출력

 

package com.tiletocode.testservlet.filter;
 
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
 
@WebFilter("/*")
public class CharEncoding implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain) throws IOException, ServletException {
        //브라우저에게 코드를 UTF-8로 보냄
        resp.setCharacterEncoding("UTF-8");
        //브라우저에게 UTF-8로 읽을것을 명시
        resp.setContentType("text/html; charset=UTF-8");
        //브라우저가 보낸 post를 UTF-8로 읽음
        req.setCharacterEncoding("UTF-8");  //Before Filter
        chain.doFilter(req, resp);
                                            //After Filter
    }
}
 
cs

 

Servlet의 filter: CharEncoding.java

필터파일은 프로그램 실행전후로 특정명령을 삽입할수있음.

여기서는 response, request데이터의 문자인코딩을 UTF-8로 읽을것을 명시해서

한글폰트가 깨지는것을 방지함.

 

 

 

 - multiple 버튼을 누른결과: 어노테이션으로 매핑한대로 정상출력 확인(value="/Cal") 

 - post로 요청한대로 url에 전달값이 노출되지 않고 body에 붙여 값을 같이보냄.

(get방식을 쓴다면 localhost:8080/Cal?a=8&b=5 주소를 가지게됨)