【问题标题】:redirect from jsp to another after some time or by condition一段时间后或按条件从 jsp 重定向到另一个
【发布时间】:2013-02-16 01:25:45
【问题描述】:

我是 jave ee 的新手。我需要以下行为。我有一个注册用户队列。排在最前面的用户可以在 10 分钟内访问页面 A。 10 分钟后,他应该被重定向到另一个页面 B 并从队列中删除。如果此用户注销/关闭浏览器,他也应该从队列中删除。

如果用户在页面 A 停留 10 分钟,我无法重定向到页面 B。

我正在尝试制作异步计时器,以重定向到 B:

在页面 A:

<h:body>
    #{CheckBean.runTimer()}
...

这是 CheckBean:

public class CheckBean {
    @EJB
    ActiveUserTimer timer;
    ...
    public void runTimer() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext externalContext = context.getExternalContext();
        timer.run(externalContext, System.currentTimeMillis());
        ...

EJB 计时器:

@Stateless
public class ActiveUserTimer{
    @Asynchronous
    public void run (ExternalContext externalContext, long time) {
        while (true) {
            if (System.currentTimeMillis() - time > 10000 || someFuncDetectedUserIsOffline()) {
                externalContext.redirect("../public/index.xhtml");
                Thread.sleep(1000);
            }
        }
    }

问题是当我将 externalContext 传递给 run() 方法时 externalContext 不为空,但 externalContext.requestParameterMap 的值为:

目标虚拟机发生异常:
java.lang.NullPointerException: 在 com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.getFormHintFieldEncoding(PwcCoyoteRequest.java:225) 在 com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.setRequestEncodingFromSunWebXml(PwcCoyoteRequest.java:188) 在 com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.getCharacterEncoding(PwcCoyoteRequest.java:129) 在 org.apache.catalina.connector.Request.parseRequestParameters(Request.java:3114) 在 org.apache.catalina.connector.Request.getParameterNames(Request.java:1282) 在 org.apache.catalina.connector.RequestFacade.getParameterNames(RequestFacade.java:438) 在 com.sun.faces.context.RequestParameterMap.getEntryIterator(RequestParameterMap.java:126) 在 com.sun.faces.context.BaseContextMap$EntrySet.iterator(BaseContextMap.java:166) 在 com.sun.faces.context.BaseContextMap$BaseSet.size(BaseContextMap.java:154) 在 java.util.Collections$UnmodifiableCollection.size(Collections.java:996) 在 java.util.AbstractMap.size(AbstractMap.java:67) 在 java.util.Collections$UnmodifiableMap.size(Collections.java:1276) 在 com.mycompany.hib.ActiveUserTimer.run(ActiveUserTimer.java:29) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 在 org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) ...

我查看了 Quartz,但我想如果我要传递 externalContext 实例,我会遇到确切的问题。 有没有其他方法可以实现?

【问题讨论】:

    标签: jsp jsf jakarta-ee redirect javabeans


    【解决方案1】:

    此任务根本不需要任何服务器计时器。您可以使用纯 JavaScript 来完成。检查setTimeout函数以解决您的问题。

    知道了这一点,你可以做类似的事情

    <script type="text/javascript">
        setTimeout(function() { 
            document.getElementById('myForm:btnContinue').submit();
            }, 10*1000*60);
    </script>
    
    <h:form id="myForm">
        <!-- page content... -->
        <h:commandButton id="btnContinue" value="Continue" action="#{bean.continue}" />
    </h:form>
    

    【讨论】:

    • 如何从队列头部删除活动用户?我可以通过 javascript 运行 java 方法吗?另外我应该知道用户是否更早离开此页面然后计时器到期。
    • @Alex 应该在您的 bean#continue 方法中处理。您甚至可以从隐藏的&lt;h:commandButton&gt;/&lt;h:commandLink 调用另一个bean.continueAndDelete 方法,但这取决于您的设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多