带弹出窗口的jsf,同一个viewid的问题

时间:2011-09-01 15:33:56

标签: java jsf tomcat view

我有一个带有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?有人有任何解决方案吗?

由于

2 个答案:

答案 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)

我的最终解决方案如下:

  1. 创建一个jsp名称popup_create.jsp,该名称仅包含对create.jsp的隐含
  2. 使用popup_create.jsp
  3. 在facesconfig中复制create.jsp条目
  4. 创建一个ViewHandler(在config中添加),扩展名为ViewHandlerImpl,其中createView&amp; restoreView方法被ovewritten,所以viewId,如果是create.jsp,我们在弹出窗口中,它会将viewId修改为poup_create.jsp。
  5. 我认为这可能是以更优雅的方式完成的,这是我找到的唯一方式。