我使用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);
但我对“上下文”有疑问。你有什么想法吗?
答案 0 :(得分:2)
这取决于您为userCommand
设置相应的导航规则和/或userController
的范围,如果这样做的话。
动作侦听器在导航发生之前在bean中设置一个值。如果导航导致重定向发生,则bean必须位于此重定向后可用的范围内。在没有添加任何其他范围的情况下,这将是应用程序范围和会话范围。
如果bean位于请求范围或视图范围内,则在重定向发生之前,将在与请求对应的bean中设置您的值。在重定向之后,新请求到新页面完成,因此新的请求范围或新视图范围开始。这意味着您的价值将会丢失。
使用应用程序范围或会话范围理论上可以修复此问题,但如果您的应用程序有多个用户(很可能)或者单个用户打开了多个窗口/标签页,则会遇到重大问题。
如果您的导航规则不使用重定向,它实际上应该有效。现在的问题是,您将遇到问题背后的一个URL&#34;:浏览器的地址栏仍会显示旧页面。
由于您并未真正执行任何操作而只想转到新页面,因此更好的方法是使用<h:button>
或<h:link>
直接链接到该页面并提供如果说汽车作为参数。
这将发出一个GET请求,它具有可收藏的额外好处。如果您正在进行重定向后的事情,它最初也会表现得更好。在目标页面上,您必须准备好将参数转换回汽车实例。为此,您可以使用<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示例CRUD应用程序中的user_edit.xhtml和this。