比如:预设的超时时间为20秒,点击查询以后20秒一到,如果还没有查出结果,网页立即跳转到超时页面。
我原来的想法是,在方法开始的时候记录系统时间,然后在方法结束以后再获得系统时间,然后将两个时间的差与预设值进行比较,超过就跳转。但是这样有个缺陷,就是必须等方法完全执行完毕后才可以跳转,没法达到一到时就自动跳转的功能。
后来我想使用线程,利用Timer来进行计时,然后到时触发事件停止查询、自动跳转,但是JSF的机制不是很熟,好像在新开的线程里没法控制事件方法的线程,也就没法实现跳转。
不知道大家有没有在项目中遇到过类似的需求,都是怎样解决的。希望能给我一些建议,谢谢!
16 个解决方案
#1
jsf 我不太会,不果给你一个建议 就是 设置一个环境变量 bool
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里
#2
呵呵,关键是怎么监视,不开线程的话很难实现,总不能用while循环吧。
问题刚刚解决了,还是用javax.swing.Timer来负责计时,然后在到时触发的ActionListener的actionPerformed方法里用到
FacesContext.getCurrentInstance().getExternalContext().dispatch("Timeout.faces");
FacesContext.getCurrentInstance().responseComplete();
timer.stop();
这样就可以了。帖子改散分贴吧 ^_^
问题刚刚解决了,还是用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
我觉得可以考虑考虑javascript。不过我要看晚会去了,你自己考虑吧。88
#5
to:thomas_20(执子之手,与子偕老)
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。
#6
我想js应该可以实现定时刷新,那就可以实现这个需求。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。
#7
散分,散分了,都去买票了啊?
#8
这是个难题,直接更改 context 的状态会不会出现 AssertException ?
或者其他 并发 异常?
或者其他 并发 异常?
#9
使用interrupt()以后,当前的后台事件方法的处理并没有终止,并且过了一段时间会出现InterruptedException。
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,JSF的机制不太了解,强行使用interrupt方法可能破坏了JSF的线程管理
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,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"));
}
}
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,在销毁前,都会被捕捉到,你在这时进行跳转就行了。
<listener>
<listener-class>listeners.MySessionListner</listener-class>
</listener>
,之后凡是jsp页面上生成的session,在销毁前,都会被捕捉到,你在这时进行跳转就行了。
#14
顶
#15
关注
#16
关注 JSF
#1
jsf 我不太会,不果给你一个建议 就是 设置一个环境变量 bool
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里
然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
就return 到一个叶里
#2
呵呵,关键是怎么监视,不开线程的话很难实现,总不能用while循环吧。
问题刚刚解决了,还是用javax.swing.Timer来负责计时,然后在到时触发的ActionListener的actionPerformed方法里用到
FacesContext.getCurrentInstance().getExternalContext().dispatch("Timeout.faces");
FacesContext.getCurrentInstance().responseComplete();
timer.stop();
这样就可以了。帖子改散分贴吧 ^_^
问题刚刚解决了,还是用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
我觉得可以考虑考虑javascript。不过我要看晚会去了,你自己考虑吧。88
#5
to:thomas_20(执子之手,与子偕老)
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。
一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。
#6
我想js应该可以实现定时刷新,那就可以实现这个需求。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。
不过我js很烂的,跟不懂没什么区别 :(
而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。
#7
散分,散分了,都去买票了啊?
#8
这是个难题,直接更改 context 的状态会不会出现 AssertException ?
或者其他 并发 异常?
或者其他 并发 异常?
#9
使用interrupt()以后,当前的后台事件方法的处理并没有终止,并且过了一段时间会出现InterruptedException。
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,JSF的机制不太了解,强行使用interrupt方法可能破坏了JSF的线程管理
所以现在只是实现了到时跳转,但是并没有结束后台的处理。
因为刚接触,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"));
}
}
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,在销毁前,都会被捕捉到,你在这时进行跳转就行了。
<listener>
<listener-class>listeners.MySessionListner</listener-class>
</listener>
,之后凡是jsp页面上生成的session,在销毁前,都会被捕捉到,你在这时进行跳转就行了。
#14
顶
#15
关注
#16
关注 JSF