[Java/JSP] JSP 액션태그와 jsp:useBean 사용법
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