将t:savestate bean传递给另一个bean
问题描述:
我有两个我正在使用的JSF 1.1页面。其中之一是viewDevices.jsp,另一个是vewDevicesPrint.jsp。他们都在视图范围内运行(使用tomahawk savestate,就是这样)。在viewDevices中,它有一个img用户可以点击进入viewDevicesPrint.jsp。像这样:将t:savestate bean传递给另一个bean
<img src="redesign/images/printicon2.png" alt="print records" border="0" width="16" height="16" onClick="javascript:window.open('/viewDevicesPrint.jsf','_blank','height=500,width=900,menubar=yes, toolbar=yes,scrollbars=yes')"/>
当点击这个IMG,我想viewDevicesBean当前实例传递给viewDevicesPrintBean。有没有办法做到这一点?
我在faces-config.xml中有以下内容。在调试中,viewDevicesPrintBean获取viewDevicesBean的一个新实例,而不是它的当前实例。
<managed-bean>
<managed-bean-name>viewDevicesPrintBean</managed-bean-name>
<managed-bean-class>com.arch.myaccount.jsf.ViewDevicesPrintBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>param_viewDevicesBean</property-name>
<value>#{viewDevicesBean}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>viewDevicesBean</managed-bean-name>
<managed-bean-class>com.arch.myaccount.jsf.ViewDevicesBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>param_flow</property-name>
<value>#{param.Flow}</value>
</managed-property>
</managed-bean>
答
视图范围的bean绑定到当前视图。当您通过导航到其他视图来更改当前视图时,那么该不同视图将获得视图范围bean的全新实例。请注意,它在JSF2中也是这样工作的。
最好的办法是在window.open()
URL(转义它们!)中传递所需的数据作为请求参数,以便打印bean可以将它们作为请求参数(通过托管属性或ExternalContext
)。另一种方法是,将bean实例存储在会话范围内的唯一键和自动生成的键(例如java.util.UUID
)中,并将该键作为请求参数传递,以便与打印页关联的bean可以通过该密钥从会话范围中获取数据。
感谢Balus。我最终将viewDevicesPrint作为viewDevices中的子视图。然后,当点击打印按钮时,我使用ajax来填充子视图。之后,我使用.html()来提取子视图并将其写入一个新的window.open。它工作正常。我很想知道是否有办法将子视图编码为完整的html文档(使用
..标签)? –