终止和错误操作 23.06
在使用 webforJ 开发应用程序时,定义应用在终止或遇到错误时的行为至关重要。框架提供了通过 terminate
和 error
操作来定制这些行为的机制。
概述
App
类允许您定义在应用正常终止或遇到错误时执行的操作。这些操作是 AppCloseAction
接口的实例,可以使用以下方法设置:
setTerminateAction(AppCloseAction action)
:设置正常终止时执行的操作。setErrorAction(AppCloseAction action)
:设置发生错误时执行的操作。
可用的 AppCloseAction
实现包括:
DefaultAction
:清除浏览器并显示提示用户重新加载应用的本地化消息。NoneAction
:不执行任何操作,从而有效地重置任何先前设置的操作。MessageAction
:显示自定义链接消息。RedirectAction
:将用户重定向到指定的 URL。
webforJ 不将因抛出或未处理异常而终止视为错误操作,而是视为终止操作,因为应用正常关闭。当应用因外部错误(例如浏览器无法连接到运行应用的服务器)收到终止信号时,才发生错误操作。
默认行为
在 webforJ 版本 24.11
及更早版本中,应用默认使用 DefaultAction
处理终止和错误事件。这意味着当应用终止或遇到错误时,浏览器会显示提示用户重新加载应用的消息。
从版本 24.12
开始,webforJ 默认使用 NoneAction
处理终止和错误事件。这一变化意味着在应用终止或发生错误时不采取任何操作,允许 webforJ 将错误处理委托给配置的适当 ErrorHandler
,或回退到其通用错误处理机制。通过使用 NoneAction
,应用避免干扰默认的错误处理流程,使您能够定义自定义错误处理程序或依赖 webforJ 的内置错误管理。
自定义操作
要更改默认行为,请在您的 App
子类中使用 setTerminateAction()
和 setErrorAction()
方法。
设置自定义消息操作
如果您希望在正常终止时显示自定义消息:
public class MyApp extends App {
@Override
public void run() throws WebforjException {
// 设置自定义消息操作
setTerminateAction(new MessageAction(
"感谢您使用我们的应用程序!点击重新加载"
));
}
}
设置重定向操作
要在正常终止时将用户重定向到特定 URL:
public class MyApp extends App {
@Override
public void run() throws WebforjException {
// 在错误时设置重定向操作
setTerminateAction(new RedirectAction(
"https://example.com/error"
));
}
}
终止应用
您可以通过调用 terminate()
方法以编程方式 终止应用:
public class MyApp extends App {
@Override
public void run() throws WebforjException {
// 在某些条件下终止应用
if (someCondition) {
terminate();
}
}
}
调用 terminate()
后,将执行 setTerminateAction()
定义的操作。
终止钩子
App
类提供了钩子方法,在终止前后 执行操作:
onWillTerminate()
:在终止前调用。onDidTerminate()
:在终止后调用。
public class MyApp extends App {
@Override
protected void onWillTerminate() {
// 执行清理任务
}
@Override
protected void onDidTerminate() {
// 终止后的操作
}
}
对于更高级的生命周期管理,考虑使用 AppLifecycleListener
来处理来自外部组件的终止事件,而无需修改 App
类。这在插件架构或多个组件需要响应应用终止时特别有用。了解有关 生命周期监听器 的更多信息。
自定义终止页面
在某些情况下,您可能希望在应用结束时显示自定义终止页面,为用户提供个性化消息或额外资源。这可以通过在 App
子类中重写 onDidTerminate()
方法并将自定义 HTML 注入页面来实现。
以下是创建自定义终止页面的示例:
public class MyApp extends App {
@Override
public void run() throws WebforjException {
setTerminateAction(new NoneAction());
terminate();
}
@Override
protected void onDidTerminate() {
String html = """
<div style="display: flex; justify-content: center; align-items: center; height: 100vh; flex-direction: column;">
<h1>感谢您使用 webforJ</h1>
<p>有关更多信息,请访问 <a href="https://webforj.com">webforj.com</a></p>
</div>
""";
Page.getCurrent().executeJsVoidAsync(
String.format("document.body.innerHTML = `%s`", html)
);
}
}