초급의 끄적거림

[JSP] JAVA 빈즈 (id, 객체 등) 개요 / 예제 비교 본문

JSP

[JSP] JAVA 빈즈 (id, 객체 등) 개요 / 예제 비교

codingD 2019. 8. 28. 10:13

1. 자바 웹페이지의 개발방식의 흐름

servlet(.java) → jsp → servlet(.java)

 

2. Beans의 이해

 ⊙ 반복되는 자바코드들을 JAVA 파일안에 저장하여 사용하는 형태

  - 사용이유 : jsp 페이지에 나열되는 자바 처리로직이 복잡하여 디자인 변경시 자바코드가 영향을 받아 오류가 자주 발생하고 코드 수정시 코드를 알아볼 수 없어서 유지보수가 어려움

                 : 작업 도중 자바 코드가 JSP 페이지에 반복적으로 사용

                 : 코드의 노출로 저작권 등 보안상 문제

 ⊙ 종류 (참고 : https://ninearies.tistory.com/64)

   - DTO (Data Transfer Object) class

   - Manager (Process) class

   - DAO (Data Access Object) class

 ⊙ 데이터를 출력하는 레이어 & 데이터를 처리하는 레이어 분리로 유지보수 시간을 단축 + 코드의 가독성 ↑

 ⊙ 확장자 : *.java → 컴파일로 .class로 배포

 ⊙ 빈즈는 dll과 같은 원리

 

 

3. Java Bean(객체) 생성

<jsp:useBean id="객체명" class="패키지명.클래스명" scope="page">
 ⊙ class의 클래스명 : 내가 쓰고자하는 클래스명을 적는 것, * 처리 하지 않음

 

4. Java Bean(id)의 유효범위 4가지

  scope="page" 

  현재 페이지에서만 유효 (private 속성과 비슷), 해당 페이지에서 유지되는 값. 생략시 기본값

  scope="request"

   다른 페이지에서 공유, 서로 요청한 페이지에서 유효

  scope="session"

   다른 페이지에서 공유 (시간이 지나면 자동 소멸 - ex. 로그인 정보들)

   각 사용자별로 개별적으로 구분 및 적용

  scope="application"

   다른 페이지에서 공유, 모든 사용자가 공유하는 값

 

5. 예제) computeForm

 5-1. Compute.java

 ⊙ .java와 .jsp 를 함께 사용하기 위해, 자바 만들기 

     : 'basicWeb' 프로젝트에 'Java Resources' → 'scr' → 패키지 'net.testbean' → 클래스 'Compute'

package net.testbean;

public class Compute{
    //메소드 구현
    
    public int add ( int a, int b ) { return a+b; }
    public int sub ( int a, int b ) { return a-b; }
    public int mul ( int a, int b ) { return a*b; }
    public int div ( int a, int b ) { return a/b; }
    public int mod ( int a, int b ) { return a%b; }
}//class end

 

 5-2. computeForm.jsp

 ⊙ WebContent  폴더에 새 폴더 'testbean' 생성 → 'computeForm.jsp'

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>computeForm.jsp</title>
</head>
<body>
	<h1>* 계산기 *</h1>
    //1) JSP 메소드
    <form action="computeok1.jsp"> 
    <table border="1">
	<tr>
	  <th>숫자1</th>
	    <td><input type="number" name="num1" size="5"></td> <!-- size : 겉으로 보이는 텍스트상자의 크기 -->
	  </tr>
	  <tr>
	    <th>숫자2</th>
	    <td><input type="number" name="num2" size="5"></td>
	  </tr>
	  <tr>
	    <td colspan="2">
	   	 <input type="submit" value="계산">
	    </td>	
	  </tr>
  </table>			
  </form>
</body>
</html>

 

⊙ 공통적으로 입력 된 값으로, 1~3)까지 진행되는 동안 모두 같은 결과값이 나와야 함

공통적으로 입력된 값

 

  5-3. computeForm1.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>computeok1.jsp</title>
</head>
<body>
	<h1>* 계산결과 *</h1>
	<h2>1) JSP 메소드 호출</h2>
<%
    int num1=Integer.parseInt(request.getParameter("num1").trim());
    int num2=Integer.parseInt(request.getParameter("num2").trim());
    
    out.print(num1+"+"+num2+"="+add(num1, num2));
    out.print("<hr>");
    out.print(num1+"-"+num2+"="+sub(num1, num2));
    out.print("<hr>");
    out.print(num1+"*"+num2+"="+mul(num1, num2));
    out.print("<hr>");
    out.print(num1+"/"+num2+"="+div(num1, num2));
    out.print("<hr>");
    out.print(num1+"%"+num2+"="+mod(num1, num2));
    out.print("<hr>");
%>

<%! 
    //JSP메소드 작성 영역-------------------------------------------------
    public int add (int a, int b) { return a+b;}
    public int sub (int a, int b) { return a-b;}
    public int mul (int a, int b) { return a*b;}
    public int div (int a, int b) { return a/b;}
    public int mod (int a, int b) { return a%b;}
%>

</body>
</html>

 

  5-4 computeForm2.jsp

   ⊙ form을 새로 만들지 않고 action만 바꿔서 수행할 것

   ⊙ 서블릿(.java) → 자바코드를 웹페이지에서 쓰기 위해서 만든 것이 .jsp (우리가 지금까지 한것)→ .java + .jsp (우리가 앞으로 할 것) 두 가지를 섞어서 페이지를 만드는 것이 적합

  

 

   ⊙ Compute.java에 computeok1.jsp에 작성한 메소드 복사해오기

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.testbean.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>computeok2.jsp</title>
</head>
<body>
	<h1>* 계산결과 *</h1>
	<h2>2) new연산자를 이용해서 객체생성 후 메소드 호출</h2>
<% 
    //new를 너무 많이 쓰지 않기 위해서 1)에서처럼 메소드를 사용하게 되는 것
 	int num1=Integer.parseInt(request.getParameter("num1").trim());
    int num2=Integer.parseInt(request.getParameter("num2").trim());

	//객체 new Compute() → RAM의 heap 영역에 메모리가 할당 되고 주소값이 발생
    //참조변수 comp
    Compute comp=new Comput();
    out.print(num1+"+"+num2+"="+comp.add(num1, num2));
	out.print("<hr>");
	out.print(num1+"-"+num2+"="+comp.sub(num1, num2));
	out.print("<hr>");
	out.print(num1+"*"+num2+"="+comp.mul(num1, num2));
	out.print("<hr>");
	out.print(num1+"/"+num2+"="+comp.div(num1, num2));
	out.print("<hr>");
	out.print(num1+"%"+num2+"="+comp.mod(num1, num2));
	out.print("<hr>");
%>
</body>
</html>

다른 방식이지만 1) 과 값이 같음을 볼 수 있음

  5-5. computeForm3.jsp

  ⊙ Java Bean(객체) 생성

    - <jsp:UseBean id="객체명" class="패키지명.클래스명" scope="page">

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.testbean.*"%>
<jsp:useBean id="comp" class="net.testbean.Compute" scope="page"></jsp:useBean>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>computeok3.jsp</title>
</head>
<body>
	<h1>* 계산결과 *</h1>
	<h2>3) Java Bean을 이용해서 객체생성 후 메소드 호출</h2>
<%
 	int num1=Integer.parseInt(request.getParameter("num1").trim());
    int num2=Integer.parseInt(request.getParameter("num2").trim());
    
    //Compute comp=new Compute(); → 위에 jsp:useBean으로 들어가 있기 때문에 쓰지 않아도 됨
	out.print(num1+"+"+num2+"="+comp.add(num1, num2));
	out.print("<hr>");
	out.print(num1+"-"+num2+"="+comp.sub(num1, num2));
	out.print("<hr>");
	out.print(num1+"*"+num2+"="+comp.mul(num1, num2));
	out.print("<hr>");
	out.print(num1+"/"+num2+"="+comp.div(num1, num2));
	out.print("<hr>");
	out.print(num1+"%"+num2+"="+comp.mod(num1, num2));
	out.print("<hr>");    
%>

</body>
</html>

다른 방식이지만 1과 2랑 같은 값이 나옴을 알 수 있음

 

6. 예제) calcForm

  6-1. CalcBean.java

package net.testbean;

public class CalcBean{
    //절대값 구하기 (무조건 양수 출력)
    public int abs(int num){
     if(num<0)
     	return -num;
     else
        return num;     
    }//abs() end
    
    
    //팩토리얼값 구하기 4*3*2*1
    public int fact(int num){    
    return (num==0) ? 1 : num*fact(num-1);
    }//fact() end
}//class end

 

  6-2. calcForm.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>calcForm.jsp</title>
</head>
<body>
	<h1>* 절대값/팩토리얼 *</h1>
    <form action="calcok.jsp">
    	<table border="1">
        <tr>
          <td>
          	<input type="text" name="num" size="3">
          </td>
        </tr>
        <tr>
          <td>
          	<input type="submit" value="계산">
            <input type="reset" value="취소">
          </td>
        </tr>
        </table>
     </form>
</body>
</html>

 

  6-3. calcok.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="net.testbean.*"%>
<jsp:useBean id="calc" class="net.testbean.CalcBean" scope="page"></jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>calcok.jsp</title>
</head>
<body>
	<h1>* Java Bean 이용한 계산 결과 *</h1>
<%
	int num=Integer.parseInt(request.getParameter("num"));
    out.print("절대값 : "+calc.abs(num));
    out.print("<hr>");
    out.print("팩토리얼 : "+calc.fact(num));
%>
</body>
</html>

 

 

Comments