Java 带有弹出窗口的jsf,具有相同视图ID的问题

Java 带有弹出窗口的jsf,具有相同视图ID的问题,java,jsf,tomcat,view,Java,Jsf,Tomcat,View,我有一个使用JSF1.1的tomcat应用程序 案例: 我的应用程序有一个名为/create.jsp的jsp let,其中包含一个用于创建业务对象类型person的表单。此业务对象的属性之一是与自身的关系,即BO person,具有属性father,也就是person类型。对于这个姿势,在jsp中,我有一个可选的按钮和一个按钮。该按钮允许创建新的业务对象(在本例中为person)。因此,弹出窗口中显示的jsp与主窗口中显示的jsp相同 问题: 我在主窗口中面对错误的行为 原因: 我已经研究过这个

我有一个使用JSF1.1的tomcat应用程序

案例: 我的应用程序有一个名为/create.jsp的jsp let,其中包含一个用于创建业务对象类型person的表单。此业务对象的属性之一是与自身的关系,即BO person,具有属性father,也就是person类型。对于这个姿势,在jsp中,我有一个可选的按钮和一个按钮。该按钮允许创建新的业务对象(在本例中为person)。因此,弹出窗口中显示的jsp与主窗口中显示的jsp相同

问题: 我在主窗口中面对错误的行为

原因: 我已经研究过这个案例,问题的原因是存储在服务器中的视图的ID。当用户需要新页面时,服务器将创建一个视图ViewRoot并将其存储在会话中。jsp路径用作视图的id。当用户提交表单时,它将重新使用会话中存储的相同视图。 在我的例子中,问题是弹出窗口的ViewRoot和主窗口的ViewRoot共享相同的id。因此,当显示主窗口时,其ViewRoot将被存储,比如id/create.jsp,但是,当显示弹出窗口时,其ViewRoot将在会话中覆盖主窗口。关闭弹出窗口后,用户将尝试提交主页,但在服务器中,没有这样的ViewRoot

可能的解决办法: 我一直在考虑更改ViewRootID的创建,但我认为这是不可行的,至少如果我不修改jsf库的话

--旧文本-- 我有一个jsp,它的表单名为/create.jsp,可以打开一个弹出窗口。此弹出窗口还将使用/create.jsp。 由于JSF视图id由jsp路径提供,因此两个页面将共享相同的id。因此,当弹出窗口显示时,存储在主页会话中的视图将被新视图覆盖。因此,应用程序无法正常工作

有没有办法更改视图的ID?有人有办法吗


谢谢

您可能希望使用子视图进行研究。您可以在其中分配一个名称空间,该名称空间将在页面中创建一个新的名称空间。在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应用程序了。

我的最终解决方案如下:

创建一个jsp名称popup_Create.jsp,它只包含Create.jsp的一个内联代码 facesconfig中重复的create.jsp条目,带有弹出窗口\u create.jsp 创建一个ViewHandler将其添加到带有ViewHandlerImpl扩展名的config中,其中createView和restoreView方法被重写,这样viewId(如果是Create.jsp,我们在弹出窗口中)将修改viewId为poup_Create.jsp。
我认为这可能是以一种更优雅的方式完成的,这是我发现的唯一方法。

是特定于Facelets的,不适用于JSP。在JSP中,您通常使用。我不知道如何在我的情况下使用它。在第一个解决方案中,我认为您的意思是为弹出窗口创建不同的jsp。这在我的情况下是不可行的。第二个,是不工作尼瑟。弹出窗口和主页内容是相等的。@Mateu我认为这里有一个术语问题。您正在具体引用一个视图。您是否在使用JSF?如果是,您可以使用BalusC提到的将另一个JSP页面作为子视图引入。或者,您也可以分离代码,这样视图就不会重叠。我们可能需要更多有用的信息。我已经修改了问题的描述。我想现在问题很清楚了。ThanksNote:create.jsp是一个通用页面。我无法为弹出窗口创建新的