* __번역 및 수정자__ : 이동국
* __e-mail__ : [fromm0@gmail.com|mailto:fromm0@gmail.com]
* __msn__ : [fromm0@hotmail.com|mailto:fromm0@hotmail.com]

<div class="note"> 
<b>Note</b> 이 글은 struts-faces의 특정버전에서 테스트 되었습니다. 
struts-faces가 아직 정식버전이 나오지 않았으므로. 어떤버전에서 다르게 작동할지 알수 없습니다. 
이점 양해하지고 보시기 바랍니다.
</div>

!! JavsServer Faces

Sun사의 [JSF페이지|http://java.sun.com/j2ee/javaserverfaces/]에서 자세한 정보를 알수 있다. 

현재 1.2버전이 최신버전이고 웹애플리케이션을 위한 UI 프레임워크이다. 

관련 셋팅 파일은 web.xml, faces-config.xml등이 있다. 
관련 lib는 jsf-api.jar, jsf-ri.jar, jstl.jar, standard.jar, commons-beanutils.jar, commons-digester.jar, commons-collections.jar, commons-logging.jar등의 jar파일을 /WEB-INF/lib 밑에 두면된다. 

!! Struts Faces

아파치에서 정식으로 할당된 페이지는 없고 [다운로드페이지|http://cvs.apache.org/builds/jakarta-struts/nightly/struts-faces/]에서 최신버전을 다운로드 할수 있다. 짐작하겠지만 정식 릴리즈된 버전은 없다.

JSF request를 Struts프레임워크에 연결을 시키기 위한 라이브러리이고 이번에 Struts가 8개의 하위프로젝트로 나뉘면서 아마 Faces프로젝트로 옮겨지는거 같다(완전한 개인적 추측이다).

struts-faces.jar 라는 이름의 jar파일을 /WEB-INF/lib밑에 두면된다. 

!! WEB.xml에 셋팅하기
[{Java2HtmlPlugin

<context-param>
<param-name>javax.faces.application.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
…………………………
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/ *</url-pattern>
</servlet-mapping>
……………………
<taglib>
<taglib-uri>/tlds/struts-faces</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-faces.tld</taglib-location>
</taglib>
}] \\

__ web.xml에서의 JSF관련셋팅을 보여주고 있다. __

# javax.faces.application.CONFIG_FILES는 JSF의 셋팅 파일을 지정하는 부분이다. 
# Faces Servlet는 JSF요청을 javax.faces.webapp.FacesServlet가 처리를 하겠다 뭐 그정도.
# /faces/* 라는 값은 /faces/다음에 오는 모든 요청을 JSF요청으로 인식을 하겠다는 것이다. 

!! faces-config.xml 셋팅하기
[{Java2HtmlPlugin

<faces-config xmlns="http://java.sun.com/JSF/Configuration">
  <managed-bean>
    <managed-bean-name>LoginServer</managed-bean-name>
    <managed-bean-class>net.sarang.gikim.jsf.LoginServer</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <navigation-rule>
    <from-view-id>/login.jsp</from-view-id>
    <navigation-case>
      <from-action>#{LoginServer.loginAction}</from-action>
      <from-outcome>success</from-outcome>
      <to-view-id>/success.jsp</to-view-id>
    </navigation-case>
……………………
  </navigation-rule>
  <navigation-rule>
    <from-view-id>/success.jsp</from-view-id>
    <navigation-case>
      <from-outcome>return</from-outcome>
      <to-view-id>/login.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
</faces-config>
}] \\

__ 실질적인 JSF셋팅 파일인 faces-config.xml이다. __ 

JSF를 사용할때는 가장 기본적으로 managed-bean과 navigation-rule를 알아야 한다. 
struts사용자라면 managed-bean은 ActionForm과 Action객체를 합쳐놓은 것과 비슷(?)하다고 일단 이해하면 된다. navigation-rule은 ActionForward와 비슷하다고 생각하면 크게 이해에 무리가 되는 부분은 없다고 개인적으로 생각을 한다. 

# managed-bean에는 name과 해당 class 그리고 범위를 지정해 주어야 한다. 즉 여기선 net.sarang.gikim.jsf.LoginServer라는 클래스가 managed-bean의 기능을 담당한다. 물론 jsp페이지에서 해당 클래스로 접근할때는 LoginServer라는 이름으로 접근하게 된다. 
# navigation-rule에는 from-view-id와 navigation-case두가지 값을 기본적으로 설정해주어야 하고 navigation-case에는 하위로 from-action, from-outcome와 to-view-id값을 주어야 한다. 
# from-view-id의 값은 대략 요청을 보낸 jsp를 지정해 주고 from-action은 managed-bean에서 처리를 하고 응답을 날린경우에 사용이 되고 from-outcome는 struts의 ActionForward의 name정도고 to-view-id는 struts의 ActionForward의 forward path이다. 

!! struts-config.xml 셋팅하기.
[{Java2HtmlPlugin

<?xml version="1.0" encoding="EUC-KR" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <form-beans>
    <!-- Registration form bean -->
    <form-bean name="loginForm" type="net.sarang.gikim.login.bean.LoginBean"/>
  </form-beans>
  <action-mappings>
    <action path="/login" type="net.sarang.gikim.login.control.LoginAction"
               name="loginForm“ scope="request“ validate="false">
      <forward name="failure"              path="/faces/fail.jsp"/>
      <forward name="success"              path="/faces/success.jsp"/>
      <forward name="login"              path="/faces/login2.jsp"/>
    </action>
  </action-mappings>
  <controller>
    <set-property property="processorClass"
       value="org.apache.struts.faces.application.FacesRequestProcessor"/>
  </controller>
</struts-config>
}] \\

!! index.jsp
[{Java2HtmlPlugin

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head>
<title>
index
</title>
</head>
<body bgcolor="#ffffff">

<a href="faces/login2.jsp">click..</a>

</body>
</html>
}] \\

__실제 JSF request를 위해서 web.xml에 설정된 데로 /faces/jsp파일명으로 지정한다.__ 


!! login.jsp
[{Java2HtmlPlugin

<%@page contentType="text/html; charset=EUC-KR"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="/tlds/struts-faces" prefix="s"%>
<f:view>
<s:html locale="true">
  <head>
    <title>login</title>
  </head>
<body bgcolor="#ffffff">
  <s:form action="/login" focus="host">
    <h:inputText id="userid" size="15" required="true" value="#{LoginServer.userid}" /><br>
    <h:inputText id="password" size="15" required="true" value="#{LoginServer.password}" /><br>
    <h:commandButton id="submit" type="submit" value="Do login" />
  </s:form>
</body>
</s:html>
</f:view>
}] \\

# inputText에서 value부분은 Managed bean인 클래스의 userid와 password를 화면에 표시한다.
# form의 action부분에 struts처럼 xx.do형태로 쓰면 에러가 발생하였다. .do를 뺀다. 

!! Managed Bean(LoginServer.java)
[{Java2HtmlPlugin

package net.sarang.gikim.jsf;

public class LoginServer extends Object {
    private String userid;
    private String password;

    public LoginServer() {
   }
    public void setUserid(String userid) {
        this.userid = userid;
    }
……………
    public String getPassword() {
        return password;
    }
    public String loginAction(){
        if( userid.trim().equals("scott") && password.trim().equals("tiger") ){
            return "success";
        }else{
            return "fail";
        }
    }
}
}] \\

# loginAction()에서 로직 처리후. return하는 부분은 Navigation rule에 의해 처리된다.
# success는 success.jsp로 이동하게 한다.

!! Struts Action Class(LoginAction.java)
[{Java2HtmlPlugin

package net.sarang.gikim.login.control;
……………………….
public class LoginAction extends Action {
    public LoginAction() { }

    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) {
        LoginBean currentForm = (LoginBean) form;
        
        Login loginobj = new Login();
        loginobj.setId("fromm0");
        loginobj.setPasswd("ccc");

        currentForm.setLogin(loginobj);
        if( loginobj.getId().trim().equals("fromm0") ){
        	return mapping.findForward("success");
        }else{
        	return mapping.findForward("fail");
        }        
    }
}
}] \\

!! success.jsp
[{Java2HtmlPlugin

<%@page contentType="text/html; charset=EUC-KR"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="/tlds/struts-faces" prefix="s"%>

<f:view>
<s:html locale="true">
  <head>
    <title>success</title>
  </head>
  <body bgcolor="#ffffff">
      <s:form action="/return" focus="host">
      <h:outputLabel value="#{loginForm.login.id}" />유저가 로그인했습니다.
      <h:commandButton value="Back to Login Page" action="return"></h:commandButton>
      </s:form>
  </body>
</s:html>
</f:view>
}] \\

# outputLabel부분에 value인 #{loginForm.login.id}은 Struts Action에서 넘겨진 ActionForm의 Login객체에서 id값을 표시한다.
# commandButton의 action의 값인 return은 Login.jsp페이지로 이동하게 한다.