未在commandButton JSF 2.2上激发操作
我是JSF的新手,我对非常简单的Facelets视图有一个问题:未在commandButton JSF 2.2上激发操作,jsf,jsf-2.2,Jsf,Jsf 2.2,我是JSF的新手,我对非常简单的Facelets视图有一个问题: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" >
<h:head>
<title></title>
</h:head>
<h:body>
<h:form id="form">
<h:panelGrid id="ciccio" columns="2">
<h:outputText value="Nome " />
<h:inputText value="#{thinBean.nome}" />
<h:commandButton id="ok" value="OK" />
<h:commandButton id="vai" value="Go" rendered="#{not empty thinBean.nome}" action="Vista1" />
</h:panelGrid>
</h:form>
</h:body>
</html>
第一次呼叫后,仅显示第一个按钮。
当我在nome
字段中输入test
并通过单击ok
标识的按钮提交此表单时,还会出现第二个按钮
当我点击第二个按钮(由vai
标识)时,什么也没有发生:Vista1
没有被渲染
我不理解这种行为:为什么要跳过调用应用程序阶段
感谢在应用请求值阶段,对
UICommand
组件的呈现的
属性进行了评估,作为防止篡改/黑客请求的一部分,黑客试图调用非管理员用户未呈现的UICommand
组件的操作,比如说
在您的特定情况下,您使用的是请求范围的bean。因此,bean在每个请求结束时被销毁,在每个请求开始时被重新创建。通过第一个按钮提交表单视为一个请求。通过第二个按钮提交表单将被视为另一个请求
UIInput
值在更新模型值阶段设置为托管bean属性,更新模型值阶段在应用请求值阶段之后设置为。因此,当按下第二个按钮时,新创建的请求范围bean的所有属性都设置为默认值(null
)。在应用请求值阶段,呈现的
属性检查输入值,但尚未设置,bean是新的且为空的。因此,它不会考虑按钮的呈现,跳过对动作事件的解码。
如果您将bean放在视图范围内,那么它将工作,原因很简单,即只要您通过返回null
或void
与同一视图交互,视图范围内的bean实例就会一直存在
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
另一种方法是检查呈现的
属性中的原始HTTP请求参数,而不是模型值
<h:inputText binding="#{nome}" value="#{thinBean.nome}" />
<h:commandButton id="ok" value="OK" />
<h:commandButton id="vai" value="Go" rendered="#{not empty param[nome.clientId]}" action="Vista1" />
另见:
的操作映射到支持bean?您好,是否有支持bean方法的强制映射操作?否,但您正在进行导航?
的action
属性、action=“Vista1”
应该用作导航案例结果(目标视图)。@Tiny如果您有一个托管bean,其方法返回“someString”
,则执行
和
也是一样的。Fabrizio:看起来,由于您的bean是@RequestScoped
,因此在请求中创建bean时,nome
的值将是null
,因此不应呈现命令按钮,从而导致整个混乱。最好至少将bean的范围更改为@ViewScoped
。另外,确保您有一个名为Vista1的视图(通常是通过拥有Vista1.xhtml文件)。
<h:inputText binding="#{nome}" value="#{thinBean.nome}" />
<h:commandButton id="ok" value="OK" />
<h:commandButton id="vai" value="Go" rendered="#{not empty param[nome.clientId]}" action="Vista1" />