最近开始学习JSF基础,发现比较重要的一点,就是如何用编程方式访问托管Bean。看了一些JSF的实例,不过大多都是用JSF1.1来实现的。虽然在
JSF1.2的环境中也可以很好运行,但是在编译的时候会看到降级的消息。这里找了一些资料总结一下JSF1.1和JSF1.2访问托管Bean的方法。
一、从JSF页面传递参数给托管Bean
虽然利用h:commandLink
和h:commandButton组件,可以通过action和actionListener来触发托管Bean中的方法,但是不能向这些方法中传递参
数。对于动态传递参数,不是不可以实现,这点可以通过使用f:attribute来实现。而且f:attribute也可以很好的和
actionListener联合使用。
例子:
<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进来的值。
另一个欠文雅的方式就是通过f:param组件来传值,这个只是对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>
这些参数可以通过FacesContext的getRequestParameterMap()方法取到。通过下面的方法,可以用f:param的name来获取任何写在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进来的值。
不过要注意,属性的名字要唯一,而且不能用其他组件的属性名,比如:"id", "name", "value","binding", "rendered",等。
二、从JSF页面传递组件属性到托管Bean
f:attribute
组件也可以用来访问,任何绑定在托管Bean的UI组件的属性。这些属性值可以通过父组件的getAttributes()来获得。因为不能以方法参数的
方式传值给托管Bean绑定的UI组件的getter和setter方法,这时f:attribute就会非常有用。这里有个UI组件绑定到托管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");
}
|