最近开始学习JSF基础,发现比较重要的一点,就是如何用编程方式访问托管Bean。看了一些JSF的实例,不过大多都是用JSF1.1来实现的。虽然在JSF1.2的环境中也可以很好运行,但是在编译的时候会看到降级的消息。这里找了一些资料总结一下JSF1.1和JSF1.2访问托管Bean的方法。 一、从JSF页面传递参数给托管Bean <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实例取到 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进来的值。 <h:commandLink action="#{myBean.action}"> <f:param name="paramname1" value="paramvalue1" /> <f:param name="paramname2" value="paramvalue2" /> ... <h:outputText value="Click here" /> </h:commandLink> 这些参数可以通过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进来的值。 二、从JSF页面传递组件属性到托管Bean <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) <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之间通信 <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的实例,它们可以通过JSF页面来访问。不管它们的managed-bean-scope是request还是session。如果managed-bean-scope被设置成session,在整个session范围内可以使用同一个Bean的实例;如果managed-bean-scope被设置成request,那么每个request(form action)每次会创建一个Bean的实例。 用下面的方法,可以为每个托管Bean set和get static的参数。可以把它写成protected方法,放在一个超类中,让每个托管Bean继承,这会非常有用,或者写入一个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中访问另一个托管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的实例,它们可以通过JSF页面来访问。不管它们的managed-bean-scope是request还是session。
原文章地址:http://www./algz/articles/193459.html 发表于 @ 2008年11月19日 12:12:00|评论(0 )|收藏 新一篇: JSF 与 JavaScript 用 A4J 完成前台后台数据交互 | 旧一篇: NetBeans报错 |
|