<%@ 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에 입력값이 노출되지 않음.
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 주소를 가지게됨)
'Servlet&JSP' 카테고리의 다른 글
MVC model 개념 (0) | 2021.12.17 |
---|---|
Servlet의 상태값 유지하기3 - Cookie (0) | 2021.12.14 |
Servlet의 상태값 유지하기2 - Session Scope (0) | 2021.12.14 |
Servlet의 상태값 유지하기1 - Application Scope (0) | 2021.12.13 |
intelliJ에서 Servlet 기본세팅 (0) | 2021.12.05 |