我的xhtml代码:
<h:commandLink action="#{detailController.updateProject}" class="positive" >
<h:graphicImage library="img" name="tick.png" alt=""/>
<h:outputText value="Save" />
</h:commandLink>
这个动作(updateProject())没有从JSF框架调用!即使我在managedBean中删除它也没有抛出异常。
有没有人有这样的问题?我甚至无法解释--.-我的意思是这个行动方式就在那里!
ADD:是的,它位于h:form标签中!但是我在这个视图中有两种形式!那可能是问题吗?
ADD2:我还应该提一下,如果我按下按钮,它会让我回到上一个视图!所以我的动作方法被忽略了,而是打开了另一个视图?!?!
为了提供更多信息,我的页面构建如下:
panelGroup name=show rendered=!controller.edit
form
buttons
outputtext
/form
/panelGroup
panelGroup name=edit rendered=controller.edit
form
buttons
inputText
/form
/panelGroup
所以我有两个,在一个文件中编辑和显示一个实体!但只有底部形式的按钮才显示出奇怪的行为(见上文)。
回答BalusC: 1.我使用两种形式(它们不是嵌套的!) 2.在底部的表格中,我已经放了一个h:消息 我要尝试将我的控制器放入viewScop进行检查3和4 我不知道怎么检查5。 谢谢你...
答案 0 :(得分:5)
这可能有很多可能的原因。 @romaintaz只提到了最明显的一个(最常见的初学者的错误):UICommand
组件必须放在UIForm
组件内。
但原因有很多:
您有多个嵌套表单。这在HTML中是非法的。行为取决于所使用的webbrowser,但通常按钮不会执行任何操作。您可能无法嵌套表单,但可以并行使用它们。
发生了h:message
未捕获的验证或转换错误。通常这会记录到stdout,但您也可以使用h:messages
来获取它们。
UICommand
组件放置在UIData
组件(例如h:dataTable
)内,value
在后续请求期间未以正确的方式保留view
。如果JSF找不到关联的数据行,则不会调用该操作。将bean放在rendered
范围内应该会有很大帮助。
组件或其父组件之一具有disabled
或false
属性,在申请请求值阶段评估view
。那时JSF不会调用该动作。将bean放在PhaseListener
范围内应该会有很大帮助。
请求 - 响应链中的某些EventListener
,Filter
,Servlet
或{{1}}已将JSF生命周期更改为跳过调用操作阶段或更改了请求参数,以便JSF无法调用该操作。
答案 1 :(得分:3)
一个简单的问题:你的<h:commandLink>
嵌套在<h:form>
吗?
如果不是这种情况,必须在表单元素中包含您的命令链接,否则它将无效。
仅为了简化代码,您可以使用value
属性,而不是添加<h:outputText>
组件:
<h:commandLink action="#{detailController.updateProject}" class="positive" value="Save">
<h:graphicImage library="img" name="tick.png" alt=""/>
</h:commandLink>
答案 2 :(得分:0)
不幸的是,我不知道mistae在哪里。我想这是关于我的JSF代码的错误。
我通过简化代码解决了这个问题。从那个xhtml页面和那个控制器我制作了3个xhtml页面和3个控制器。重构之后,我的代码看起来更容易,现在可以正常工作: - )
感谢您的有用建议