我有一个带有jsf 1.1的tomcat应用程序
案例:我的应用程序有一个jsp (让它命名为/create.jsp),其中包含一个用于创建业务对象(假设类型为person)的表单。此业务对象的属性之一是与其自身的关系( BO person有一个属性person,该属性也属于person类型)。对于这个图像,在jsp中,我有一个可选择的和一个按钮。使用该按钮可以创建新的业务对象(在本例中为person)。因此,弹出窗口中显示的jsp与主窗口中显示的jsp相同。
问题:我在主窗口中遇到了错误的行为。
原因:我研究过这个案例,问题的原因是存储在服务器中的视图的ids。当用户需要新页面时,服务器会创建一个视图(ViewRoot)并将其存储在会话中。jsp路径用作视图的id。当用户提交表单时,它将重新使用存储在会话中的相同视图。在我的例子中,问题是弹出窗口ViewRoot和主窗口ViewRoot共享相同的id。因此,当显示主窗口时,它的viewRoot将被存储(假设id为/create.jsp),但是,当弹出窗口显示时,它的viewRoot将覆盖会话中的主窗口。关闭弹出窗口后,用户将尝试提交主页,但在服务器中没有这样的ViewRoot。
可能的解决方案:我一直在考虑更改jsf的创建,但我认为这是不可行的(至少如果我不修改ViewRoot库的话)。
-旧文本-我有一个带有表单(让它命名为/create.jsp)的jsp,它可以打开一个弹出窗口。此弹出窗口也将使用/create.jsp。由于JSF view-id由jsp路径形成,因此两个页面将共享相同的id。因此,当弹出窗口显示时,主页面的会话中存储的视图将被新的视图覆盖。因此,应用程序无法正常工作。
有什么方法可以更改视图的ids吗?有人有什么解决方案吗?
谢谢
发布于 2011-09-09 17:12:04
我的最终解决方案如下:
因为我认为这可能会以一种更优雅的方式完成,这是我找到的唯一方法。
发布于 2011-09-01 23:43:30
您可能想研究一下使用子视图。您可以在其中分配一个名称空间,该名称空间实际上将在页面中创建一个新的名称空间。在facelets中,这将是:
<f:view id="main">
<ui:include "myOtherJsp.jsp" /> <!-- This containing a subview -->
</f:view>或者,我认为您可能只需要将页面分成多个视图:
<f:view id="mainpage">
<p>Page content</p>
</f:view>
<f:view id="popup">
<p>My Popup</p>
</f:view>我不知道您的应用程序的细节,但我看不出有理由不使用多个视图/表单的情况。我猜分居会解决你的问题。您可以在视图之外使用JSF的一些元素(因此,除非迫不得已,否则没有理由在每个页面上使用单个视图。
注意:我大部分时间都是一名JSF2开发人员,我已经很久没有开发过JSF1.1应用程序了。
https://stackoverflow.com/questions/7272686
复制相似问题