将用户名和页面名称保留到数据库

时间:2012-07-22 11:18:51

标签: java jsf jdbc

我有一个小JSF个应用程序,页面范围是request。我希望在我的JSF托管bean中有一个方法,用于将user_idpage name记录到数据库中。当我将此方法添加到bean的构造函数时,由于页面范围为request,因此正在调用每个方法的详细信息。

用户在登录我的应用程序后首次访问页面时,只记录一次上述详细信息的最佳方法是什么? Idea是每个日志记录用户访问过的所有页面。 实现这一目标的最佳方法是什么?

我的JSF版本是1.1。

由于

2 个答案:

答案 0 :(得分:1)

您可以向bean添加方法,并在加载页面时从页面调用它。例如

将其添加到页面中:

<h:outputText value="#{fooBean.logUser}"/>

bean方法:

public void logUser(){
    //log user and page
}

这样,只有在加载页面后才会调用该方法。如果找不到方法 错误,然后另一种选择是使用隐藏的形式黑客。例如:

<body onload="document.getElementById('formId:buttonId').click()">
    <h:form id="formId" style="display: none;">
        <h:commandButton id="buttonId" value="submit" action="#{fooBean.logUser()}" />
    </h:form>
    ...
</body>

答案 1 :(得分:1)

因此,您希望将所有用户的所有访问权限登录到您的站点的不同页面,但是,避免记录回发,对吧? (当用户在您的某个页面中执行操作并且接收操作的URL与启动操作的URL相同时,会发生回发 - 这在JSF中非常常见,特别是在2之前的版本上。 x)的

所以,基本上,你需要的是识别回发发生的时间并避免在这种情况下进行记录。 ResponseStateManager将为您提供isPostback(...)方法,在处理回发请求时返回true

FacesContext context = FacesContext.getCurrentInstance();
ResponseStateManager rsm = context.getRenderKit().getResponseStateManager();
if (!rsm.isPostback(context)) {
   // do whatever you need here
}

顺便说一句,我不建议将该代码放在bean构造函数中,因为不同的JSF实现可能在调用bean的构造函数后立即执行一些bean生命周期管理任务。如果您认为逻辑应该是“bean初始化过程”的一部分,我建议将该代码放在一个用@PostConstruct注释注释的单独公共方法中。

但是,如果您希望在对给定页面的每次访问中运行该逻辑,则使用托管bean将强制您复制&amp;将该逻辑粘贴到每个bean中,或者使用该逻辑定义一个抽象/基类,并使所有bean扩展该bean。我希望尽可能地将所有托管bean保留在POJO概念中,因此,作为替代方案,我会考虑实现相同的逻辑,但使用PhaseListener绑定到RENDER_RESPONSE阶段。它将为您提供引擎盖下(更清洁)和多功能方法:如果有一天您想要记录 操作 而不是< strong> 呈现 然后将您的监听器绑定到INVOKE_APPLICATION阶段等。

PD:我希望您使用某种缓存或“批处理”技术将这些记录记录到您的数据库中,否则当有太多用户浏览您的网站时,您会对性能产生明显的影响。另外,在我看来,你应该将你的JSF版本更新到至少1.2,并且你将避免一些恼人的错误或意外行为......