loginForm 登录表单

loginForm 是一个可以使用用户名和密码验证用户的表单。

  • XML 元素:loginForm

  • Java 类:JmixLoginForm

基本用法

默认情况下,loginForm 包含用户名和密码字段、登录按钮以及 3 个可选元素:地区语言下拉框、Remember me(记住我) 复选框以及 Forgot password(忘记密码) 按钮。可以通过配置属性显示或隐藏可选元素。

login form

下面是一个简单用例,用户可以通过登录表单进行身份验证:

<loginForm id="loginForm"/>
@Autowired
private LoginViewSupport loginViewSupport;
@Subscribe("loginForm")
public void onLogin(AbstractLogin.LoginEvent event) {
    try {
        loginViewSupport.authenticate(
                AuthDetails.of(event.getUsername(), event.getPassword())
                        .withLocale(loginForm.getSelectedLocale()) (1)
                        .withRememberMe(loginForm.isRememberMe()) (2)
        );
    } catch (BadCredentialsException | DisabledException | LockedException | AccessDeniedException e) {
        event.getSource().setError(true);
    }
}
1 使用选择的地区语言。
2 根据复选框的值检查是否在多个会话中记住用户。

自定义

表单支持自定义标题、字段名以及登录失败的错误消息。使用内部的 XML 元素 formerrorMessage 并指定属性值即可:

<loginForm id="loginForm">
    <form title="Welcome"
          username="Username or email"
          password="Password"
          rememberMe="Remember me"
          submit="Log in"
          forgotPassword="Forgot password"/>

    <errorMessage title="Login failed"
                  message="Check that you have entered the correct username and password and try again"/>
</loginForm>
属性值可以是文本或者 消息包 中的键值。

修改应用程序的地区语言

用户可以在进入应用程序之前选择地区语言。需要 配置地区语言,然后用户可以在地区下拉框进行选择。

在登录表单中,可以使用 LocaleChangedEvent 处理器修改语言而无需重新加载页面。读取 消息包 中本地化的信息并设置:

@Autowired
private MessageBundle messageBundle;

@Subscribe("loginForm")
public void onLoginFormLocaleChanged(EnhancedLoginForm.LocaleChangedEvent event) {
    UI.getCurrent().getPage().setTitle(messageBundle.getMessage("LoginView.title"));

    final JmixLoginI18n loginI18n = JmixLoginI18n.createDefault();

    final JmixLoginI18n.JmixForm form = new JmixLoginI18n.JmixForm();
    form.setTitle(messageBundle.getMessage("loginForm.headerTitle"));
    form.setUsername(messageBundle.getMessage("loginForm.username"));
    form.setPassword(messageBundle.getMessage("loginForm.password"));
    form.setSubmit(messageBundle.getMessage("loginForm.submit"));
    form.setForgotPassword(messageBundle.getMessage("loginForm.forgotPassword"));
    form.setRememberMe(messageBundle.getMessage("loginForm.rememberMe"));
    loginI18n.setForm(form);

    final LoginI18n.ErrorMessage errorMessage = new LoginI18n.ErrorMessage();
    errorMessage.setTitle(messageBundle.getMessage("loginForm.errorTitle"));
    errorMessage.setMessage(messageBundle.getMessage("loginForm.badCredentials"));
    loginI18n.setErrorMessage(errorMessage);

    loginForm.setI18n(loginI18n);
}

这种方法能直接修改语言,提升用户体验。

XML 属性

forgotPasswordButtonVisible

设置是否显示 Forgot password(忘记密码) 按钮。

localesVisible

设置是否显示地区语言下拉框。

rememberMeVisible

设置是否显示 Remember me(记住我) 复选框。

事件和处理器

在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 CodeGenerate 菜单(Alt+Insert / Cmd+N)生成。

ForgotPasswordEvent

当用户点击 Forgot password(忘记密码) 时,发送 ForgotPasswordEvent 事件。为该事件添加处理器可以为用户提供找回密码的功能。

LocaleChangedEvent

当用户选择不同的地区语言时发送 LocaleChangedEvent 事件。在这个事件的处理器中可以用新选择的语言更新表单的字段标签和错误信息。

LoginEvent

当用户尝试登录时发送 LoginEvent 事件。

RememberMeChangedEvent

Remember me(记住我) 复选框的选择状态发生变化时发送 RememberMeChangedEvent 事件。

参考