我使用 JSF2 和 PrimeFaces,我想使用此按钮转到另一个页面:
<p:column>
<h:commandButton action="userCommand" value="list of commands" >
<f:setPropertyActionListener value="#{car}" target="#{userController.u1}" />
</h:commandButton>
</p:column>
在目标页面上,我使用了来自 userController.u1
的一些信息,但是 <f:setPropertyActionListener>
标签似乎没有被执行。
因此我得到以下异常:
java.lang.NullPointerException
作为对 Arjan 的回应,感谢您的详细回复,但我认为还有另一种方法可以做到这一点,而不是像我在问题中那样使用新的 managedBean,我使用一个已经实例化的 (sessionScoped) 并且然后我在新的构造函数中调用它来检索值,
您如何找到这个解决方案?你能帮我从新的 managedBean 的构造函数中调用另一个 managedBean 吗?
因为我测试过这个:
ELContext elContext = context.getELContext();
Application application = context.getApplication();
String userid = (String) application.evaluateValueExpressionGet(context,
"#{userBean.userid}", String.class);
但我对“上下文”有疑问。你有什么想法吗?
最佳答案
这取决于您如何为userCommand
设置相应的导航规则和/或 userController
的范围如果这一切都行得通。
Action 监听器在导航发生之前在 bean 中设置一个值。如果导航导致重定向发生,那么该 bean 必须在该重定向后可用的范围内。在不添加任何其他范围的情况下,这将是应用程序范围和 session 范围。
如果 bean 在请求范围或 View 范围内,您的值将在重定向发生之前设置在与请求对应的 bean 中。在重定向到新页面的新请求完成后,新的请求范围或新的 View 范围开始。这意味着您的值(value)将丢失。
理论上,使用应用程序范围或 session 范围可以解决此问题,但如果您的应用程序有多个用户(很有可能)或者如果单个用户打开多个窗口/选项卡,您将遇到重大问题。
如果您的导航规则不使用重定向,它应该确实有效。现在的问题是你会遇到“one URL behind problem”的问题:浏览器的地址栏仍然会显示旧页面。
由于您并没有真正执行任何操作,只是想转到一个新页面,更好的方法是使用 <h:button>
直接链接到该页面或 <h:link>
并提供所述汽车的 If 作为参数。
这将发出一个 GET 请求,它具有可收藏的额外好处。如果你正在做 Post-Redirect 的事情,它最初也会表现得更好。在目标页面上,您必须准备好将参数转换回汽车实例。为此,您可以使用 <f:viewParam>
标签。
链接示例:
<p:column>
<h:button outcome="userCommand" value="list of commands">
<f:param name="car_id" value="#{car.id}"/>
</h:Button>
</p:column>
目标页面示例:
<f:metadata>
<f:viewParam name="car_id" value="#{userController.u1}" converter="#{carConverter}" />
</f:metadata>
有关此的工作示例,请参阅 index.xhtml和 user_edit.xhtml在 this示例 CRUD 应用程序。
关于button - p :commandButton doesn't execute f:setPropertyActionListener in JSF 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025720/