<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>계산기 -JSP 페이지</title> </head> <body> <h1>JSP로 만든 페이지</h1> <form action="Oper" method="post"> <p>수식을 입력하세요.</p> <input type="text" name="operation"> <input type="submit" value="계산"> </form> </body> </html>
public class Calc { int a = 0; int b = 0; Calc(){}; public Calc(int a, int b) { super(); this.a = a; this.b = b; } public int plus() { return a + b; } public int minus() { return a-b; } public int multi() { return a * b; } public int devide() { return a / b; }
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Oper") public class Oper extends HttpServlet{ @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { String paramNum = arg0.getParameter("operation"); String opers="+-*/"; Calc c = null; int temp = 0, count = 0; int result = 0; String[] arrTemp = null; PrintWriter out = arg1.getWriter(); paramNum = paramNum.replace(" ", ""); // 공백제거 for(int i = 0; i < opers.length(); i++) { for(int j = 0; j < paramNum.length(); j++) { if(opers.charAt(i) == paramNum.charAt(j)) { temp = i; // 연산자와 파라미터가 같을 때의 인덱스 count++; // 연산자가 1개일 때만 계산하기 위해 카운트 //연산자와 파라미터로 넘어온 문자열을 비교하여 연산자 찾기 } } } // index 0 : 첫번째 정수 // index 1 : 두번째 정수 out.print("<p>"); if(count == 1) { arrTemp = paramNum.split("\\"+opers.charAt(temp)); //split()은 특정 문자를 기준으로 나누어 배열에 저장 try { c = new Calc(Integer.parseInt(arrTemp[0]), Integer.parseInt(arrTemp[1]) ); //Calc 생성자에 int 2개 전달 switch(temp) { case 0 : result = c.plus(); break; case 1 : result = c.minus(); break; case 2 : result = c.multi(); break; case 3 : result = c.devide(); break; } out.println(result); } catch (NumberFormatException e) { out.println("정수만 입력하세요"); } catch(ArithmeticException e) { out.println("0으로 나눌 수 없습니다."); } }else if(count ==0) { // 연산자를 입력하지 않았을 때 out.print("연산자를 찾을 수 없습니다."); }else { // 연산자를 2개 이상 입력했을 때 out.print("두 개의 정수만 연산 가능합니다."); } out.println("</p>"); out.print("<a href='calc.jsp'> JSP 페이지로 이동</a>"); //만약 url부분에 .jsp를 빼고 <a href='calc'>라고 한다면 //페이지를 찾을 수 없어서 에러가 발생한다. //web.xml에서 처리 해 줄 수 있다. out.close(); } }
out.print("<a href='calc.jsp'> JSP 페이지로 이동</a>");
- 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>day05</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> 이 부분 추가하기! <servlet> <servlet-name>calc</servlet-name> <jsp-file>/calc.jsp</jsp-file> <!-- jsp 파일의 경로 --> </servlet> <servlet-mapping> <servlet-name>calc</servlet-name> <!-- 아래의 url요청이 들어오면 servlet-name이 calc인 곳의 경로로 가라 --> <url-pattern>/calc</url-pattern> <!-- /calc라는 요청이 들어오면 이름이 calc인 servlet의 경로로 가라 --> </servlet-mapping> </web-app>
이렇게 web.html 파일 수정 후, Oper.java(servlet)파일에서
calc.jsp 를 calc 로 수정 한 후, 실행해보면 calc.jsp 파일 경로로 찾아왔지만 url 에는 calc라고 표시되어있다.
여기서 계산 버튼을 누르면 Oper로 이동하고
JSP 페이지로 이동을 누르면 calc로 보이게 된다.
+
를 입력하면 명령어가 되기때문에\\
"+를 해야 문자열로 인식한다.ex) "안녕 하세요" 라는 문자열을
" "
공백을 기준으로 나누고 싶을 때
String str = "안녕 하세요";
String[] arrStr = str.split(" ");
"안녕,하세요" 라는 문자열을
,
을 기준으로 나누고 싶을 때
String str = "안녕,하세요";
String[] arrStr = str.split(" ,");
🗝️특수문자, 연산자 주의!
"안녕+하세요" 라는 문자열을
+
을 기준으로 나누고 싶을 때
String str = "안녕+하세요";
String[] arrStr = str.split("+");
-> 이렇게 하면 컴파일러가"+"
부분을 인식하지 못함!!!!
-> String[] arrStr =str.split("\\+")
;역슬래쉬 두개를 붙여야한다!