gpt4 book ai didi

validation - 验证失败后输入值未清除

转载 作者:行者123 更新时间:2023-12-04 20:41:04 25 4
gpt4 key购买 nike

我已经搜索了很多,但没有找到解决方案。

我正在使用 JSF 2.1 和 RichFaces 4.2.3 并想验证用户的登录数据

我有两个输入字段。
一个用户名和一个密码,都带有 @NotEmpty
login.xhtml

<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:mt="http://java.sun.com/jsf/composite/components">
<h:body>
<ui:composition template="/protected/user/login-template.xhtml">
<ui:define name="panel-navigation">
<ui:include src="/protected/user/login-left-menu.xhtml" />
</ui:define>
<ui:define name="contentbody">
<h:form>
<div id="content">
<div class="subcolumns">
<div class="c65l">
<div class="subcl">
<p class="sum-error-message" />
<fieldset>
<h3>
<h:outputText value="#{styleguideMessages.login}" />
</h3>
<p>
<h:outputText value="#{messages.login_text}" />
</p>
<div class="subcolumns">
<mt:inputText
id="loginName"
value="#{authenticationPM.loginName}"
label="#{messages.general_label_loginname}"
required="true" />
<div class="c33r validation"></div>
</div>
<div class="subcolumns">
<mt:inputText
id="password"
value="#{authenticationPM.password}"
label="#{styleguideMessages.db_password}"
required="true"
secret="true" />
<div class="c33r validation"></div>
</div>
<div class="subcolumns">
<h:commandLink
id="loginButton"
action="#{authenticationPM.doLogin}"
value="#{styleguideMessages.login}"
title="#{styleguideMessages.login}"
styleClass="button last" />
</div>
</fieldset>
</div>
</div>
</div>
</div>
<mt:commandButton
id="login"
action="#{authenticationPM.doLogin}"
value="hidden"
style="visibility:hidden" />
</h:form>
<script
src="#{facesContext.externalContext.requestContextPath}/js/lib/loginEnter.js"
type="text/javascript"
charset="utf-8"></script>
</ui:define>
</ui:composition>


认证PM.java
import *;

@Named
@SessionScoped
public class AuthenticationPM extends AbstractPM implements Serializable {

/**
* The user name from the login.
*/
private String userName;

/**
* password.
*/
private String password;

/**
* Returns the login name.
*
* @return String
*/
@NotNull
@Pattern(regexp = "^[^\"/\\[\\]:;|=,+?*<>]*$", message = "{user.loginname.pattern}")
public String getLoginName() {
return userName;
}

/**
* Returns the password.
*
* @return String
*/
@NotNull
public String getPassword() {
return password;
}

/**
* Sets the login name.
*
* @param loginName
* - the login name of the user
*/
public void setLoginName(String loginName) {
this.userName = loginName;
}

/**
* Sets the password.
*
* @param password
* - the password of the user
*/
public void setPassword(String password) {
this.password = password;
}

}

如果其中之一(例如密码)未填写,则验证失败并显示一条消息(应该如此)。

现在我删除用户名并输入密码。
验证失败,因为用户名为空。
它清除密码字段并显示用户名的消息。

现在错误发生了:之前输入的用户名再次出现!
我怎样才能防止这种行为?

我知道在流程验证之后,将跳过更新模型值和调用应用程序并执行渲染响应。 As described here.渲染响应采用存储在 ui 组件中的值(在应用请求时)并使用它们重新渲染而不是删除无效值。

我试过 this solution以及 this idea .两种方式都找不到我的组件。

非常感谢任何帮助或想法。

你好,
凯文

最佳答案

如果您只是从输入字段中删除用户名,则该值应作为 empty string 提交。 ,这将是用户名的合法替代品,并且也匹配定义的模式。

我只能假设,你已经配置

<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>

在你的 web.xml 中。因此,当您尝试提交一个空字段时,它被解释为 null ,这与您的 @NotNull 不匹配用户名属性上的注释。因此,该值的设置被取消并保持其先前的状态,因为它是 SessionScoped - 这是曾经输入过的用户名。

至少这是我可以想象的唯一一个在提交空字符串时不更新 (String-) 值的情况。

将此值设置为 true允许重现您所描述的行为。

您可能会问,为什么这不适用于您在删除时输入密码的文本框?由于您使用的是 secret="true"即使支持 bean 属性是 ,文本框也不会显示有关输入字符串的任何信息(即长度)。不是 设置为空(删除密码后)并且仍然包含错误的密码。

但请注意,简单地删除此属性可能会破坏其他开发人员所依赖的功能来获取 null而不是 empty string .所以你应该考虑删除 @NotNull注释和检查 null手动。

关于validation - 验证失败后输入值未清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com