题
我有一种情况,我有一个带有列表的会话bean,这个列表我在html数据表中显示。当用户从浏览器或普通 href 访问 url 时,我必须显示所有记录。还可以搜索数据,我必须在其中显示过滤后的列表。现在,在用户进行搜索后,列表包含过滤后的记录,执行此操作后,他将页面留给其他页面,现在如果用户点击网址或使用菜单返回此页面,因为我有此列表在会话 bean 中,我仍然有过滤列表。
由于 JSF 1.1 或 2.0 preRenderView 概念中没有默认操作,因此很难清除列表并再次获取未过滤的数据(所有结果)。即使 getList() 方法中的技巧也无法完成任务。
我计划使用阶段监听器,因为当用户通过浏览器中的 href 或 url 点击到达页面时,调用应用程序阶段不会发生。我可以在会话 bean 中切换布尔变量,在 getList() 中我可以执行一些技巧来检查它是 url、href 命中还是通过命令按钮。
希望我已经说清楚了。简而言之,我必须在我的 bean 中确定请求是否直接来自 href、浏览器或操作。如果搜索操作过滤数据表的记录,如果不保留列表缓存,并且只要不进行搜索就继续显示它。
请指导我是否以正确的方式做事或想太多,或者是否可以以更有效的方式完成。
提前致谢。好吧平台是weblogic门户10.3中的jsf 1.1......
解决方案
默认情况下使用 JSF 1.x 操作 POST
方法。直接链接/书签/等本质上是 GET
方法。既然没有 ResponseStateManager#isPostback()
或者 FacesContext#isPostback()
在 JSF 1.1 中,您必须自己确定请求方法:
HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
boolean postback = "POST".equalsIgnoreCase(request.getMethod());
或者检查请求参数映射中的某个参数,但我无法从头顶上分辨出您要检查哪个参数。你必须自己确定。
boolean postback = facesContext.getExternalContext().getRequestParameterMap().containsKey(SOME_KEY);
如果 postback
是 true
, ,然后调用 JSF 操作。