실습(Servlet)
- 문제
<!--
[계산기 만들기 실습]
1. calc.jsp, Oper.java(서블릿), Calc.java(클래스) 생성
2. calc.jsp에서 input태그로 수식 통채로를 입력받고 action은 Oper서블릿으로 설정해준다.
3. Calc.java 클래스에서 사칙연산 메소드를 정의하고 모두 두 정수를 전달받은 후 int로 리턴해준다.
4. 나눗셈 메소드에서는 분모가 0일 경우를 처리하지 않고 Oper.java 서블릿에서 나눗셈 메소드 사용 시 예외를 처리한다.
5. Oper.java 서블릿에서 전달받은 수식을 분석한 후 사칙연산 연산자에 맞게 Calc.java의 메소드를 호출하여 결과를 응답한다.
※ request.getParameter("태그의 name 속성 값")으로 전달받은 값을 가져올 수 있다.
※ 연산자를 split()으로 분리할 때에는 split("\\" + 연산자)로 사용해야 분리된다.
※ 잘못 입력했을 때와 0으로 나눌 때 모두 예외처리를 사용하여 알맞는 메세지를 출력해준다.
6. Oper.java 서블릿에서 calc.jsp로 돌아갈 때에는 calc.jsp가 아닌 calc로 이동할 수 있도록 web.xml에서 servlet을 설정한다.
-->
1. calc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기</title>
</head>
<body>
<form action="Oper" method="post">
<p>수식을 입력해주세요(두 정수의 사칙 연산)</p>
<input type="text" name="input">
<button>결과 확인</button>
</form>
</body>
</html>
2. Calc.java
package com.example.calc;
public class Calc {
private int num1;
private int num2;
public Calc() {;}
public Calc(int num1, int num2) {
super();
this.num1 = num1;
this.num2 = num2;
}
//덧셈
public int add() {return num1 + num2;}
//뺄셈
public int sub() {return num1 - num2;}
//곱셈
public int mul() {return num1 * num2;}
//나눗셈
public int div() {return num1 / num2;}
}
3. Oper.java
package com.example.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.example.calc.Calc;
/**
* Servlet implementation class Oper
*/
@WebServlet("/Oper")
public class Oper extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Oper() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
//사용자가 화면에서 입력한 수식
String input = request.getParameter("input");
//연산자의 종류를 담고 있는 문자열(문자배열)
String opers = "-+*/";
//수식 중 연산자를 담아줄 변수
char oper = ' ';
//계산 결과를 담아줄 변수
int result = 0;
//각 정수를 담아줄 자료구조
ArrayList<Integer> nums = new ArrayList<>();
//연산자를 기준으로 첫번째 정수, 두번째 정수를 담아줄 배열
String[] temp = null;
//사칙연산 메소드를 사용할 수 있는 객체
Calc c = null;
//오류 발생 시 오류 메세지를 담아줄 변수
String resultMsg = null;
//수식에서의 연산자 유무를 판단해줄 FLAG
boolean check = false;
//입력한 수식에서 연산자를 기준으로 나눠진 배열의 인덱스 번호로 활용할 변수
int index = 0;
//연산자 종류 개수 만큼 반복
for (int i = 0; i < opers.length(); i++) {
//사용자가 입력한 수식에서 각 연산자를 찾고, 만약 못찾았다면
if(input.indexOf(opers.charAt(i)) == -1) { // -1: 찾는 값이 없다.
//다음 반복
continue;
}
//만약 연산자를 찾았다면 oper에 해당 연산자 저장
oper = opers.charAt(i);
//연산자를 찾았다는 표시
check = true;
}
//위 반복문에서 연산자를 찾지 못했다면 check는 false
if(!check) {
resultMsg = "잘못된 수식입니다.";
}
try {
//찾은 연산자를 기준으로 정수들을 분리
temp = input.split("\\" + oper);
//만약 연산자로 분리했더니 3개의 정수를 찾았다면,
//0번째 방에 정수가 아닌 빈 문자열이 있다면,
//이는 음수로 시작하는 수식이다.
if(temp.length == 3 && temp[0].equals("")) {
//음수로 시작하는 수식이라면
//두번째 방에 있는 정수가 첫번째 정수이고, 앞에 -를 붙여줘야 한다.
temp[1] = "-" + temp[1];
//첫번째 방에 접근하지 못하도록 index를 1 증가시켜준다.
index++;
}else if(temp.length > 2 && !temp[0].equals("")) { //세 개 이상의 정수이면서 첫번째 방에 있는 값이 정수일 경우
resultMsg = "두 정수의 연산만 가능합니다.";
}
//음수로 시작하는 수식이라면 index는 1부터 시작된다.
//양수로 시작하는 수식이라면 index는 0부터 시작된다.
for (int i = index; i < temp.length; i++) {
nums.add(Integer.parseInt(temp[i]));
}
//첫번째 정수와 두번째 정수를 Calc 생성자에 전달한다.
c = new Calc(nums.get(0), nums.get(1));
//위에서 알아낸 연산자 종류에 따라 알맞는 메소드를 호출하여 연산한다.
switch(oper) {
case '+':
result = c.add();
break;
case '-':
result = c.sub();
break;
case '*':
result = c.mul();
break;
case '/':
try {
result = c.div();
} catch (Exception e) {
resultMsg = "0으로 나눌 수 없습니다.";
}
break;
}
} catch (Exception e) {
//두 개 이상의 연산자, 세 개 이상의 정수가 수식에 있다면 들어오는 영역
resultMsg = "두 정수의 연산만 가능합니다.";
}
// 오류 메세지가 없다는 것은
if(resultMsg == null) {
//정상적인 수식을 입력받아 계산했다는 뜻.
resultMsg = "결과 : " + result;
}
out.print("<p>");
out.print(resultMsg);
out.print("</p>");
out.print("<a href='calc'>다시 계산하기</a>");
out.close();
}
}
4. 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>day02</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Calc</servlet-name>
<jsp-file>/calc.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>Calc</servlet-name>
<url-pattern>/calc</url-pattern>
</servlet-mapping>
</web-app>



'웹 개발 > JSP' 카테고리의 다른 글
[Web_JSP] 06 (0) | 2022.05.24 |
---|---|
[Web_JSP] 05 (0) | 2022.05.23 |
[Web_JSP] 04 (0) | 2022.05.22 |
[Web_JSP] 03 (0) | 2022.05.18 |
[Web_JSP] 01 (0) | 2022.05.16 |