JSF验证的基础用法,官方文档有一些代码说明,可以自己搜一下,或者看下面的链接
http://www.mastertheboss.com/web-interfaces/293-jsf-validation-tutorial.html?showall=1
本篇略过基础的annotation标签和JSF自定义验证的内容,主要简单说一下用jsf验证时遇到的问题,网上关于JSF比较细节的资料或者例子比较少,查了半天才发现解决方法。
应用场景:
自定义了一个Manage Bean,即action类,对数据进行增删改查
添加数据的JSF页面:有个空表单需要在提交时验证数据
编辑数据的JSF页面:有个编辑数据的表单,提交时需要验证
问题:两个表单要验证的字段不一样,有些数据不需要验证,有些数据需要多个字段交叉验证
解决: 主要用Groups属性,将要验证的字段分类
抽取的部分代码示例:
ManageBean
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.example.ejb.service.UserService;
import org.example.web.validator.UserAddValidator; //自己建一个空的interface,用于定义group
import org.example.web.validator.UserEditValidator; //自己建一个空的interface
@Named("userManageBean")
@RequestScoped
public class UserManageBean implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
@Size(min=2, max=12, message="长度必须大于2,小于12")
private String userName;
@Size(min=6, max=12, message="长度必须大于6,小于12")
private String password="";
@Size(min=6, max=12, message="长度必须大于6,小于12")
private String repassword="";
@Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误")
private String personId;
//用于后台验证的service
@EJB
private UserService userService;
public UserManageBean() {
}
@AssertTrue(message = "密码不一致!", groups=UserAddValidator.class)
public boolean isPasswordsEquals() {
return password.equals(repassword);
}
//添加用户时,身份证必须未存在,忽略具体的check代码,下同
@AssertTrue(message = "该用户身份证已存在!", groups=UserAddValidator.class)
public boolean isPersonIdExsists() {
return userService.checkPersonId(personId);
}
//添加用户时,账号必须不存在
@AssertTrue(message = "该用户账号已存在!", groups=UserAddValidator.class)
public boolean isUserNotExsists() {
return userService.checkUserName(userName);
}
//编辑用户时,不能把账号改成别人已有的身份证
@AssertTrue(message = "该用户身份证已存在!", groups=UserEditValidator.class)
public boolean isPersonIdConflig() {
return userService.checkPersonId(id, personId);
}
public String update() {
XXXXXXXXX
return SUCCESS;
}
public String add() {
XXXXXXXXXX
return SUCCESS;
}
。。。。。。一堆getter setter。。。。
}
add页面的表单代码
<h:form>
<rich:graphValidator id="userValidator" value="#{userManageBean}"
groups="org.example.web.validator.UserAddValidator">
<rich:panel header="用户添加" width="100%">
<rich:message for="userValidator" />
<h:panelGrid columns="3">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="帐户:" />
</h:panelGrid>
<h:inputText id="userName" value="#{userManageBean.userName }">
<rich:validator />
</h:inputText>
<rich:message for="userName" />
</h:panelGrid>
<h:panelGrid columns="3">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="密码:" />
</h:panelGrid>
<h:inputSecret id="password" value="#{userManageBean.password }">
<rich:validator />
</h:inputSecret>
<rich:message for="password" />
</h:panelGrid>
</h:panelGrid>
<h:panelGrid columns="3">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="身份证:" />
</h:panelGrid>
<h:inputText id="personId" value="#{userManageBean.personId }">
<rich:validator />
</h:inputText>
<rich:message for="personId" />
</h:panelGrid>
<h:panelGrid columns="4">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="重复密码:" />
</h:panelGrid>
<h:inputSecret id="repassword" value="#{userManageBean.repassword }">
<rich:validator />
</h:inputSecret>
<rich:message for="repassword" />
</h:panelGrid>
<h:commandButton value="提 交" action="#{userManageBean.add}"
style="font-size:14px; font-weight:bold;" />
</rich:panel>
</rich:graphValidator>
</h:form>
edit页面代码
<h:form>
<rich:graphValidator id="userValidator" value="#{userManageBean}"
groups="org.example.web.validator.UserEditValidator">
<h:inputHidden value="#{userManageBean.id }" />
<rich:panel header="用户编辑" width="100%">
<rich:message for="userValidator" />
<h:panelGrid columns="3">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="帐户:" />
</h:panelGrid>
<h:inputText id="userName" value="#{userManageBean.userName }">
<rich:validator />
</h:inputText>
<rich:message for="userName" />
</h:panelGrid>
<h:panelGrid columns="3">
<h:panelGrid columns="2">
<h:outputText value="*" style="color:red" />
<h:outputText value="身份证:" />
</h:panelGrid>
<h:inputText id="personId" value="#{userManageBean.personId }">
<rich:validator />
</h:inputText>
<rich:message for="personId" />
</h:panelGrid>
</h:panelGrid>
<h:commandButton value="保 存 " action="#{userManageBean.update}"
style="font-size:14px; font-weight:bold;" />
</rich:panel>
</rich:graphValidator>
</h:form>
UserAddValidator UserEditValidator就是一个空的interface
public interface UserAddValidator {
}
public interface UserEditValidator {
}
上面的代码执行时,在add页面,不会执行被groups标记为UserEditValidator的验证;同样edit页面提交时也不会执行groups被标记为UserAddValidator的验证
转载标明源 http://asyty.iteye.com/blog/1420326
分享到:
相关推荐
在"jsf/jstl/MyFaces包"中,包含的JSTL包意味着你可以直接在JSF应用中使用JSTL的功能。这使得开发者能够将业务逻辑与视图层更好地分离,提高代码的可读性和可维护性。 将这些包放入项目的`lib`目录,或者将其配置到...
例如,`required`属性确保字段不为空,`converter`属性用于转换输入值到特定类型,`validator`属性则允许我们指定一个自定义验证函数。 然而,内置验证器可能无法满足所有复杂业务需求,这就需要我们创建自定义验证...
- **数据绑定**:JSF使用EL(Expression Language)将组件属性与模型数据绑定,简化了数据的获取和设置。 - **事件处理**:JSF支持事件模型,允许组件触发和监听自定义事件。 - **国际化与本地化**:JSF内置了支持...
例如,`<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>`导入了JSF核心库,`prefix="f"`定义了前缀,使得我们可以使用`<f:...>`来调用该库中的标签。 1. `h:inputTextarea`是JSF中的文本区域组件,其...
综上所述,"JSF/JDBC试题管理系统 netbeans & java DB"是一个使用现代Web技术构建的教育软件,它结合了前端的JSF、CSS和JavaScript以及后端的JDBC和Java DB,通过NetBeans IDE进行开发,实现了用户登录、试题管理等...
4. **jsf-api.jar**: JSF API库,包含了JSF框架的接口定义,供开发者在应用程序中引用和使用。 5. **jsf-facelets.jar**: Facelets是JSF推荐的视图表示技术,它是一种XML-based的模板语言,用于创建JSF组件和页面...
自定义验证器可以通过实现`javax.faces.validator.Validator`接口或使用`@FacesValidator`注解进行创建。 "registraction"可能是一个注册过程的示例,其中包含了对用户输入数据的验证。在注册表单中,常见的验证...
JSF允许开发者创建自己的验证器,并通过 `validator` 属性将其绑定到组件上。 ##### 创建自定义验证器: ```java @FacesValidator("emailValidator") public class EmailValidator implements Validator { @...
xmlns:ui="http://java.sun.com/jsf/facelets"> <title>Base Template</title> </head> <ui:insert name="header">Default Header</ui:insert> <ui:insert name="content">Default Content</ui:insert> ...
3. **应用验证**: 在UI组件上设置`validator`属性,指定要使用的验证器ID。 JSF还提供了预定义的验证器,如`LengthValidator`(检查长度)、`IntegerValidator`(检查是否为整数)等。这些验证器可以直接通过标签...
RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。
在JSF页面(`.xhtml`文件)中,你可以通过`converter`和`validator`属性指定它们,如下所示: ```html <f:converter converterId="customIntegerConverter" /> <f:validator validatorId="ageValidator" /> </h:...
4. 验证器可以通过在UI组件上使用`<f:validator>`标签或者在字段的属性中指定`validatorId`来指定。 5. 验证失败时,可以通过`FacesMessage`向用户反馈错误信息,例如设置消息的严重性、总结和细节。 在JSF的应用中...
JSF 2.0 对表单数据的处理机制进行了优化,包括自动表单验证、错误消息展示等功能,有效提升了用户体验。 ##### 2.5 事件处理机制 事件处理机制得到了加强,包括客户端事件处理、服务器端事件处理等,这为开发者...
4. **ajaxSingle属性**: - 当设置`ajaxSingle`为`true`时,仅提交当前组件,并只针对当前组件进行验证,其他组件不受影响。与`immediate="true"`不同,后者跳过所有验证,但`ajaxSingle`仅限于Ajax请求。 5. **...
这可以通过在`h:inputText`或其他组件的`validator`属性中指定自定义验证器的全限定类名来完成。例如: ```xml 邮箱"> <f:validator validatorId="customEmailValidator" /> </h:inputText> ``` 在这里,`...
JSF(JavaServer Faces)是一种用于构建Web应用程序的Java框架,它提供了丰富的组件库来简化UI开发。在JSF中,H标签是一组与HTML元素相对应的UI组件,它们被设计用来创建用户界面并与服务器进行交互。这些H标签允许...
本资源包包含了JSF从入门到进阶的多个方面,包括基础教程、核心组件库(LIB)、Ajax4JSF的使用以及项目创建的指导,是学习JSF的宝贵资料。 1. **JSF入门教程**:JSF的基础知识讲解,涵盖了JSF的基本概念、架构和工作...
JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术框架,它提供了一种声明式的方法来创建用户界面,并且处理与后端数据模型的交互。在这个"jsf实现登录功能"的例子中,我们将探讨如何利用JSF来构建...