bdfgdfg

JSP - 2 본문

웹프로그래밍/JSP_Servlet

JSP - 2

marmelo12 2023. 8. 11. 22:10
반응형

JSP의 액션태그

JSP에는 HTML 안에 자바코드를 넣어주면 자동으로 servlet클래스로 만들어준다는 장점은 있지만, 자바코드를 불편하게 작성해야한다는 단점은 존재한다.

액션태그를 이용하면 자바코드를 대신할 수 있음.

 

인클루드 액션 태그 <jsp:include>

인클루드 액션태그는 앞서 배운 인클루드 디렉티브 태그처럼 화면을 분할해서 관리할 때 사용한다.

 -> 단 인클루드 디렉티브 태그는 jsp가 하나로 합쳐 하나의 .java파일로 만들어진다면 액션태그는 각각 모두 생긴다.

 

<% request.setCharacterEncoding("utf-8"); %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 테스트</title>
</head>
<body>
	<h1>HELLO JSP</h1> <br>
	<jsp:include page="duke_image.jsp" flush="true">
		<jsp:param name="name" value="테스트이미지" />
		<jsp:param name="imgName" value="image.jpg"/>
	</jsp:include>
</body>
</html>

포함할 jsp를 include 액션태그를 통해 지정해주고, param값을 넣어준다.

<%-- 
	param 액션 태그로 전달된 매개변수를 가져온다. 
--%>  
<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String imgName = request.getParameter("imgName");
%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
	<h1> 이름은 <%=name %>.</h1>
	<img src="./image/<%= imgName %>" />
</body>
</html>

include대상인 jsp는 param값을 읽어들이고 출력.

 

이외에도 서블릿에서 다른 서블릿으로 데이터를 전달할 떄 사용할 forward기능은 <jsp:forward page="포워딩할 페이지">로 사용가능.

 

유즈빈 액션태그와 자바 빈(bean)

자바에서 빈이라는 개념이 등장하는데, DTO(Data Transfer Object)클래스나 VO(Value Object)클래스와 같은 개념.

 - 단순하게 데이터를 표현하기 위한 클래스 (DB 테이블등)

 - 멤버변수 접근 젷나자는 private

 - 각 속성은 각각의 getter/setter를 가짐

 - 인자 없는 생성자를 반드시 가지며, 다른 생성자도 추가 가능

 

말이 어려운데 밑과 같은 코드가 자바 빈 클래스.

public class JavaBean {

	// 멤버 필드는 private로 선언
    private String bean;
    private int beanValue;

    public AboutJavaBean() {
    
    }
		
	// getter
    public String getBean() {
        return beanName;
    }
    
	// setter
    public void setBean(String bean) {
        this.bean = bean;
    }

    public int getBeanValue() {
        return beanValue;
    }

    public void setBeanValue(int beanValue) {
        this.beanValue = beanValue;
    }
}

 

이렇게 자바 빈을 대체하기 위한 것이 유즈빈 액션 태그. 박형식은 다음과 같다.

 -> <jsp:useBean id="빈 이름" class="패키지 이름을 포함한 자바 빈 클래스 [scope="접근범위"]/>

  --> id : JSP 페이지에서 자바 빈 객체에 접근할 때 사용할 이름

  --> scope : 자바 빈에대한 접근 범위를 지정(page,request,session,application 기본값은 page.)

 

scope는 https://starkying.tistory.com/entry/Servlet-JSP%EC%9D%98-4%EA%B0%80%EC%A7%80-Scope

해당 블로그가 잘 정리되어있음.

 

간단한 예제. (다른 jsp에서 forward 액션태그를 통해 파라미터가 전달되고 있다는 가정)

<%-- sec01.ex01 패키지의 MemberBean 클래스 --%>
<jsp:useBean id="m" class="sec01.ex01.MemberBean" scope="page"/>

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("id");
	String name = request.getParameter("id");
	String email = request.getParameter("id");
	
	m.setId(id);
	m.setPwd(pwd);
	m.setName(name);
--%>

setId,setPwd~메소드는 MemberBean클래스의 메소드. 자바코드로 빈클래스를 만들필요없이 액션태그로 간단하게 가져다 쓸 수 있다.

그러나 여전히 set,get메소드를 자바코드로 접근해야한다. 이를 위한것이 jsp:setProperty, jsp:getProperty 액션태그.

<%-- sec01.ex01 패키지의 MemberBean 클래스 --%>
<jsp:useBean id="m" class="sec01.ex01.MemberBean" scope="page"/>
<jsp:setProperty name="m" property="id" value='<%= request.getParameter("id") %>'/>
<jsp:setProperty name="m" property="pwd" value='<%= request.getParameter("pwd") %>'/>
<jsp:setProperty name="m" property="name" value='<%= request.getParameter("name") %>'/>
<jsp:setProperty name="m" property="email" value='<%= request.getParameter("email") %>'/>

<%
	
%>

이제는 자바코드 없이 액션태그만으로 각 멤버필드에 set이 가능해졌다.

 -> name은 자바 빈 액션태그로 정한 id값. 

 -> property는 실제 해당 Bean클래스의 속성명

 -> value는 넣어줄 값.

value도 자바코드로 작성이 되는데 저것도 간단하게 줄이는 방법은 있으나 굳이 적진않게씀.

 

표현언어(EL, Expression Language)와 JSTL

JSP의 표현식에는 자바 변수나 여러가지 자바코드로 된 식을 사용하는데, 표현식의 자바코드가 복잡해짐에 따라

JSP2.0부터는 자바 코드로 추렭하는 표현식을 대체하기 위해 표현 언어라는 것이 등장.

 -> JSP페이지에서 표현언어를 사용하려면 페이지 디렉티브 태그의 속성인 isELIgnored를 false로 설정.

 

표현언어의 특징은 다음과 같다

 - 기존 표현식보다 편리하게 값을 출력하며 변수와 여러가지 연산자를 포함할 수 있다.

 - JSP의 내장 객체에 저장된 속성 및 자바의 빈 속성도 표현 언어에서 출력가능.

 - 표현언어 자체 내장 객체도 제공된다.

 - 형식 : ${표현식 OR 값}

 

<%@ page language="java" 
	contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"
    import="java.util.*"%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 테스트</title>
</head>
<body>
	\${10 + 10} : ${10+10 } <br>
	\${10 * 10} : ${10*10 } <br>
	\${10 / 2}  : ${10/2 }  <br>
	\${10 == 10} : ${10==10 } <br>
	\${"hello" == "hello"} : ${"hello" == "hello"} <br>
	\${100 <= 10} : ${100 <= 10 } <br>
	\${(10 == 10) && (20 == 20))} : ${(10==10)&&(20==20)} <br>
</body>
</html>

또한 empty연산자와 같이 자바 빈의 속성 값이 설정되어있는지, 혹은 List,Map같은 객체에 값이 존재하는지를 판단하는 연산자도 있다.

 

JSP 표현언어의 내장객체

 

내장 객체

- 표현 언어에서는 효율적으로 JSP와 상호작용하도록 다음과 같은 내장 객체를 지원한다

내장 객체 기능
pageScope page 범위에 포함된 속성 값에 접근할 수 있는 객체
requestScope request 범위에 포함된 속성 값에 접근할 수 있는 객체
 sessionScope  session 범위에 포함된 속성 값에 접근할 수 있는 객체
applicationScope application 범위에 포함된 속성 값에 접근할 수 있는 객체
param request.getParameter(“xxx”)로 얻을 수 있는 값들 ${param.xxx} 처럼 사용
paramValues request.getParameterValues(“xxx”) 와 동일 기능 수행 ${paramValues.xxx} 처럼 사용
header request.getHeader 메소드를 호출한 것과 동일하며 요청 헤더 이름의 정보를 단일값으로 반환
headerValues request.getHeader() 메소드를 호출한 것과 동일하며 요청 헤더 이름의 정보를 배열로 반환
Cookies 쿠키 이름의 값을 반환

 

표현식에서 getParameter를 이용하려면 자바코드에서 getParameter값을 가져오고, 표현식에서 출력을 했다면

표현 언어에서는 다음과 같이 작성가능

<%@ page language="java" 
	contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"
    import="java.util.*"%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 테스트</title>
</head>
<body>
	<p> 아이디 : ${param.id} </p>
</body>
</html>

매우 간단해진다.

 

빈 객체에 대한 접근도 간단해짐. ${빈이름.속성이름}

 <%
 	request.setCharacterEncoding("UTF-8");
 %>
 
<jsp:useBean id="m" class="sec01.ex01.MemberBean" />
<!-- proprty="*"는 전송된 회원 정보를 빈의 속성에 모두 설정 -->
<jsp:setProperty name="m" property="*"/> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 테스트</title>
</head>
<body>
	<p> 아이디 : ${m.id} </p>
	<p> 비번 : ${m.pwd} </p>
	<p> 이름 : ${m.name} </p>
	<p> 이메일 : ${m.email} </p>
</body>
</html>

(MemberBean클래스에는 빈의 특징으로 id,pwd,name,email필드와 getter,setter를 가짐)

이러한 정보는 쿼리파라미터보다는 http 바디에 담아서 보내는게 좋겠다.

 

Collection 객체의 사용도 가능하다.

 -> ${Collection객체이름[index].속성이름 }

 

ArrayList를 사용해보자.

<%@ page language="java"

contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"

isELIgnored="false"

import="java.util.*, sec01.ex01.*"%>

 

<%

request.setCharacterEncoding("UTF-8");

%>

 

<jsp:useBean id="m" class="sec01.ex01.MemberBean" />

<!-- proprty="*"는 전송된 회원 정보를 빈의 속성에 모두 설정 -->

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

<jsp:useBean id="membersList" class="java.util.ArrayList" />

 

<%

MemberBean m2 = new MemberBean();

m2.setId("son");

m2.setPwd("1234");

m2.setName("손흥민");

m2.setEmail("son@test.com");

membersList.add(m);

membersList.add(m2);

%>

 

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP 테스트</title>

</head>

<body>

<p> 아이디 : ${membersList[0].id} </p>

<p> 비번 : ${membersList[0].pwd} </p>

<p> 이름 : ${membersList[0].name} </p>

<p> 이메일 : ${membersList[0].email} </p>

 

 

<p> 아이디 : ${membersList[1].id} </p>

<p> 비번 : ${membersList[1].pwd} </p>

<p> 이름 : ${membersList[1].name} </p>

<p> 이메일 : ${membersList[1].email} </p>

</body>

</html>

m2객체는 직접생성해서 넣어줌.

출력

 

useBean은 좁게는 bean객체를 생성하는것이지만, 넓게는 객체자체를 생성한다고 생각하면 편하다.

 

스코프 우선순위

request,session,application등 내장 객체에 데이터를 바인딩해서 다른 jsp로 포워딩할 때 속성이름이 같은경우 jsp에는 각 내장객체에 지정된 출력 우선순위에 따라 순서대로 속성에 접근한다.

 

우선순위 : page > request > session > application 순으로 찾게되니 주의.

 

커스텀 태그 및 JSTL

앞에서 구현한 JSP페이지의 기능을 보면 액션태그나 표현언어를 쓰더라도 자바코드가 조금씩 쓰이고 있다.

이러한 자바코드까지 제거하기 위해 JSTL,커스텀 태그를 이용하게 된다.

 

커스텀 태그의 종류

 - JSTL(JSP Standard Tag Library) : JSP 페이지에서 가장 많이 사용하는 기능을 태그로 제공하며, JSTL 라이브러리를 따로 설치해 사용.

 - 개발자가 만든 커스텀 태그 : 개발자가 필요에 의해 만든 태그

 

JSTL은 따로 설치해야한다

설치후 WEB-INF/lib에 추가해준다.

 

이제 변수 선언, 조건식, 반복분등의 기능을 대체하는 태그를 지원해주는 Core 태그 라이브러리부터 살펴본다.

 -> 사용전 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core " %> 를 추가해 톰캣에 알려주어야함.

기능 분류  태그  설명 
 변수지원  set  JSP에서 사용할 변수를 설정한다. 
 remove   설정한 변수를 초기화한다. 
 흐름제어  if   조건에 따라 내부 코드를 실행한다.
 choose   다중 조건을 처리할 때 사용된다. (switch문)
 forEach   컬렉션이나 Map의 각 항목을 처리할 때 사용한다. 
 forTokens   구분자로 분리된 각가의 토큰을 처리할 때 사용된다. 
 URL처리  import   URL을 사용하여 다른 자원의 결과를 삽입한다. 
 redirect`   지정한 경로로 리다이렉트 한다. 
 url   URL을 재작성한다. 
기타 태그   catch   익셉션을 처리할 때 사용한다. 
 out   JSPWriter에 내용을 출력한다. 
<%@ page language="java" 
	contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"
    import="java.util.*, sec01.ex01.*"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%
 	request.setCharacterEncoding("UTF-8");
 %>
 
 <c:set var="id" value="hong" scope="page" />
 <c:set var="pwd" value="1234" scope="page" />
 
 <%
 	List dataList = new ArrayList();
 	dataList.add("Hello");
 	dataList.add("World!");
 %>
 
 <!-- 표현언어에서 사용할 수 있도록 c:set태그를 이용해 변수에 dataList할당 -->
 <c:set var="list" value="<%=dataList %>"/>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 테스트</title>
</head>
<body>
	<c:forEach var="i" begin="0" end="<%= dataList.size() %>" step="1" varStatus="loop">
		${list[i]} <br>
	</c:forEach>

	<c:forEach var="listData" items="${list}">
		${listData} <br>
	</c:forEach>

	<c:if test="${id =='hong' }">
		<h1>아이디가 hong입니다.</h1>
	</c:if>

	<c:choose>
		<c:when test="${empty pwd}">
			<h2>pwd가 null입니다.</h2>
		</c:when>
		<c:when test="${pwd=='1234'}">
			<h2>pwd가 동일합니다.</h2>
		</c:when>
		<c:otherwise>
			<h2>pwd가 틀립니다. 입력한 pwd : ${pwd} </h2>
		</c:otherwise>
	</c:choose>
</body>
</html>

간단하게 변수선언과 if태그, choose태그,foreach 태그를 이용해보았다.

반응형

'웹프로그래밍 > JSP_Servlet' 카테고리의 다른 글

톰캣 프로젝트 Add 안되는경우  (0) 2023.10.25
모델2(MVC) 방식 작업  (0) 2023.08.13
JSP  (0) 2023.08.11
서블릿에서의 쿠키와 세션  (0) 2023.08.10
서블릿(Servlet) - 2  (0) 2023.08.07
Comments