본문 바로가기
코딩 해보자

220913 JSP 액션태그 <useBean> 사용하기

by friendlyboy 2022. 9. 13.

Bean 사용법
  JSP의 결과와 동일함.
  => 동일한 결과를 구현하지만
      기존의 JSP코드에 
      Java코드를 추가함.

     왜 Java코드를 추가하나?

 

  1) 처리속도가 (Java > JSP)
  2) 보안성
  3) 안정성
  4) 활용성

    ①Java 서버에서만 실행됨.
    JSP는 서버에서 실행됨 + 클라이언트에서 실행됨
    ②Java 보안성 측면에서 JSP보다 안전함.
    ③JSP코드는 Java코드로 변환되어 실행되므로
    문제발생 소지가 Java코드만 실행하는 것보다 더 큼
    ④JSP에서 활용할 수 있는 Library, API 보다
    Java에서 활용할 수 있는 Library, API가 더 많음.

 

그렇다면 전체코드를 왜 Java로 만들지 않는가??

 

=> Java코드는 브라우저에서 직접 인식안됨.
    (Web server, WAS, WC같은 API(Tomcat))에서
    JSP를 실행하여 HTML로 변환할 수 있으나
    Java코드는 변환 할수 없음.
    => Servlet 서블릿 이라는 방법을
         구현하였으나 JSP를 사용하지 않고
         Servlet 만으로 구현된 Java코드는
         실행속도가 가장 느림)

    보기. 자바 클래스 파일에서 HTML을 실행하도록
           소스를 구현함.(단, Servlet Import 필요함.)
          out.print("<!DOCTYPE html>");
          out.print("<html lang='ko'>");
          out.print("<meta charset='utf-8'>"); 
          ...

 

Servlet 서블릿 위치와 사용

 

 

jsp 파일도 .metadata 폴더안을 살펴보면 java파일로 생성되어있는 걸 볼수 있다.

 

 

예전에는 Servlet으로 구현했으나 실행속도가 가장 느려 현재는 추천하지 않는다.

 

 

 처리속도와 작업의 편의성을 위한 최종 선택
  1) JSP코드로만 작성한다. -> 2순위
     Model 1 방식
  2) JSP+Servlet -> 1순위
           --------
           Java Class == Bean(빈)
     Model 2 방식
  3) Servlet -> 3순위 (추천X)
     방식 이름 없음

Model 2 방식을 편리하고 효율적으로
작업하기 위해 프레임워크를 사용한다.
(프레임워크 종류 : Spring , 전자정부 표준 프레임워크,
                       MyBatis, iBatis, ...)

 

 

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" autoFlush="true" %>
    <%@ page import="pack_Bean1.Sample" %>
                                  <!-- 객체를 만들어 JSP가 클래스를 인식함 위치는 상관 없음~-->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="/Dwp_Ch11_Bean/style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/Dwp_Ch11_Bean/script/script.js"></script>
</head>
<body>
    <div id="wrap">
	<h1>page 지시자</h1>
	<% //스크립트릿(Scriptlet)
	/* out.print("클래스의 데이터 첫번째 출력 :"+Sample.strData); */
	Sample obj = new Sample();
	
	out.print("String 기본값 :" +obj.getStrData() + "<br><br>");
	String data="ABC123";
	obj.setStrData(data); //데이터 전달
	out.print("데이터 전달 후 String : "+ obj.getStrData());
	
	
	%>
	
    </div>
    <!-- div#wrap  -->
</body>
</html>

java

package pack_Bean1;

public class Sample {

	private String strData;  //String 기본값 null  /  속성(Property,프로퍼티)
	
	public void setStrData(String strData) {
		this.strData = strData;
	}
	public String getStrData() {    //게터
		return this.strData;
	}
}

 

 

액션태그
  1) 초기화 액션 태그 =>
      <jsp:setProperty name="A" property="B" value="C" />
      A : useBean 액션태그의 id 속성 값(클래스 지정)
      B : property는 "속성"이라는 뜻으로 사용함. (필드이름)
          클래스에서는 필드가 속성에 해당
          그리므로 필드명을 의미함.
      C: 필드에 초기화할 값

그리고 액션태그는 JSP기능을 함축적으로 포함하고 있으므로 
필드와 세터(Setter)를 묶어서 동시에 실행한다.
 단 해당 세터가 클래스에 존재하고 있어야함.


 2) 반환 액션태그
   <jsp:getProperty name="useBean의 id값" property="속성값" value="초기화값" />
 단 해당 게터가 클래스에 존재하고 있어야함.

※html에서 id는 하나의 id에 적용. 클래스는 요소를 공통적으로 실행할수 있도록.
jsp에서 jsp:useBean id 는 이름, class 는 패키지.클래스 속성값

jsp:setProperty name은 id값과 동일

 

-----------------------------------------------------------------

[JSP 파일에서 클래스1에 데이터 전송후
 클래스2에 데이터를 전송하여 클래스2에서
 해당 데이터 출력]

 

 

jsp 파일 예

<%@page import="pack_Bean1.Sample"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" autoFlush="true"%>
    <jsp:useBean id="a"
    					   class="pack_Bean1.Sample"
    					   scope="page" /> <!-- 세션 유지 시간동안 사용가능 -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="/Dwp_Ch11_Bean/style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/Dwp_Ch11_Bean/script/script.js"></script>
</head>
<body>
    <div id="wrap">
    <h1>Action 태그</h1>
   

     <jsp:setProperty name="a" property="strData" value="오렌지"/>
     <!-- setter역할 -->
     <jsp:getProperty name="a" property="strData" />
     <!-- getter역할 -->     
 <%--     <%
     out.print("setProperty로 초기화된 필드값 출력 : " +strData+"<br><br>");
     %> --%>
     
    </div>
    <!-- div#wrap  -->
</body>
</html>

java 파일

package pack_Bean1;

public class Sample {

	private String strData;  //String 기본값 null  /  속성(Property,프로퍼티)
	
	public void setStrData(String strData) {
		this.strData = strData;
	}
	public String getStrData() {    //게터
		return this.strData;
	}
}

JSP 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" autoFlush="true"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="//style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/script/script.js"></script>
</head>
<body>
    <div id="wrap">
	<h1>index.jsp</h1>
	<jsp:useBean id="objSample" class="pack_Bean2.Sample" />
	<!-- JSP 액션태그는 JSP의 기능을 함축적으로 갖고 있다. -->
	<%-- <jsp:setProperty property="num" name="dataObj" value="3"/>
	<h1 style="color: #f80">
	<jsp:getProperty property="num" name="dataObj"/>
	</h1> --%>
	<%
	int insData=3;
	int num=objSample.mtd(3); //Sample.java 변수와 다르다.
	out.print("Data 클래스의 필드 num의 값 : " +num);
	%>
	
	
    </div>
    <!-- div#wrap  -->
</body>
</html>

Sample.java 파일

package pack_Bean2;

public class Sample {
	
	public int mtd(int insData) {  //setter getter 그 무엇도 아닌 커스텀 메서드 역할만 함
		
		Data objData = new Data(); //객체 생성
		objData.setNum(insData); // 5로 초기화
		int num = objData.getNum(); //5 반환
		
		return num;
	}
	
}

 

 

package pack_Bean2;

public class Data {
	//VO: Value Object
	//DTO : Data Transfer Object
	
	private int num;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
	
	
}

 

Data.java 파일.

 

Data.java 파일이 데이터를 중간에서 서버와 클라이언트에게 전달하는 역할을 한다.

 

Eclipse 상에서 의 숫자의 이동 경로!

Eclipse 상에서 의 숫자의 이동 경로!

 

---------------------------------------------------------

[HTML에서 전송한 데이터를 
JSP에서 수신 후 클래스에 전달(=초기화)]

 

HTML파일

Document
입력1(ID)

입력2(PW)

입력3(Age)

입력4(gender) male female

JSP 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" autoFlush="true"%>
  
    <jsp:useBean id="objData" class="pack_Bean3.Data"  />
    <jsp:setProperty name="objData" property="*" />
        <%
       //objData.mtd();
        %>    
            
    <jsp:useBean id="objDAO" class="pack_JDBC.DAO"  />
    
    <%
    objDAO.mtd_JDBC(
    		objData.getUid(),
    		objData.getUpw(),
    		objData.getuAge(),
    		objData.getGender()); 
    %>
    
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="//style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/script/script.js"></script>
</head>
<body>
    <div id="wrap">
	<<h1>Class 필드 데이터 초기화 완료!!</h1>
    </div>
    <!-- div#wrap  -->
</body>
</html>

Data.java 파일(DAO)

package pack_Bean3;

public class Data {
	
	private String uid;
	private String upw;
	private int uAge;
	private int gender;
	
	
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getUpw() {
		return upw;
	}
	public void setUpw(String upw) {
		this.upw = upw;
	}
	public int getuAge() {
		return uAge;
	}
	public void setuAge(int uAge) {
		this.uAge = uAge;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	
	public void mtd() {
		System.out.println("uid : "+uid);
		System.out.println("upw : "+upw);
		System.out.println("uAge : "+uAge);
		System.out.println("gender : "+gender);
		System.out.println("Print ok!!");
	}
	

}

 

getter와 setter 메서드 만들때 uAge면 setuAge 형태로 첫글자가 소문자로 생성된다.

 

get set 생성 단축키는 alt s r - alt a r 

 

 

<jsp:setProperty> 사용시 property="*" 로 필드 전체 사용가능.

주의점은 네임 속성과 필드의 이름이 같아야 한다

주의점은 네임 속성과 필드의 이름이 같아야 한다

 

댓글