免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
托管 Bean 頁面?zhèn)髦档氖褂梅椒ê图记?/div>

最近開始學(xué)習(xí)JSF基礎(chǔ),發(fā)現(xiàn)比較重要的一點(diǎn),就是如何用編程方式訪問托管Bean??戳艘恍㎎SF的實(shí)例,不過大多都是用JSF1.1來實(shí)現(xiàn)的。雖然在JSF1.2的環(huán)境中也可以很好運(yùn)行,但是在編譯的時(shí)候會(huì)看到降級(jí)的消息。這里找了一些資料總結(jié)一下JSF1.1和JSF1.2訪問托管Bean的方法。

一、從JSF頁面?zhèn)鬟f參數(shù)給托管Bean
雖然利用h:commandLink 和h:commandButton組件,可以通過action和actionListener來觸發(fā)托管Bean中的方法,但是不能向這些方法中傳遞參數(shù)。對于動(dòng)態(tài)傳遞參數(shù),不是不可以實(shí)現(xiàn),這點(diǎn)可以通過使用f:attribute來實(shí)現(xiàn)。而且f:attribute也可以很好的和actionListener聯(lián)合使用。
例子:



<h:commandLink actionListener="#{myBean.action}">
        
<f:attribute name="attrname1" value="attrvalue1" />
        
<f:attribute name="attrname2" value="attrvalue2" />
        ...   
        
<h:outputText value="Click here" />
    
</h:commandLink>
    
    
<h:commandButton value="Press here" actionListener="#{myBean.action}">
        
<f:attribute name="attrname1" value="attrvalue1" />
        
<f:attribute name="attrname2" value="attrvalue2" />
        ...
    
</h:commandButton>

這些屬性可以通過父組件的getAttributes()方法取到,父組件可以通過傳遞給actionListener的ActionEvent實(shí)例取到



public void action(ActionEvent event) 
    
{   
        String attrvalue1 
= (String) event.getComponent().getAttributes().get("attrname1");
        String attrvalue2 
= (String) event.getComponent().getAttributes().get("attrname2");
        ...
    }

變量attrvalue1和attrvalue2包含從f:attribute set進(jìn)來的值。
另一個(gè)欠文雅的方式就是通過f:param組件來傳值,這個(gè)只是對h:commandLink起效。



<h:commandLink action="#{myBean.action}">
        
<f:param name="paramname1" value="paramvalue1" />
        
<f:param name="paramname2" value="paramvalue2" />
        ...
        
<h:outputText value="Click here" />
    
</h:commandLink>

這些參數(shù)可以通過FacesContext的getRequestParameterMap()方法取到。通過下面的方法,可以獲取任何寫在command塊中f:param的值。



public static String getFacesParamValue(String name) 
    
{   
        
return (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(name);
    }

上面的方法可以用在任何Bean的方法中。舉例



public void action() 
    
{   
        String paramvalue1 
= getFacesParamValue("paramname1");   
        String paramvalue2 
= getFacesParamValue("paramname2");   
        ...
    }

變量paramvalue1和paramvalue2包含從f:param set進(jìn)來的值。
不過要注意,屬性的名字要唯一,而且不能用其他組件的屬性名,比如:"id", "name", "value","binding", "rendered",等。

二、從JSF頁面?zhèn)鬟f組件屬性到托管Bean
f:attribute組件也可以用來訪問,任何綁定在托管Bean的UI組件的屬性。這些屬性值可以通過父組件的getAttributes()來獲得。因?yàn)椴荒芤苑椒▍?shù)的方式傳值給托管Bean綁定的UI組件的getter和setter方法,這時(shí)f:attribute就會(huì)非常有用。這里有個(gè)UI組件綁定到托管Bean的基礎(chǔ)例子



<h:outputText binding="#{myBean.myText}" value="#{myBean.myTextValue}">
        
<f:attribute name="attributename" value="attributevalue" />
    
</h:outputText>

 



托管Bean代碼:

import javax.faces.component.html.HtmlOutputText;
public class MyBean 
{   
    
private HtmlOutputText myText; 
    
    
public HtmlOutputText getMyText() 
    
{   
        
return myText;  
    }
   
    
    
public String getMyTextValue() 
    
{       
        
return (String) myText.getAttributes().get("attributename");   
    }

    
    
public void setMyText(HtmlOutputText myText) 
    
{       
        
this.myText = myText;
    }

}

三、在請求之間傳遞對象(Passing objects from request to request)
如果有一個(gè)request范圍內(nèi)的托管Bean,在下一個(gè)請求中想要重用這個(gè)bean的屬性,參數(shù),或者對象,但是不想一遍又一遍的初始化這個(gè)Bean??梢杂胔:inputhidden來解決這個(gè)問題。這里有個(gè)簡單的例子:



<h:form>   
        ...
        
<h:inputHidden value="#{myBean.value}" />
      ...
    
</h:form>

另一種方法就是用SessionMap來保存那些需要保存在session中的值。



public class MyBean 
{   
    
public Object getMyValue() 
    
{       
        
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("MyBeanMyValue"); 
    }
   
    
    
public void setMyValue(Object myValue) 
    
{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
"MyBeanMyValue", myValue);
    }
  
      
    
// This might be useful.   
    private void resetSessionValue(Object myKey) 
    
{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(myKey);
    }

}

四、在托管Bean之間通信
實(shí)踐時(shí)會(huì)有多個(gè)托管Bean。如果設(shè)計(jì)需要,可以利用getSessionMap()在托管Bean之間通信。
一個(gè)例子,有兩個(gè)托管Bean:



<managed-bean>
        
<managed-bean-name>myBean1</managed-bean-name>
        
<managed-bean-class>mypackage.MyBean1</managed-bean-class>
        
<managed-bean-scope>request</managed-bean-scope>
    
</managed-bean>
    
<managed-bean>
        
<managed-bean-name>myBean2</managed-bean-name>
        
<managed-bean-class>mypackage.MyBean2</managed-bean-class>
        
<managed-bean-scope>session</managed-bean-scope>
    
</managed-bean>

托管Bean myBean1和myBean2是支撐Bean MyBean1.java和MyBean2.java的實(shí)例,它們可以通過JSF頁面來訪問。不管它們的managed-bean-scope是request還是session。如果managed-bean-scope被設(shè)置成session,在整個(gè)session范圍內(nèi)可以使用同一個(gè)Bean的實(shí)例;如果managed-bean-scope被設(shè)置成request,那么每個(gè)request(form action)每次會(huì)創(chuàng)建一個(gè)Bean的實(shí)例。

用下面的方法,可以為每個(gè)托管Bean set和get static的參數(shù)??梢园阉鼘懗蓀rotected方法,放在一個(gè)超類中,讓每個(gè)托管Bean繼承,這會(huì)非常有用,或者寫入一個(gè)Util類中,自己選擇。

 



public class MySuperBean 
{   
    
protected static Object getSessionValue(Object myKey) 
    
{       
        
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(myKey);
    }
   
    
    
protected static void setSessionValue(Object myKey, Object myValue) 
    
{       
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myKey, myValue);
    }

}


public class MyBean1 extends MySuperBean 
{   
    
public void myMethod() 
    
{       
        String myValue 
= "value1";       
        setSessionValue(
"MyBean1MyValue", myValue);
        ...   
    }

}

public class MyBean2 extends MySuperBean 
{   
    
public void myMethod() 
    
{       
        String myValue 
= (String) getSessionValue("MyBean1MyValue");
        ...   
    }

}

五、在托管Bean中訪問另一個(gè)托管Bean
如果有很多托管Bean,想要從其中一個(gè)托管Bean訪問其他的托管Bean,這里有六中方法。
可以使用:
  1)getVariableResolver
  2)createValueBinding
  3)getELResolver (since JSF 1.2)
  4)createValueExpression (since JSF 1.2)
  5)getRequestMap
  6)getSessionMap.
舉例:假設(shè)有兩個(gè)托管Bean



<managed-bean>
    
<managed-bean-name>myBean1</managed-bean-name>
    
<managed-bean-class>mypackage.MyBean1</managed-bean-class>
    
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>myBean2</managed-bean-name>
    
<managed-bean-class>mypackage.MyBean2</managed-bean-class>
    
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

托管Bean myBean1和myBean2是支撐Bean MyBean1.java和MyBean2.java的實(shí)例,它們可以通過JSF頁面來訪問。不管它們的managed-bean-scope是request還是session。
只是要注意的是,getRequestMap在托管Bean被設(shè)置成request的時(shí)候使用,getSessionMap在托管Bean被設(shè)置成session的時(shí)候使用。



<h:form>   
    
<h:commandButton action="#{myBean1.action1}" value="action1" />
    
<h:commandButton action="#{myBean1.action2}" value="action2" />
    
<h:commandButton action="#{myBean1.action3}" value="action3" />
    
<h:commandButton action="#{myBean1.action4}" value="action4" />
    
<h:commandButton action="#{myBean1.action5}" value="action5" />
    
<h:commandButton action="#{myBean1.action6}" value="action6" />
    
<h:outputText binding="#{myBean2.text}" />
</h:form>

MyBean1.java:

package mypackage;
import javax.faces.context.FacesContext;
public class MyBean1 
{    
    
// Using VariableResolver. NOTE: this is deprecated since JSF 1.2!   
    public void action1() 
    
{       
        FacesContext context 
= FacesContext.getCurrentInstance();       
        MyBean2 myBean2 
= (MyBean2) context.getApplication().getVariableResolver().resolveVariable(context, "myBean2");
        myBean2.getText().setValue(
"action1");   
    }
   
    
    
// Using ValueBinding. NOTE: this is deprecated since JSF 1.2!   
    public void action2() 
    
{       
        FacesContext context 
= FacesContext.getCurrentInstance(); 
        MyBean2 myBean2 
= (MyBean2) context.getApplication().createValueBinding("#{myBean2}").getValue(context);       
        myBean2.getText().setValue(
"action2");   
    }
   
    
    
// Using ELResolver. NOTE: this is implemented since JSF 1.2!  
    public void action3() 
    
{       
        FacesContext context 
= FacesContext.getCurrentInstance();
        MyBean2 myBean2 
= (MyBean2) context.getELContext().getELResolver().getValue(context.getELContext(), null"myBean2");
        myBean2.getText().setValue(
"action3");
    }
   
    
    
// Using ValueExpression. NOTE: this is implemented since JSF 1.2!   
    public void action4() 
    
{       
        FacesContext context 
= FacesContext.getCurrentInstance();
        MyBean2 myBean2 
= (MyBean2) context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), "#{myBean2}", MyBean2.class).getValue(context.getELContext());
        myBean2.getText().setValue(
"action4");   
    }
  
    
    
// Using RequestMap. NOTE: myBean2 should be request scoped!   
    public void action5() 
    
{       
        Object object 
= FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("myBean2");
        
// This only works if myBean2 is request scoped.       
        if (object != null
        
{           
            MyBean2 myBean2 
= (MyBean2) object;
            myBean2.getText().setValue(
"action5");       
        }
   
    }
   
    
    
// Using SessionMap. NOTE: myBean2 should be session scoped!   
    public void action6() 
    
{       
        Object object 
=  FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("myBean2");
        
// This only works if myBean2 is session scoped.       
        if (object != null
        
{         
            MyBean2 myBean2 
= (MyBean2) object;
            myBean2.getText().setValue(
"action6"); 
        }
   
    }


}


MyBean2.java:

package mypackage;
import javax.faces.component.html.HtmlOutputText;
public class MyBean2 
{   
    
private HtmlOutputText text;   
    
    
public HtmlOutputText getText() 
    
{       
        
return text;   
    }
   
    
    
public void setText(HtmlOutputText text) 
    
{       
        
this.text = text;   
    }

}

 

原文章地址:http://www.blogjava.net/algz/articles/193459.html

發(fā)表于 @ 2008年11月19日 12:12:00|評論(0)|收藏

新一篇: JSF 與 JavaScript 用 A4J 完成前臺(tái)后臺(tái)數(shù)據(jù)交互 | 舊一篇: NetBeans報(bào)錯(cuò)

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服