我会详细说明一下。从设计师的角度来看,使用 Jsf 是一件极其痛苦的事情,有点像双手被绑在背后试图画图,但它对于咀嚼表单和列出大量数据很有好处。所以我们公司制作的网站是jsf管理页面和jsp用户页面。当用户页面有一些复杂的表单和内容并且 jsf 开始启动时,就会出现问题。

这是问题:我在纯jsp页面上。我需要访问一些使用会话 bean 的 jsf 页面。我怎样才能初始化这个bean?如果我在 jsf 页面上,我可以有一些 commandLink 来准备数据。我唯一能想到的就是使用虚拟 jsf 页面来完成工作并将我重定向到所需的 jsf 页面,但这有点难看,而且我不想最终得到 50 个虚拟页面。我宁愿找到某种机制来重新初始化已经在会话中使用一些所需参数的 bean。

编辑:更多细节。在这种特定情况下,我有一个完整的或过滤的测试。这是具有相同逻辑和所有内容的相同测试,除非测试被过滤,否则它应该根据答案消除一些问题。单击链接后,它应该以两种模式之一启动请求的测试。链接是主菜单树的一部分,并且在许多同级 jsp 页面上可见。我的任务是有4个链接:testA 已满,testA 已过滤,testB 已满,testB 已过滤,所有这些都在同一 jsf 页面上进行,并且 TestFormBean 应相应地重新初始化。

编辑:我已经研究了一些facelets,虽然现在对我没有帮助,但我肯定会在下一个项目中记住这一点。

有帮助吗?

解决方案

为了解决这个问题,我可能会创建一个仅包含您的表单的 JSF 片段,然后使用 <c:import> 标记以将其包含在我的 JSF 页面中。

不过,根据您的环境,该解决方案可能有点脆弱。

编辑:看看克里斯·霍尔的回答, FacesContext 以外不可用 FacesServlet.

其他提示

你考虑过使用facelets吗?它可以让您摆脱整个 JSF / JSP 差异(它是一个替代的高级视图控制器)。

它还通过 jsfc 标签支持出色的设计时语义...

<input type="text" jsfc="#{SomeBean.property}" class="foo" />

在内部转换为正确的 JSF 内容,因此您可以使用现有的工具。

您可以使用如下方式检索标签库内的托管 bean:

FacesContext context = FacesContext.getCurrentInstance();
Object myBean = context.getELContext().getELResolver().getValue(context.getELContext(), null, "myBeanName");

但是,您需要使用 JSF 页面之一的标记库。在 FacesServlet 外部调用 FacesContext.getCurrentInstance() 时,它返回 null。

实际上,我已经通过从会话中删除bean解决了这个问题,因此当调用jsf页面时必须再次生成它。然后我从构造函数中的请求中获取参数。

创建自定义 JSP 标记处理程序。然后,您可以从会话范围检索 bean,然后动态初始化它。看到这个 教程 更多细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top