Servlet-JSP

액션 태그

voider 2020. 9. 11. 22:38

액션 태그 <jsp: ... >

JSP는 비즈니스 로직과 화면 개발을 분리하려는 목적으로 개발되었다. 그러나 여전히 스크립트릿<%%>같은 녀석들이 HTML 영역을 침범했다. 방역하고 방역해도 죽지 않는 코로나처럼. 죽일 순 없으니 마스크라도 쓰자...는 마음으로 만들어진 것이 액션 태그다.

인클루드 액션 태그 jsp:include...

  1. 파라미터 인자로 받는 이미지 파일 이름을 읽어서 화면에 나타내는 jsp를 만든다.
  2. 1에서 만든 jsp를 다른 jsp들이 include 태그를 이용하여 재사용한다.

이런 방식의 장점은 자바 코드를 한 번만 쓰면, 남은 페이지에서 자바 코드를 쓸 일이 없다는 것이다.

1번 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setCharacterEncoding("utf-8");
    String name = request.getParameter("name");
    String imgName = request.getParameter("imgName");    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>8 BIT WALL-E</title>
</head>
<body>
<h1>이름은 <%=name %></h1>
</body><img src="/image/<%=imgName %>" />
</html>

자바코드 없이 include태그로 1번을 재사용하는 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>include1</title>
</head>
<body>
    <h1>폐허한 지구의 두 친구</h1>

    <jsp:include page="walleImage.jsp" flush="true">
        <jsp:param name='name' value='WallE'/>
        <jsp:param name='imgName' value='walle.png'/>
    </jsp:include>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>INCLUDE2</title>
</head>
<body>
    <h1>폐허한 지구</h1>
    <jsp:include page="/actionEx/walleImage.jsp" flush="true">
        <jsp:param name="name" value="eve"/>
        <jsp:param name="imgName" value="eve.png"/>
    </jsp:include>
</body>
</html>

만약 한글 이름을 전달하려면 request.setCharacterEncoding("utf-8")만 추가하면 된다.

포워드 액션 태그 <jsp:forward ...>

RequestDispatcher없이 포워딩할 수 있다.
아이디를 입력하지 않고 로그인 시, 포워딩하여 로그인 창에 에러 메세지를 띄우는 예제다.

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setCharacterEncoding("utf-8");
    //String msg = (String)request.getAttribute("msg");
    String msg = request.getParameter("msg");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward action tag</title>
</head>
<body>
<%
    if(msg != null) { %>
        <h1><%=msg %></h1>
<%    } %>
    <form action='/actionEx/result.jsp'>
        <input type='text' name='id' placeholder='ID...'><br>
        <input type='password' name='pwd' placeholder='PASSWORD...'>
        <input type='submit' value='LOGIN'>
    </form>
</body>
</html>

result.jsp

...
...
<body>
<%
    request.setCharacterEncoding("utf-8");
    String id = request.getParameter("id");
    if(id.length() == 0 || id == null) {
        //RequestDispatcher dispatch = request.getRequestDispatcher("/actionEx/login.jsp");
        //dispatch.forward(request, response);
        //request.setAttribute("msg", "아이디를 입력하세요.");
        String msg = "아이디를 입력하세요.";

%>
    <jsp:forward page='/actionEx/login.jsp' >
        <jsp:param name='msg' value='<%=msg %>' />    
    </jsp:forward>

<%    }//if%>

<h1>환영합니다. <%=id %>님!</h1>

</body>
  ...
  ...
  하략

보다시피 jsp:forward로 RequestDispatcher를 대신하고 있다.
jsp:param을 이용해 파라미터도 함께 전달할 수 있다.

useBean, setProperty, getProperty

이 세 가지 액션 태그로 객체 생성, 속성에서 값을 저장(setter)하거나 가져올(getter) 수 있다.

자바빈Java Bean

자바 빈은 JavaEE프로그래밍 시, 여러 객체를 거쳐 만들어지는 데이터를 저장/전달하는 데 사용한다. 자바의 DTO(Data Transfer Object,데이터 전송 객체) 또는 VO(Value Object,값 객체)와 같은 개념이라고 할 수 있다.

자바 빈 특징

  • 속성 접근 제어자는 private
  • 각 속성attribute, property은 각각 setter/getter를 가진다
  • setter/getter 이름 첫 글자는 반드시 소문자다
  • 기본 생성자를 반드시 가진다

자바 빈을 이용해서 회원가입 폼 데이터를 받아서 회원으로 등록하고,
전체 회원 목록을 출력하는 예제다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="pro13.sec01.*"
    import="java.util.*"
%>
<%
    request.setCharacterEncoding("utf-8");

    //회원 가입 페이지로부터 받은 데이터
    String id = request.getParameter("id");
    String pwd = request.getParameter("pwd");
    String name = request.getParameter("name");
    String email = request.getParameter("email");

    System.out.println("name : " + name);

    //위 데이터로 MemberBean객체를 만들어서 DB에 추가
    MemberBean bean = new MemberBean(id, pwd, name, email);
    MemberDAO dao = new MemberDAO();
    dao.addMember(bean);

    //모든 멤버 리스트를 불러온다.
    List<MemberBean> memberList = dao.memberList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원</title>
</head>
<body>
    <h1>회원 목록</h1>
    <table align='center' width='100%'>
        <tr align='center' bgcolor='#99ccff'>
            <td width='7%'>아이디</td>
            <td width='7%'>비밀번호</td>
            <td width='5%'>이름</td>
            <td width='11%'>이메일</td>
            <td width='5%'>가입일</td>
        </tr>
    <%
        if(memberList.size() == 0) {
    %>
        <tr>
            <td colspan='5'>
                <p align='center'><b><span style='font-size:9pt;'>
                등록된 회원이 없습니다.
                </span></b></p>
            </td>
        </tr>
    <%
        } else {
            for (int i = 0; i < memberList.size(); i++) {
                bean = memberList.get(i);
    %>
        <tr align='center'>
            <td>
                <%=bean.getId()%>            
            </td>
            <td>
                <%=bean.getPwd()%>            
            </td>
            <td>
                <%=bean.getName()%>            
            </td>
            <td>
                <%=bean.getEmail()%>            
            </td>
            <td>
                <%=bean.getRegdate()%>            
            </td>
        </tr>

    <%
        }
    }
    %>
    <tr height='1' bgcolor='#99ccff'>
        <td colspan='5'></td>
    </tr>
    </table>
</body>
</html>

이렇게 할 경우, 화면에 자바 코드가 섞이므로 복잡해진다.
<jsp:useBean ...>으로 자바 빈을 대체할 수 있다.

pro13.sec01.MemberBean member = new MemberBean();

이 자바 선언문과

<jsp:useBean id='memeber' class='pro13.sec01.MemberBean' scope='page'/>

이 태그는 완전히 같은 기능을 한다.
(scope의 속성으로는 page(기본),request,session,application이 있음)

useBean태그로 객체를 생성하고 setProperty와 getProperty를 이용해서 값을 저장하거나 불러올 수 있다.

member.setId("coco");
member.getId();

이 자바 코드와

<jsp:setProperty name='member' property='id' value='coco'/>
<jsp:getProperty name='member' property='id'/>

위 태그는 같은 기능을 한다.
name - useBean id속성으로 지정한 이름(member)
property - 값을 설정할 속성 이름(MemberBean의 변수 명)

자바 빈을 useBean태그로 모두 대체한 것이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="pro13.sec01.*" import="java.util.*"%> 
<%
    request.setCharacterEncoding("UTF-8");
%>

<jsp:useBean id='member' class='pro13.sec01.MemberBean' scope='page' />

<!-- 매개변수로 받은 데이터와 param과 이름이 맞는 것을 매칭해준다. param생략가능 -->
<jsp:setProperty name="member" property="id" param="id"/>
<jsp:setProperty name="member" property="pwd" param="pwd" />
<jsp:setProperty name="member" property="name" param="name" />
<jsp:setProperty name="member" property="email" param="email"/>

<%
    MemberDAO dao = new MemberDAO();
    dao.addMember(member);
    List<MemberBean> memberList = dao.memberList();
%>


<!-- 아이디가 'member'인 MemberBean객체를 만든다. -->


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>회원 목록</h1>
    <table align='center' width='100%'>
        <tr align='center' bgcolor='#99ccff'>
            <td width='7%'>아이디</td>
            <td width='7%'>비밀번호</td>
            <td width='5%'>이름</td>
            <td width='11%'>이메일</td>
        </tr>
        <tr align='center'>
            <td>
                <jsp:getProperty property="id" name="member"/>
            </td>
            <td>
                <jsp:getProperty property="pwd" name="member" />
            </td>
            <td>
                <jsp:getProperty property="name" name="member" />
            </td>
            <td>
                <jsp:getProperty property="email" name="member"/>
            </td>
        </tr>

    <tr height='1' bgcolor='#99ccff'>
        <td colspan='5'></td>
    </tr>
    </table>
</body>
</html>

놀라운 것은

<jsp:setProperty name="member" property="id" param="id"/>
<jsp:setProperty name="member" property="pwd" param="pwd" />
<jsp:setProperty name="member" property="name" param="name" />
<jsp:setProperty name="member" property="email" param="email"/>

이 부분을

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

이렇게 바꿀 수 있다는 것이다.
회원가입 폼에서 전송받은 매개변수의 name속성들과 member 빈 속성을 비교한 후에, 동일한 빈에 값을 자동으로 설정한다. 매우 놀랍다.

'Servlet-JSP' 카테고리의 다른 글

JSTL  (0) 2020.09.11
표현언어(EL, Expression Language)  (0) 2020.09.11
JSP😇  (0) 2020.09.11
서블릿 리스너  (0) 2020.09.11
Servlet Filter  (0) 2020.09.11