Web/JSP

JSP_servlet사용한 사칙연산

miming 2022. 2. 16. 01:57

jsp파일과 servlet을 이용하여 사칙연산 계산을 만들어봅시다!

저는 실행시 웹브라우저에 뜨는 첫페이지 Calcu.jsp 파일,

결과 수행시 보여질 페이지인 ca.java (servlet)파일, java파일,

연산시 사용될 Sww.java파일,

url 매핑을 해줄 web.xml파일로 총 4파일을 사용하여 실습을 진행하였습니다!


첫번째로 jsp파일에 사칙연산을 실행하였을 때 나오는 첫 페이지를 그려줍니다.

 

폼 태그를 사용해서 '계산' 이라는 submit버튼을 을 눌렀을때 지정된 경로로 이동할 수 있도록 액션을 걸어줍니다.

post방식으로 보낼거라서 method="post"를 해주었습니다.

 

<form align="center" name="form1" action="./calc" method="post">
<input type="text" name="n1" size="5">
<select name="op">
 <option value="+">+</option>
 <option value="-">-</option>
 <option value="*">*</option>
 <option value="/">/</option>
 </select>
<input type="text" name="n2" size="5">
<input type="submit" value="계산">
 <input type="reset" value="다시입력">
</form>

 

<코드화면>

Calcu.jsp

 

두번째는 서블릿(java)입니다.

 

서블릿을 생성했을 때 상단에 @WebServlet("/서블릿 이름")이 오버라이딩 되있는걸 확인 할 수 있습니다.

이건 어노테이션(annotaion)이라는 건데, url을 매핑해주는 용도입니다.

 

서블릿에서 url을 매핑해주는 기법은 두가지가 있는데 하나는 위에서 언급한 어노테이션이 있고,

다른 하나는 web.xml에서 입력해주는 방식이 있습니다. 

web.xml방식은 맨 아래에서 설명하도록 하겠습니다

 

post방식으로 보내게되면 protected void doPost()함수에서 작성을 하면 되는데,

저는 protected void doGet()함수에서 doPost()함수를 호출하여 사용하는 방식으로 진행하였습니다.

 

jsp파일의 form태그에서  method="post"로 입력을 하였을 때 ,

폼태그 안의 변수들은 protected void doPost()함수 안에 있는 HttpServletRequest에 담겨오게됩니다.

넘어온 변수를 사용하여 다시 웹브라우저에 응답을 해줍니다.

 

protected void doGet()함수와 protected void doPost()함수 안에 작성된 코드

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html"); 
response.setCharacterEncoding("utf-8"); 
// response 객체는 JSP의 실행 결과를 웹브라우저로 전송하고자 할때 사용

//setContentType 메소드는 html의 표준 MIME 타입인 "text/html" 의 변경이나 캐릭터의 인코딩을 재 지정하고자 할때 사용


PrintWriter out=response.getWriter();

/*servlet으로 들어온 요청은 텍스트(html)로 응답을 보내는게 대부분이기 때문에, PrintWriter out=response.getWriter();로 응답을 내보낼 출력스트림을 얻어내고나서 out.println();에 텍스트 또는 변수를 입력해서 사용합니다.
이 경우 상단에 java.io.PrintWriter를 import해주어야합니다.*/

int n1=Integer.parseInt(request.getParameter("n1"));
int n2=Integer.parseInt(request.getParameter("n2"));
char op=request.getParameter("op").charAt(0);

Sww swi=new Sww();

//조건에 따라 연산을 실행해줄 case문은 3번째 페이지 java파일에 따로 빼놓은 java파일 객체생성을
String html="<!DOCTYPE html><br>"
   +"<head><br>"
   +"<meta charset=\"EUC-KR\"><br>"
   +"<title>죽음의 계산기</title><br>"
   +"</head><br>"
   +"<body><br>"
   +"<h1 align=\"center\">계산기</h1><br>"
   +"<p align=\"center\">"
   + n1 + " " + op + " " + n2 + " = " + swi.sw(n1,n2,op)//객체생성한 클래스의 sw함수 호출, 매개변수 전달
   +"</p>"
   +"<div align=\"center\">"
   +"<a href=\"javascript:history.back();\">"//history.back(); 이전 페이지로 돌아가게 해주는 함수.
   +"메인으로 돌아가기"
   +"</a>"
   +"</div>"
   +"</body><br>"
   +"</html><br>";

out.print(html);
}

<코드화면>

ca.java

세번째는페이지는 두번째 서블릿에서 호출한 Sww클래스를 담아놓은 java파일 입니다.

호출시 전달받은 매개변수를 이용해 case문으로 연산.

 

<코드화면>

Sww.java

마지막으로 setvlet페이지 설명에서 언급한 web.xml을 이용한 매핍을 해줍니다.

<web-app></web-app>안에 아래와 같은 형식으로 입력을 해줍니다.

 

<servlet>
      <servlet-name>cal</servlet-name>→닉네임
      <servlet-class>ca</servlet-class>→내가 생성한 서블릿클래스의 실제 이름으로 설정해야함
  </servlet>

  <servlet-mapping>
      <servlet-name>cal</servlet-name>→위에서 입력한 닉네임값과 같아야 함
      <url-pattern>/calc</url-pattern>->url에서 프로젝트 이름 뒤에 오는 부분으로 ' /' 슬래시로 시작 
  </servlet-mapping>

 

<코드화면>

web.xml

 

 

 

<완성화면>

Calcu.jsp

첫 페이지에서 숫자를 입력 후 다시입력을 누르면 다 지워지고, 숫자 입력 후 계산 버튼을 누르면

계산이 되면서 url이 경로가 매핑으로 설정했던 calc가 뜨는걸 확인할 수 있습니다.

이 페이지는 원래서블릿 페이지인데 매핑설정한 calc라고 뜨는 것 입니다.

 

메인으로 돌아가기를 누르게되면 서블릿에서 history.back함수를 썼기 때문에 이전 페이지로 돌아갈 수 있습니다.