JSF 2.0 بصورت پیش فرض دارای مجموعه آبجکتهایی میباشد که می توان آنها را با استفاده از زبان Expression Language مستقیما در صفحات JSF فراخوانی نمود. نام این آبجکتها یکتا بوده و شما نمی توانید آبجکتهایی دیگری در برنامه های خود همانند آنها و به اسامی آنها ایجاد و تعریف نمائید.
این آبجکتها را میتوان بصورت زیر خلاصه نمود :
 

  • facesContext: آبجکتی برای دسترسی مستقیم به یک نمونه از کلاس FacesContext.
  • application: آبجکتی برای دسترسی مستقیم به کلاس ServletContext یا PorletContext.
  • session: آبجکتی برای دسترسی مستقیم به HttpSession یا PortletSession.
  • view: آبجکتی برای دسترسی مسقیم به کلاس UIViewRoot صفحه.
  • request: آبجکتی برای دسترسی مستقیم به ServletRequest یا PortletRequest
  • applicationScope: این آبجکت از نوع کلاس Map بوده و با استفاده از آن می توان به تمام Attribute های تعریف شده در فضای حافظه ای @ApplicationScoped دسترسی پیدا کرد.
  • sessionScope: این آبجکت از نوع کلاس Map بوده و با استفاده از آن می توان به تمام Attribute های تعریف شده در فضای حافظه ای @SessionScoped دسترسی پیدا کرد.
  • viewScope: این آبجکت از نوع کلاس Map بوده و با استفاده از آن می توان به تمام Attribute های تعریف شده در فضای حافظه ای @ViewScoped دسترسی پیدا کرد.
  • requestScope: این آبجکت از نوع کلاس Map بوده و با استفاده از آن می توان به تمام Attribute های تعریف شده در فضای حافظه ای @RequestScoped دسترسی پیدا کرد.
  • param: این آبجکت از نوع کلاس Map بوده و با استفاده از آن می توان به تمام پارامترهای موجود در آبجکت request دسترسی پیدا نمود. (اولین مقدار تخصیص یافته به پارامترها).به پارامترهای تعریف شده در آبجکت request اصطلاحاً request parameter گفته میشود.
  • paramValues: این آبجکت از نوع کلاس Map بوده و شامل آرایه ای از نوع String[] میباشد. این آرایه شامل تمام مقادیر موجود در Request Parameter میباشد.
  • Header: این آبجکت از نوع کلاس Map بوده و شامل تمام پارامترهای آبجکت HTTP میباشد.(اولین مقدار تخصیص یافته به پارامترها)
  • headerValues: این آبجکت از نوع کلاس Map بوده و شامل آرایه ای از نوع String[] میباشد. این آرایه شامل تمام مقادیر موجود در HTTP Parameter میباشد.
  • initParam: این آبجکت از نوع کلاس Map بوده، وشامل پارامترهای تعریف شده برای اجرای برنامه Web میباشد.
  • cookie: این آبجکت از نوع کلاس Map بوده، و شامل زوج مرتب name/value از cookie های ایجاد شده جهت درخواست فعلی برنامه میباشد.
  • flash: این آبجکت از نوع کلاس Map بوده، و شامل اطلاعاتی است که میخواهید به صفحه دیگری ارجاع دهید. از این آبجکت بیشتر در @RequestScoped استفاده میشود.
  • resource: این آبجکت از نوع کلاس Map بوده، و شامل resource های تعریف شده در برنامه میباشد.
  • component: آبجکتی است که با استفاده از آن می توان به کلاس UIComponent کامپوننت فعلی دسترسی پیدا نمود.
  • cc: آبجکتی بای دسترسی به Composite Component.
     

نحوه استفاده از این آبجکتها بسیار ساده و هیچ تفاوتی با نحوه فراخوانی کلاسهای معمولی جاوا در صفحات JSF ندارد(با استفاده از دستورات Expression Language).


مثال اول: صفحه JSF زیر را در نظر بگیرید :


<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
   <h:head>
      <title>Welcome</title>
   </h:head>
   <h:body>
      <p><b>header['User-Agent']</b>:  #{header['User-Agent']}</p>
      <p><b>header['Referer']</b>:  #{header['Referer']}</p>
      <p><b>cookie['JSESSIONID'].value</b>: #{cookie['JSESSIONID'].value}</p>
   </h:body>
</html>


خروجی این صفحه بصورت زیر میباشد :


header['User-Agent']: Mozilla/5.0(Windows NT 6.1;WOW64; rv:16.0)Gecko/20132403 FireFox/16.0


header['Referer']: http://localhost:8080/test/index.xhtml


cookie['JSESSIONID'].value: C10B3354D25698F10159786CA9D
 

مثال دوم: کلاس ManagedBean و صفحه JSF زیر را در نظر بگیرید. این کلاس دارای یک Property بنام name بوده که به یک کامپوننت h:inputText در صفحه JSF متصل شده است. کدهای این کلاس و صفحه JSF بصورت زیر میباشد :

 

import java.io.Serializable;
 
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
 
@ManagedBean(name = "user")
@SessionScoped

public class UserBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name = "";
 
    public String welcome(){
    System.out.println(this.name);
    }
    
    public String getName() {
        return name;
    }
    public void setName(String newValue) {
        name = newValue;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
   <h:head>
      <title>Welcome</title>
   </h:head>
   <h:body>  
      <h:form prependId="false">
         <h3>Please Enter:</h3>
         <table>
            <tr>
               <td>Please Enter name:</td>
               <td><h:inputText value="#{user.name}" id="name"/></td>
            </tr>
         </table>
        <p>
              <h:commandButton value="Welcome"  action="#{user.welcome}"/></p>
      </h:form>
   </h:body>
</html>

 

همانطور که مشاهده میکنید فیلد name از کلاس UserBean با استفاده از دستور {user.name}# به کامپوننت h:inputText متصل شده است. در این صفحه با اجرای دستور welcome صفحه به, welcome.xhtml سابمیت شده و فیلد name متناسب با مقدار وارد شده توسط کاربر مقداردهی میگردد.
حال اگر بخواهید از این فیلد(name) در صفحه (welcome.xhtml) استفاده نمائید، میتوانید از دستور {param.name}#  همانند کدهای زیر استفاده کنید:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
   <h:head>
      <title>Welcome</title>
   </h:head>
   <h:body>
      <h3>Welcome to #{param.name} !</h3>
   </h:body>
</html>

 

البته به علت اینکه ManagedBean تعریف شده در این مثال از نوع @SessionScoped میباشد، میتوان بجای دستور {param.name}# از دستور {user.name}# استفاده نمود.


نکته: دستور {param.name}# دقیقا به کامپوننتی ارجاع داده میشود که دارای یک ID بنام name است. اگر در کدهای فوق مقدار خاصیت ID کامپوننت h:inputText به lastname تغییر کند، دستور #{param.name} هیچ مقدار در خروجی چاپ نخواهد کرد.

 

مثال سوم : به دستور زیر توجه نمائید:


<h:inputText value=”#{bean.value}”  styleClass=”#{component.valid ? ‘’ : ‘error’}” />


در دستور فوق آبجکت {component}# در کامپوننت h:inputText به کلاس UIInput کامپوننت فعلی ارجاع داده شده و متد ()isValid از کلاس UIInput را بررسی میکند. هنگامی که صفحه به سرور Submit میشود، اگر هیچ خطایی در validate نموده کامپوننت(مانند خالی نبودن آن و ...) رخ ندهد، استایل کامپوننت بدون تغییر باقی خواهد ماند، ولی اگر validation کامپوننت بدرستی صورت نپذیرد استایل آن تغییر خواهد کرد.(استایل error. به آن تخصیص داده میشود). کدهای استایل error بصورت زیر میباشد:

.error {
    Background-color:red;
}

 

مثال چهارم: آبجکت {resource}# عموما در فایلهای استایل (CSS)  مورد استفاده قرار میگیرد. در دستور زیر استایلی تعریف شده است که عکس مورد نظر را از دایرکتوری layout از شاخه resources فراخوانی میکند.

.someClass{
    Background-image: url(“#{resource[‘layout:images/foo.png’]}”)
}
 

توجه داشته باشید که تصویر foo.png در دایرکتوری images بصورت زیر در برنامه قرار داده شده است :

WebContent/resources/images/foo.png