JSP

[Java/JSP] JSP 액션태그와 jsp:useBean 사용법

yoonddo 2023. 2. 4. 12:55

JSP Action이란

JSP에서 기본으로 제공하는 태그들의 집합을 'JSP Action'이라 한다. JSP Action은 각 태그에 맞는

자바 코드로 변환된다. 즉 JSP Action 태그를 사용하지 않더라도 스크립트릿 <%%>에 자바 코드를

작성해도 된다. 그렇다면 JSP Action은 왜 존재할까?

JSP Action 태그를 사용할 줄 안다면 자바 코드를 사용하지 않아도 JSP로 웹 페이지를 개발할 수 있지만

비즈니스 로직을 처리하는 부분과 화면을 처리하는 부분을 나눠서 개발할 수 있도록 하기위해 만들어졌다.

액션태그란

기존 html에 없는 태그로 자바 문법을 jsp 페이지에 섞어 쓰다보면 혼란이 있어 자바 문법을

대신하여 제공하는 태그이다.


JSP 액션태그의 종류

액션 설명
<jsp:useBean> 자바 인스턴스를 준비한다. 보관소에서 자바 인스턴스를 꺼내거나 자바 인스턴스를 새로 만들어 보관소에 저장하는 코드를 생성한다. (자바 인스턴스 = Java Bean)
<jsp:setProperty> 자바 인스턴스의 프로퍼티 값을 설정한다.
자바 객체의 setter()를 호출하는 코드를 생성한다.
<jsp:getProperty> 자바 인스턴스의 프로퍼티 값을 꺼낸다.
자바 객체의 getter()를 호출하는 코드를 생성한다.
<jsp:include> 정적(HTML, 텍스트파일 등)또는 동작(서블릿/JSP) 자원을 including하는 자바 코드를 생성한다.
<jsp:forword> 현재 페이지의 실행을 멈추고 다른 정적, 동적 자원으로 forwarding하는 자바 코드를 생성한다.
<jsp:param> jsp:include, jsp:forward, jsp:params의 자식 태그로 사용한다.
ServlletRequest 객체에 매개변수를 추가하는 코드를 생성한다.
<jsp:plugin> OBJECT 또는 EMBED HTML 태그를 생성한다.
<jsp:element> 임의의 XML태그나 HTML태그를 생성한다.

 


 

<jsp:useBean> 액션 태그

JSP페이지에서 <jsp:useBean>태그를 활용하여 application, session, request, page 보관소에 저장된

자바 객체를 가져와 사용할 수 있다.

만약 보관소에 저장된 객체가 없다면 새로 생성하여 해당 보관소에 저장한다.

<jsp:useBean id="[빈이름]" class="[자바빈클래스이름]" scope="[범위]" />
<jsp:useBean id="dto" class="bean.MemberDto" scope="page">
</jsp:useBean>

<jsp:useBean> - id 속성

객체의 이름을 설정한다. 이 이름은 3군데에서 사용된다.

① 꺼낸 객체의 참조 변수 이름

② getAttribute()로 값을 꺼낼때 사용하는 이름

③ 객체를 생성할경우 보관소에 저장하는 key값의 이름


<jsp:useBean> - class 속성

class 속성은 자바 객체를 생성할 때 사용할 클래스 이름을 지정한다.

반드시 패키지 이름을 포함해야한다. (QName)

new 연산자를 사용하므로 인터페이스는 올 수 없다.

scope에서 지정한 보관소에서 객체를 찾지 못할 경우 class의 값을 사용해서 인스턴스를 생성한다.

생성된 객체는 scope 보관소에 자동으로 저장된다.

class 속성이 없으면 객체를 생성할 수 없다.


<jsp:useBean> - scope 속성

보관소를 지정한다. page(기본값), request, session, application 중 하나를 지정할 수 있다.

영역 설명
page 현재 페이지에만 적용되며 페이지 처리가 끝나면 유효하지 않음 (기본 값)
request request 요청을 받고 처리를 완료할 때 까지 생존
session 사이트 전체의 범위를 갖지만 지속시간이 있음
application 사이트 전체 범위를 갖고 계속 유지됨

 

jsp 자바빈 코드를 자바 코드로 적는다면

<% bean.MemberDto dto = New bean.MemberDto(); %> 가 되겠다.


<jsp:setProperty> 액션 태그

 useBean 액션태그로 생성한 자바빈 객체의 속성값을 설정하는 태그 (자바 코드에서 setter메소드를 대신하여 사용함)

<jsp:setProperty name="[자바빈]" property="[이름]" value="[값]
<jsp:setProperty name="dto" property="*" />

 

name : 프로퍼티의 값을 변경할 자바빈 객체의 이름 (useBean태그의 id속성에서 지정한 값을 사용하면 됨)

property : 값을 지정할 프로퍼티의 이름

value : 프로퍼티의 값 (표현식 사용 가능)

value 대신하여 param 속성을 사용할 수 있다.

param : 파라미터의 값을 프로퍼티의 값으로 지정할 때 사용 (value는 값을 직접 입력하는 것이고 param은 넘어오는 parameter의 이름을 적는 것 (form에서 사용한 name 속성의 값을 적음)

(value와 param을 같이 사용할 수 없다.)

 

 

만약 form의 파라미터 네임을 자바빈 변수와 동일하게 한다면

public class MemberDto {
	
	private String id;
	private String pw;
	private String name;
	private String address;
	private String[] hobby;
    
    /* ... 중략 ... */
    }
    
//form.html

<form name="frm" action="action6.jsp" method="get">
		- 아이디 : <input type="text" id="id" name="id" /><br>
		- 패쓰워드 : <input type="password" id="pw" name="pw" /><br>
		- 이름 : <input type="text" id="name" name="name" /><br>
		- 주소 : <input type="text" id="address" name="address" /><br>
</form>
<jsp:setProperty name="dto" property="id" />
<jsp:setProperty name="dto" property="pw" />
<jsp:setProperty name="dto" property="name" />
<jsp:setProperty name="dto" property="address" />

원래라면 이런 형식으로 적어줘야 할 코드를

 

<jsp:setProperty name="dto" property="*" />

이렇게 애스터리스크를 이용하여 한줄로 적을 수 있다.

 

자바 코드로 적는다면

<% dto.setId(request.getParameter("id"); %>

 


<jsp:getProperty> 액션 태그

 

객체의 property를 get하기 위해 사용한다.

(자바 코드에서 getter메소드를 대신하여 사용함)

 

<jsp:getProperty name="자바빈이름" property="프로퍼티이름" />
	 id : <jsp:getProperty property="id" name="dto" /><br>
	 pw : <jsp:getProperty property="pw" name="dto" /><br>
	 name : <jsp:getProperty property="name" name="dto" /><br>
	 addrez`ss : <jsp:getProperty property="address" name="dto" /><br>
	 hobby : <jsp:getProperty property="hobby" name="dto" />

자바 코드로 적는다면면 <%=dto.getId()%> 이런 형식이 될것이다.

*jsp 액션 태그에서의 데이터 타입은 자동으로 String과 int 등 타입에 따라서 알맞게 자동으로 값이 처리된다.


JSTL

프론트와 백을 분리 시키기 위한 기술로는 JSTL도 일종의 분리 기술이다. 

 

프론트엔드 입장에선 자바빈을 이용해서 데이터를 가져오고 JSTL로 데이터를 뿌려주면 좀 더 직관적으로 사용할 수 있다. 오로지 자바빈만 사용한다면 아래처럼 써야하기 때문이다.

<jsp:getProperty name="자바빈" property="프로퍼티이름" />

 

단점

1. JSP든 JSTL이든 자바 파일로 다시 컴파일 하게 되는데, JSP는 실제 자바코드라서 바로 번역하면 되지만 JSTL은 다시 자바 코드로 변경되야하는 것 때문에 메모리 과부하 문제가 존재한다. 또 JSTL에서는 JSP에서 사용하는 자바 문법보다 다양하지 않다

2. HTML 프로그래머에겐 익숙하지만 Java 프로그래머에겐 배우기도 쓰기도 귀찮다.

3. 결과적으로 SI 처럼 모든걸 다 개발해야하는 상황이면 구애받지 않고 JSP를 쓰는게 낫고 대규모이고 디자이너가 1명 이상일 경우 해당 디자이너에게 맡기고 Java bean만 던지는 방식으로 분리 시켜서 만들면 좋다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

자료 출처 : https://jong99.tistory.com/m/87 , https://stir.tistory.com/108#JSTL%EB%-F%--%--%EB%B-%--%EC%-A%B-%ED%--%--%EC%A-%--%--%EC%--%-A%EB%--%--%-F , https://atoz-develop.tistory.com/entry/JSP-%EC%95%A1%EC%85%98-%ED%83%9C%EA%B7%B8%EC%99%80-jspuseBean-%EC%82%AC%EC%9A%A9-%EC%98%88%EC%A0%9C