JSF2忽略了Action attribut

时间:2010-09-16 11:07:26

标签: jsf jsf-2

我的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。 谢谢你...

3 个答案:

答案 0 :(得分:5)

这可能有很多可能的原因。 @romaintaz只提到了最明显的一个(最常见的初学者的错误):UICommand组件必须放在UIForm组件内。

但原因有很多:

  1. 您有多个嵌套表单。这在HTML中是非法的。行为取决于所使用的webbrowser,但通常按钮不会执行任何操作。您可能无法嵌套表单,但可以并行使用它们。

  2. 发生了h:message未捕获的验证或转换错误。通常这会记录到stdout,但您也可以使用h:messages来获取它们。

  3. UICommand组件放置在UIData组件(例如h:dataTable)内,value在后​​续请求期间未以正确的方式保留view。如果JSF找不到关联的数据行,则不会调用该操作。将bean放在rendered范围内应该会有很大帮助。

  4. 组件或其父组件之一具有disabledfalse属性,在申请请求值阶段评估view。那时JSF不会调用该动作。将bean放在PhaseListener范围内应该会有很大帮助。

  5. 请求 - 响应链中的某些EventListenerFilterServlet或{{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个控制器。重构之后,我的代码看起来更容易,现在可以正常工作: - )

感谢您的有用建议