در JSF از چهار روش برای ارسال پارامتر به کلاس های Bean می توان استفاده نمود :

  • استفاده از تگ f:param
  • استفاده از تگ f:attribute
  • استفاده از تگ f:setPropertyActionListener
  • روش Method Expression (یکی از قابلیتهای جدید تعریف شده در JSF 2.0)
  • استفاده از تگ f:viewParam

برای آشنایی بیشتر با این روشهای، هر کدام را با یک مثال برای شما توضیح خواهم داد.

استفاده از تگ f:param

این تگ در حقیقت یک Request Parameter ایجاد کرده که برای دسترسی به مقدار ذخیره شده در آن می توان از دستوراتی بصورت زیر استفاده نمود :

<h:commandButton action="#{user.editAction}">

               <f:param name="test" value="delete" />

</h:commandButton>

 

در دستور فوق ما یک پارامتر بنام test ایجاد کرده که مقدار پیش فرض آن عبارت delete میباشد. حال برای استفاده از این پارامتر در backing bean با یک کلاس Bean از همانند زیر ایجاد و از دستور getRequestParameterMap() استفاده نمائید:

@ManagedBean(name="user")
@SessionScoped
public class UserBean{
 
    public String editAction() {
 
      Map<String,String> params =  FacesContext.getExternalContext().getRequestParameterMap();
      String action = params.get("test");
          //...
    }
}
 

از f:param در سایر کامپوننت ها نیز می توانید استفاده نمائید. به عنوان مثال دستورات زیر را در نظر بگیرید:

 

<h:outputFormat value="Hello,{0}. You are from {1}.">
    <f:param value="JSF User" />
    <f:param value="Iran" />
</h:outputFormat>
 

در دستور فوق کامپوننت h:outputFormat دارای دو پارامتر بوده که با شماره ایندکس در عبارت value مشخص شده اند، که برای مقداردهی آنها از تگ f:param استفاده شده است. ترتیب مقدار پارامترها دقیقا با نحوه چینش تگ f:param متناسب میباشد.

نکته: میتوان تگ f:param را توسط فیلدهای کلاس Bean نیز مقداردهی نمود.

نکته :

برای فراخوانی Request Parameter ها (که توسط f:aparam ایجاد می شوند) در کلاس Bean می توانید از علامت @ManagedProperty بصورت زیر نیز استفاده نمائید :

 

@ManagedBean
@RequestScoped
public class RequestBean {
    @ManagedProperty(value="#{param.id}")
    private Integer id;
}
 

فقط به این نکته توجه داشته باشید که حافظه مورد استفاده برای کلاس Bean در این باید از نوع @RequestScoped باشد. (اگر میخواهید از این روش برای @ViewScoped استفاده نمائید، می توانید کلاسی برای دریافت مقدار پارامترها همانند کلاس فوق تعریف نموده و سپس کلاس فوق را در یک Bean دیگر Inject نمائید).

 

استفاده از تگ f:attribute

روش استفاده از تگ f:attribute همانند تگ f:param بوده با این تفاوت که برای فراخوانی آن در کلاس backing bean باید از متد getAttributes() استفاده نمائید. دستورات زیر نحوه استفاده از این تگ را برای ارسال پارامتر نشان میدهد:

 

<h:commandButton action="#{user.editAction}" actionListener="#{user.attrListener}">
    <f:attribute name="test" value="delete" />
</h:commandButton>

@ManagedBean(name="user")
@SessionScoped
public class UserBean{
 
  String action;

  public void attrListener(ActionEvent event){
    action = (String)event.getComponent().getAttributes().get("test");
  }
}
 

استفاده از تگ f:setPropertyActionListener

مزیت استفاده از این تگ نسبت به تگهای f:param و f:attribute در این میباشد که میتوانید توسط آن فیلدها  یا Property های کلاس Bean را مستقیماً در backing bean مقداردهی نمائید. دستورات زیر نحوه استفاده از آنرا نشان میدهد :

<h:commandButton action="#{user.editAction}" >
    <f:setPropertyActionListener target="#{user.action}" value="delete" />
</h:commandButton>

@ManagedBean(name="user")
@SessionScoped
public class UserBean{
 
    public String action;
 
    public void setAction(String action) {
        this.action = action;
    }
}
 

روش Method Expression

این روش یکی از روشهای جدیدی است که  JSF 2.0 اضافه شده است. با استفاده از این روش می توانید پارامترهای خود را مستقیماً به متدهای کلاس Bean بصورت فرمت کلی #{bean.method(param)} ارسال نمائید.

<h:commandButton action="#{user.editAction(delete)}" />

@ManagedBean(name="user")
@SessionScoped
public class UserBean{
 
    public String editAction(String id) {
      //id = "delete"
    }
 
}
 

استفاده از تگ f:viewParam

این تگ یکی از قابلیتهای جدید JSF 2.0 بوده که توسط آن میتوان در لود صفحه (رویداد load از تگ h:body) مقداری با به کلاس Bean ارسال نمود. برای استفاده از این تگ باید به سه نکته توجه داشته باشید :

  • اول اینکه این تگ فقط در load صفحه ایجاد و فراخوانی می گردد، در نتیجه نمیتوانید آنرا در بدنه سایر کامپوننت ها فراخوانی نمائید.
  • دوم اینکه باید این تگ در داخل بدنه تگ <f:metadata>اسفاده نمائید.
  • این تگ صرفا در کلاسهایی مورد استفاده قرار میگیرد که در حافظه @ViewScoped ایجاد شده باشند.

 

دستورات زیر نحوه ایجاد و استفاده از این تگ را در داخل صفحه JSF و فراخوانی آن در Backing Bean نشان میدهد.

 

<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:body>

    <f:metadata>
        <f:viewParam id="id" name="id" value="#{myBean.id}" />        
    </f:metadata>

    </h:body>
</html>

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

@ManagedBean
@ViewScoped
public class MyBean {

    Long id;

    public void actionMethod(ActionEvent event) {       
        System.out.println("action called");        
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
 

 در دستورات فوق فیلد Id از کلاس MyBean جهت استفاده از تگ f:viewParam تعریف شده است در نتیجه داشتن متد setter برای آن الزامی میباشد. در صورتی که می خواهید از این فیلد در جای دیگری از صفحه نیز استفاده نمائید،باید متد getter نیز برای آن تعریف نمائید.

نکته: در صورتی که روش Submit شدن فرم بصورت GET می باشد، از تگ f:viewParam برای ارسال مقادیر محرمانه استفاده نکنید، زیرا این تگ نام پارامتر را به همراه مقدار آن در آدرس URL صفحه نشان میدهد. به عنوان مثال آدرس URL دستورات فوق پس از Submit شدن بصورت زیر میباشد:

 

localhost:8080/mypayge?id= 1