怎样用JSF实现网页超时的自动跳转

时间:2022-12-10 21:57:38
项目的要求是:点击页面上的查询按钮以后,在BackingBean的事件方法中查询数据,如果查询时间超过预设值则跳转到超时页面。
比如:预设的超时时间为20秒,点击查询以后20秒一到,如果还没有查出结果,网页立即跳转到超时页面。

我原来的想法是,在方法开始的时候记录系统时间,然后在方法结束以后再获得系统时间,然后将两个时间的差与预设值进行比较,超过就跳转。但是这样有个缺陷,就是必须等方法完全执行完毕后才可以跳转,没法达到一到时就自动跳转的功能。
后来我想使用线程,利用Timer来进行计时,然后到时触发事件停止查询、自动跳转,但是JSF的机制不是很熟,好像在新开的线程里没法控制事件方法的线程,也就没法实现跳转。
不知道大家有没有在项目中遇到过类似的需求,都是怎样解决的。希望能给我一些建议,谢谢!

16 个解决方案

#1


jsf 我不太会,不果给你一个建议 就是 设置一个环境变量 bool 
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里

#2


呵呵,关键是怎么监视,不开线程的话很难实现,总不能用while循环吧。
问题刚刚解决了,还是用javax.swing.Timer来负责计时,然后在到时触发的ActionListener的actionPerformed方法里用到
FacesContext.getCurrentInstance().getExternalContext().dispatch("Timeout.faces");
FacesContext.getCurrentInstance().responseComplete();
timer.stop();
这样就可以了。帖子改散分贴吧 ^_^

#3


在BackingBean的事件方法里开设两线程A(时间监听20秒),B(查询),在A到达20秒后就关B,在B返回查询值时,就关A。

#4


这样也行?
我觉得可以考虑考虑javascript。不过我要看晚会去了,你自己考虑吧。88

#5


to:thomas_20(执子之手,与子偕老)
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。

#6


我想js应该可以实现定时刷新,那就可以实现这个需求。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。

#7


散分,散分了,都去买票了啊?

#8


这是个难题,直接更改 context 的状态会不会出现   AssertException ?
或者其他  并发 异常?

#9


使用interrupt()以后,当前的后台事件方法的处理并没有终止,并且过了一段时间会出现InterruptedException。
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,JSF的机制不太了解,强行使用interrupt方法可能破坏了JSF的线程管理

#10


散分吧,讨论过年的问题

#11


才这么点回复,能叫散分么?

#12


之前这个我做过,我不是用JSF,我是用HttpSessionListener接口来实现的,监听sessoin的销毁(即timeout),并触发一个动作,给你个代码片断吧。

package listeners;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;


    public class MySessionListner implements HttpSessionListener{
      //private static Log log = LogFactory.getLog(UserSessionListener.class);

      public void sessionCreated(HttpSessionEvent evt) {
        //log.info("new Session created");
System.out.println("@@@@@@@@@ Begin a new session@@@@@@@@@@@@@@");
HttpSession currentSession=(HttpSession)evt.getSession();
System.out.println(currentSession.getAttribute("user"));
      }

      public void sessionDestroyed(HttpSessionEvent evt) {
        System.out.println("@@@@@@@@@ Destroy a session@@@@@@@@@@@@@@");
HttpSession currentSession=(HttpSession)evt.getSession();
System.out.println(currentSession.getAttribute("user"));
      }

    }

#13


然后在web.xml中的<web-app>下加上 

<listener>
    <listener-class>listeners.MySessionListner</listener-class>
</listener>

,之后凡是jsp页面上生成的session,在销毁前,都会被捕捉到,你在这时进行跳转就行了。



#14


#15


关注

#16


关注 JSF

#1


jsf 我不太会,不果给你一个建议 就是 设置一个环境变量 bool 
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里

#2


呵呵,关键是怎么监视,不开线程的话很难实现,总不能用while循环吧。
问题刚刚解决了,还是用javax.swing.Timer来负责计时,然后在到时触发的ActionListener的actionPerformed方法里用到
FacesContext.getCurrentInstance().getExternalContext().dispatch("Timeout.faces");
FacesContext.getCurrentInstance().responseComplete();
timer.stop();
这样就可以了。帖子改散分贴吧 ^_^

#3


在BackingBean的事件方法里开设两线程A(时间监听20秒),B(查询),在A到达20秒后就关B,在B返回查询值时,就关A。

#4


这样也行?
我觉得可以考虑考虑javascript。不过我要看晚会去了,你自己考虑吧。88

#5


to:thomas_20(执子之手,与子偕老)
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。

#6


我想js应该可以实现定时刷新,那就可以实现这个需求。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。

#7


散分,散分了,都去买票了啊?

#8


这是个难题,直接更改 context 的状态会不会出现   AssertException ?
或者其他  并发 异常?

#9


使用interrupt()以后,当前的后台事件方法的处理并没有终止,并且过了一段时间会出现InterruptedException。
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,JSF的机制不太了解,强行使用interrupt方法可能破坏了JSF的线程管理

#10


散分吧,讨论过年的问题

#11


才这么点回复,能叫散分么?

#12


之前这个我做过,我不是用JSF,我是用HttpSessionListener接口来实现的,监听sessoin的销毁(即timeout),并触发一个动作,给你个代码片断吧。

package listeners;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;


    public class MySessionListner implements HttpSessionListener{
      //private static Log log = LogFactory.getLog(UserSessionListener.class);

      public void sessionCreated(HttpSessionEvent evt) {
        //log.info("new Session created");
System.out.println("@@@@@@@@@ Begin a new session@@@@@@@@@@@@@@");
HttpSession currentSession=(HttpSession)evt.getSession();
System.out.println(currentSession.getAttribute("user"));
      }

      public void sessionDestroyed(HttpSessionEvent evt) {
        System.out.println("@@@@@@@@@ Destroy a session@@@@@@@@@@@@@@");
HttpSession currentSession=(HttpSession)evt.getSession();
System.out.println(currentSession.getAttribute("user"));
      }

    }

#13


然后在web.xml中的<web-app>下加上 

<listener>
    <listener-class>listeners.MySessionListner</listener-class>
</listener>

,之后凡是jsp页面上生成的session,在销毁前,都会被捕捉到,你在这时进行跳转就行了。



#14


#15


关注

#16


关注 JSF