我从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>
答案 0 :(得分:2)
bean必须由JSF管理,然后它才能知道你在谈论哪个bean。
e.g。
<f:param value="#{quizBean.score}"/>
这里,bean quizBean
是Managed-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页,如果您不理解某些内容,请不要急于提问。