我有一个带有jsf 1.1的tomcat应用程序
案例: 我的应用程序有一个jsp(让它命名为/create.jsp),它包含一个用于创建业务对象的表单(想象类型人)。此业务对象的一个属性是与自身的关系(BO人,具有属性父,也是人类的类型)。对于这个porpose,在jsp中,我有一个可选择的按钮。该按钮可以创建新的业务对象(在本例中为一个人)。因此,弹出窗口中的jsp显示与主窗口中显示的相同
问题: 我在主窗口中遇到了错误的行为。
原因: 我研究了这个案例,问题的原因是存储在服务器中的视图的ID。当用户需要新页面时,服务器会创建一个视图(ViewRoot)并将其存储在会话中。 jsp路径用作View的id。当用户提交表单时,它将重新使用存储在会话中的相同视图。 在我的情况下的问题是弹出ViewRoot和主窗口ViewRoot共享相同的ID。因此,当显示主窗口时,将存储其viewRoot(比如id /create.jsp),但是,当弹出窗口显示时,其viewRoot将覆盖会话中的主窗口。关闭弹出窗口后,用户将尝试提交主页面,但在服务器中,没有这样的ViewRoot。
可能的解决方案: 我一直在考虑改变ViewRoot id的创建,但我认为这是不可行的(至少如果我不修改jsf库)。
---旧文字--- 我有一个带有表单的jsp(让它命名为/create.jsp),它会打开一个弹出窗口。这个弹出窗口也会使用/create.jsp。 由于JSF view-id,由jsp路径构成,两个页面将共享相同的id。因此,当显示弹出窗口时,存储在主页面的会话中的视图将被新窗口覆盖。因此,应用程序无法正常运行。
有没有办法改变视图的ID?有人有任何解决方案吗?
由于
答案 0 :(得分:0)
您可能希望使用子视图。您可以在其中指定一个名称空间,从而在页面中创建一个新的命名空间。在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应用程序。
答案 1 :(得分:0)
我的最终解决方案如下:
我认为这可能是以更优雅的方式完成的,这是我找到的唯一方式。