JSF2.0,commandButton如何知道发送它的bean

时间:2011-09-29 13:23:51

标签: jsf jsf-2

我从JSF2开始,从spring mvc开始,所以我有点怀疑我在Core JavaServer Faces v3上找不到答案

喜欢这个......

标签h:commandButton如何知道我在谈论哪个bean?我每个JSF页面只能有一个Bean,是吗?我只给它一个msg.next,这是一个来自i18n文件的文本。(quizbean是我的bean)

<h:body>
<h:form>
    <h3>#{msgs.heading}</h3>
        <p>
            <h:outputFormat value="#{msgs.currentScore}">
                <f:param value="#{quizBean.score}"/>
            </h:outputFormat>
        </p>
        <p>#{msgs.guessNext}</p>
        <p>#{quizBean.current.sequence}</p>
        <p>
            #{msgs.answer}
            <h:inputText value="#{quizBean.answer}"/>
        </p>
        <p><h:commandButton value="#{msgs.next}"/></p>
</h:form>

3 个答案:

答案 0 :(得分:2)

bean必须由JSF管理,然后它才能知道你在谈论哪个bean。

e.g。

<f:param value="#{quizBean.score}"/>

这里,bean quizBeanManaged-Bean,由JSF管理。

要使它成为托管bean,你可以通过如下使用注释告诉JSF:

@ManagedBean(name="quizBean") //name is optional or you give your own name to the bean
@SessionScoped //tell JSF in which scope you want to keep your managedbean
public class QuizBean {
    //....

或者在JSF配置文件(faces-config.xml)中提及如下 -

<managed-bean>
    <managed-bean-name>quizBean</managed-bean-name>
    <managed-bean-class>com.pkg.QuizBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
//Older versions of JSF requires this where annotations do not work
//But if you are using JSF 2.0 then it's a lot better to use annotations

您可以在视图(页面)中使用多个bean。

答案 1 :(得分:2)

命令按钮不需要知道这一点。它生成的所有内容都是HTML <input type="submit">元素。它嵌入在HTML <form>中,其操作URL指向与页面相同的URL。还有<input type="hidden" name="javax.faces.ViewState">。感谢这个领域,JSF确切地知道你提交的是什么视图。此视图包含有关所有输入的信息。这个观点知道有一个<h:inputText value="#{quizBean.answer}" />。该视图知道生成的HTML name元素的字段<input type="text">。 JSF将使用此名称按request.getParameter()获取提交的请求参数值,然后使用此值更新当前answer实例的quizBean属性。

在浏览器中右键单击该页面,然后选择查看源以查看JSF生成的HTML输出。在ApplyRequestValuesPhase#execute()HtmlBasicRenderer#decode()方法上设置断点(假设您使用的是Mojarra而不是MyFaces)来跟踪视图中每个UIComponent的已提交值的收集。

答案 2 :(得分:1)

如果这是Core Java Server Faces的示例,那么请仔细阅读,它解释了一切。

msgs据我记得,是指在 faces-config.xml 中声明的消息包

至于你的问题how commandButton knows which bean to call。在您的示例中,类名 QuizBean 很可能对应于具有相同名称的bean。对于 JSF 2.0 来说已经足够了。但是,您可以通过2种方法更改该名称:

1)如果你使用JSF托管bean,你应该这样:

@ManagedBean(name="quiz")
@ViewScoped
public class QuizBean { }

2)如果你使用 CDI -beans,你会这样做:

@Named("quiz")
@RequestScoped
public class QuizBean {}

请记住 CDI-beans范围注释来自包 javax.enterprise.context 。 JSF范围位于 javax.faces.bean 包中。 不要混用它们!

<强>更新 有关您的问题的更多详细信息,请参阅本书Core Java Server Faces 3rd Edition第35页,如果您不理解某些内容,请不要急于提问。