我正在使用JSF 2.0创建Web应用程序,我正在对全名进行验证。
<h:inputText value="#{PersonalInformationDataBean.fullName}" size="75" id="fullName" >
<f:validator validatorId="fullNameValidator" />
</h:inputText>
<font color="red"><br /><h:message for="fullName"/></font>
在java下面是我所拥有的
public class FullNameValidator implements Validator {
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
String enteredName = (String) value;
// Pattern p = Pattern.compile("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");
Pattern p = Pattern.compile("([a-zA-Z\\s]+)");
Matcher m = p.matcher(enteredName.trim());
System.out.println("trimmed data is " + enteredName.trim());
boolean matchFound = m.matches();
if (enteredName.trim().length() == 0) {
FacesMessage message = new FacesMessage();
message.setSummary("Please enter name.");
throw new ValidatorException(message);
}
if (enteredName.trim().length() < 10) {
FacesMessage message = new FacesMessage();
message.setSummary("Name should be atleast 10 characters.");
throw new ValidatorException(message);
}
if (!matchFound) {
FacesMessage message = new FacesMessage();
message.setSummary("Invalid Name.");
throw new ValidatorException(message);
}
// FacesMessage message = new FacesMessage();
// message.setSummary("");
// throw new ValidatorException(message);
}
}
当我在本地运行项目时,它运行得很好。
当我在网上接受这个项目时,我遇到了问题。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ fullName data as + Error Message +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 123343543534545 + Invalid Name +
+ fahim + Full name should be 10 characters +
+ null (blank) + NO MESSAGE, here I was expecting +
+ + result as Please enter name +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
我不明白当我没有传递任何价值时,为什么我没有收到错误信息说请输入姓名。知道我在这里缺少什么吗?
注意:
我甚至没有在trimmed data is
文件中获取catalina.out
,我在System.out.println
问题是当我在那时传递数据时,只调用验证。其他验证没有发生。请告诉我这里缺少的东西。
答案 0 :(得分:1)
您的问题的原因可能是,如果您要验证空值,则应更改web.xml
的设置,以允许空字段。
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>true</param-value>
</context-param>
但是权威并没有建议这种方式。
jsf医生说:
验证器完全符合版本2及更高版本 规范,它必须不会失败验证null或空值 除非它专门用于解决空值或空值。一个 提供应用程序范围以允许验证器 专为JSF 1.2设计,适用于JSF 2及更高版本。该 必须将javax.faces.VALIDATE_EMPTY_FIELDS设置为false 启用此向后兼容性行为。] 1
因此当您使用jsf2.0时,验证空值的另一种方法是您可以添加如下:
<h:inputText value="#{PersonalInformationDataBean.fullName}" size="75" id="fullName"
required="true" requiredMessage="Please enter name." >
并确保web.xml
'设置如下:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
但是这种方式会指责另一个不合理的东西。当你输入名字时会有一些东西而且这个表格对于这个sumbit失败了。用户将名称字段的值删除为空白,它将抛出请输入名称信息。但是页面中的名称字段仍然是预值(非空白) 所以这是一个JSF错误。为了解决这个问题,你要改变HtmlBasicRenderer#getCurrentValue()的第一部分,请看一下:JSF 2 - Bean Validation: validation failed -> empty values are replaced with last valid values from managed bean
答案 1 :(得分:0)
我猜你可以验证Validator传递的值是否为空
StringUtils.isNotEmpty(String)
并在验证其大小之前抛出ValidatorException
。
如果该字段是必填字段,您还可以考虑使用required="true"
考虑添加以下代码段:
String enteredName = (String) value;
// checks for null and empty String values
if ( StringUtils.isEmpty(enteredName) ) {
FacesMessage message = new FacesMessage();
message.setSummary("Please enter name.");
throw new ValidatorException(message);
}
// rest of your validation code
答案 2 :(得分:0)
当没有输入输入值时,不会调用验证器,这个想法是没有任何要验证的内容。这有点不直观,但应使用required =“true”属性来检查是否需要值。还有另一种选择:
<h:inputText label="Username" validatorMessage="The value entered for #{component.label} is invalid">
<f:validateRegex pattern="[A-Za-z]{10,30}"/>
</h:inputText>
你不需要== 0和&lt; 10,只是&lt; 10.使用属性requiredMessage为所需属性添加自己的消息。
请注意,您不需要使用StringUtils.isNotEmpty(String),只需:
String s;
if(s.isEmpty() {
...
另请注意,HTML 4.01中不推荐使用font标记,请尝试以下操作:
<h:message for="fullName" style="color: red"/>