'useBean'에 해당되는 글 1건

  1. 2009.09.02 스터디 09/05(JSP&Servlet forward, useBean, property) by 대절님

//forward Actino tag
정의 : RequestDispatcher를 이용 forward방법과 동일(동일한 리퀘스트를 넘겨줌), forward할때 파라미터를 이용하여 요청할수 있다.
<jsp:forward page='forward할 jsp페이지'/>
예제) forward

*hendelt.jsp
<form action='hello.jsp' method='get'>
 <input type='text' name='userName'>
 <input type='submit'>
</form>

*hello.jsp
<%
  String name = request.getParameter('userName');
  if(name.length() == 0){
%>
  <jsp:forward page='handelt.jsp'/>
<% 
}
%>
<%= name %>

a)userName에 값이 입력되어있으면 출력 없으면 다시 hendlt.jsp로

예제) param 파라미터를 이용해서 넘겨줄때
*handelt.jsp
<%
  String mesg = request.getParameter('mesg');
  if(mesg != null){
%>
<%=mesg%>
<%
  }
%>

*hello.jsp
<%
  String mesg = '값없음';
  String name = request.getParameter('userName');
  if(name.length() == 0 {
%>
<jsp:forward page='handelt.jsp'>
  <jsp:param name='mesg' value='<%=mesg%>'/>
</jsp:forward>
<%
  }
%>
<%= name %>

//userBean Action tag
정의 : 자바빈 객체를 생성/사용하기 위한 태그
자바빈 : 특정한 작업을 독립적으로 수행하는 컴포넌트, J2EE에서는 EJB, JSP 자바빈으로 구분

자바빈 작성규칙 :
-attribute(속성=property) 와 set/get메소드를 갖는다.
-attribute와 set/get메소드 이름이 일치한다.
-메소드의 첫글자는 반드시 대문자 setName()~
-인자없는 생성자를 갖는다.
-No public attribute를 갖는다.(property는 private로)
-직렬화 객체 반드시 serializable을 구현해야함

용도 : 폼태그를 가진 html에서 jsp로 폼데이터를 전송할때 자바빈을 이용하면 jsp에서 자바코드가 아닌 태그로 코드작성을 할수있음.

아키텍쳐 :
클라이언트 -> memberForm.html (폼에 값입력)
           -> member.jsp (넘어온 파라미터를 dao에 넘겨줌
           -> dao에서 DB와 접속한후 결과를 member.jsp에 넘겨줌
           -> member.jsp에서 클라이언트에게 response를 보내줌

예) 자바빈 사용전

<form method=post action=member.jsp>
~~~~
</form>

*member.jsp
<%
request.setChracterEncoding('euc-kr');
String name = request.getParameter('name');
String age = request.getParameter('age');
MemberTO m = new MemberTO(name, age);
MemberDAO mDAO = new MemberDAO();
mDAO.insertMember(m);
ArrayList list = mDAO.showMember();
%>
<table>
  <tr>
   <th>이름</th><th>나이</th>
  </tr>
<%
  <tr>
   <td><%=name%></td><td><%=age%></td>
  </tr>
%>

*MemberTO.java
private name, age;
public MemberTO(String name, String age){
  this.name = name;
  this.age = age;
}
set(), get()

*MemberDAO.java
public class MemberDAO{
  private DataSource dataFactory;
  public MemberDAO{
    Context ctx = new InitialContext();
    dataFactory = (DataSource)ctx.lookup('java:comp/env/jdbc/Oracle9i");
  }
  public void insertMember(MemberTO m){
    Connect con =dataFactory.getConnection();
    Statement stmt = con.createStatement();
    String name = m.getName();
    String age = m.getAge();
    String query = 'INSERT INTO member VALUES (";
      query = query + " " + name+ ", ";
      query = query + " " + age;
    stmt.executeUpdate(query);
    stmt.close();
    con.close();
  }
  public ArrayList showMember(){
    ArrayList list = new ArrayList();
  Connection con = dataFactory.getConnection();
  Statement stmt = con.createStatement();
  String query = "SELECT * FROM member";
  ResultSet rs = stmt.executeQuery(query);
  while(rs.next()){
    String name = rs.getString('name');
    String age = rs.getString('age');
  MemberTO domain = new MemberTO(name, age);
    list.add(domain);
  }
  rs.close();
  stmt.close();
  con.close(); 
  return list;
  }
}

예제) 자바빈 사용후
useBean태그로 자바빈 생성
scope는 page, request, session, application 4가지 default=page;
<jsp:useBean id='빈참조변수' class='패키지를 포함한 자바빈' scope='4가지scope중하나'/>

*member.jsp
<%
  request.setChracterEncoding('euc-kr');    //useBean액션태그를 사용하기 전에 인코딩을 결정해야 한글안깨짐
%>
<jsp:useBean id='m' class='test.web.MemberBean'/>
<jsp:setProperty name='m' property='name' param='name'/>                 //<--value='<%=request.getParameter('name')%>
<jsp:setProperty name='m' property='age' param='age'/>    //value='<%=request.getParameter('age')%>
                           //%param생락가능 : HTML의 파라미터 이름과 자바빈의 속성명이 같으면 생략가능하다.
         //HTML과 자바빈이 모두 동일하면 property값을 *로 수정가능
          // --> <jsp:setProperty name='m' property='*'/>
<%
  ~~DB 작업
%>

<table>
 ~~
 <tr>
   <td><jsp:getProperty name='m' property='name'/></td>
   <td><jsp:getProperty name='m' property='age'/></td>
 </tr>
</table>

 

예)useBean Action tag Scope
*ScopeTest.java
public class ScopeTest{
  public ScopeTest(){
    sout('인스턴스생성');
  }
}

*~~.jsp  4개
<jsp:useBean id='scopeTest' class='test.web.ScopeTest' scope='page'/>  
<jsp:useBean id='scopeTest' class='test.web.ScopeTest' scope='request'/>
<jsp:useBean id='scopeTest' class='test.web.ScopeTest' scope='session'/>
<jsp:useBean id='scopeTest' class='test.web.ScopeTest' scope='application'/>

a)브라우저를 2개이상열고 각페이지를 요청하면
page, request의 경우 리프레시 할때마다 인스턴스생성
session의 경우 동일한 브라우저는 맨처음만 인스턴스 생성
application의 경우 처음요청한 브라우저에서만 인스턴스 생성

Posted by 대절님

댓글을 달아 주세요