Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未在commandButton JSF 2.2上激发操作_Jsf_Jsf 2.2 - Fatal编程技术网

未在commandButton JSF 2.2上激发操作

未在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/

我是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/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" />