混合jsp和jsf
我会详细说明。从设计人员的角度来看,Jsf的使用非常痛苦,某种程度上是在试图用双手绑住背部时画一幅画,但它对于查找表格和列出大量数据很有用。因此,我们在我公司中创建的网站是jsf管理页面和jsp用户页面。当用户页面具有某些复杂的形式和内容并且jsf开始启动时,就会发生问题。
这里的问题是:我在纯jsp页面上。我需要访问一些使用会话bean的jsf页面。我该如何初始化该bean?如果我在jsf页面上,则可以使用一些commandLink来准备数据。我唯一能想到的就是拥有伪jsf页面,它将完成工作并将我重定向到所需的jsf页面,但这有点丑陋,我不想最终得到50个伪页面。我宁愿找到某种机制来重新初始化已经在会话中并带有一些所需参数的bean。
编辑:更多细节。在这种特定情况下,我有一个完整的或者过滤的测试。这是具有相同逻辑和所有内容的相同测试,除非测试经过过滤,否则应根据答案消除一些问题。单击链接后,它将以两种模式之一启动请求的测试。链接是主菜单树的一部分,并且在许多同级jsp页面上可见。我的任务是有4个链接:testA完整,testA过滤,testB完整,testB过滤,所有位于同一jsf页上的引线和TestFormBean都应相应地重新初始化。
编辑:我已经研究了facelets,虽然它现在对我没有帮助,但我一定会在下一个项目中牢记这一点。
解决方案
回答
我们是否考虑过使用facelets?它使我们摆脱了整个JSF / JSP差异(它是一种替代的高级视图控制器)。
它还通过jsfc标签支持出色的设计时语义。
<input type="text" jsfc="#{SomeBean.property}" class="foo" />
会在内部转换为正确的JSF内容,因此我们可以使用现有工具。
回答
为了解决这个问题,我可能会创建一个仅包含表单的JSF片段,然后使用标签将其包含在我的JSF页面中。
但是,根据环境,该解决方案可能会有些脆弱。
编辑:参见克里斯·霍尔的答案,FacesContext在FacesServlet之外不可用。
回答
创建一个自定义JSP标记处理程序。然后,我们可以从会话范围中检索Bean,然后动态对其进行初始化。有关更多详细信息,请参见本教程。
回答
实际上,我已经通过从会话中删除bean来解决了这个问题,因此在调用jsf页面时必须再次生成它。然后,我从构造函数中的请求中获取get参数。
回答
我们可以使用以下方法在标签库中检索托管Bean:
FacesContext context = FacesContext.getCurrentInstance(); Object myBean = context.getELContext().getELResolver().getValue(context.getELContext(), null, "myBeanName");
但是,我们需要使用一个JSF页面中的标记库。在FacesServlet外部调用FacesContext.getCurrentInstance()时,它会返回null。