bdfgdfg
JSP - 2 본문
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 |