본문 바로가기

웹 개발/JSP

[Web_JSP] 02

실습(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>

 

결과(실행 시, {다시 계산하기} 버튼 클릭 시)
 
결과(-7*4 입력 시)
 
결과(두 정수 이상의 연산 입력 시)

 

 

 

 

'웹 개발 > 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