这两天有个朋友在做jsf自定义验证器时遇到了一些问题,问了我。我整了好久也没能搞明白,后来发现可能是他实现自定义验证器时使用的类太老(项目用的是jsf1.2,自定义验证器时却用的jsf1.1的类-ValidatorTag,这个类在jsf1.2中已经被建议不使用,这位朋友在实现时用的tld标签也是2.0之上的,我也不确定问题是否出在这里)。
下班后没事就在jsf1.2的库上,在参考网上一些资料的情况下,自己写了一个自定义验证器的demo。该例子用途是验证email格式。现贴出代码:)
package test.managebean下的class:
package test.managebean;
/**
*
* @author SailingLee
*/
public class TestManageBean {
private String postCode;
public void doSomeThing(){
System.out.println("============doSomeThing============");
}
/**
* @return the postCode
*/
public String getPostCode() {
return postCode;
}
/**
* @param postCode the postCode to set
*/
public void setPostCode(String postCode) {
this.postCode = postCode;
}
}
package test.validator下的class:
package test.validator;
import java.io.Serializable;
//import java.text.MessageFormat;
import java.util.regex.Pattern;
//import java.util.Locale;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.faces.application.FacesMessage;
/**
*
* @author SailingLee
*/
public class CustomValidator implements Validator, Serializable {
private String length;
private String regex;
private String errorSummary;
private String errorDetail;
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
FacesMessage message = null;
if (value == null || value.toString().trim().length() == 0) {
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入不能为空!", "您的输入为空,请输入!");
//return;
}else if (value.toString().length() > Integer.parseInt(getLength())) {
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入长度超过" + getLength() + "位!", "输入长度超过" + getLength() + "位!请重新输入!");
//return;
}else if (regex != null && !regex.equals("")) {
boolean b = Pattern.matches(regex, value.toString());
if (!b) {
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入的邮编格式错误!", "输入的邮编格式错误!请确认!");
//return;
}
}
throw new ValidatorException(message);
}
/**
* @return the errorSummary
*/
public String getErrorSummary() {
return errorSummary;
}
/**
* @param errorSummary the errorSummary to set
*/
public void setErrorSummary(String errorSummary) {
this.errorSummary = errorSummary;
}
/**
* @return the errorDetail
*/
public String getErrorDetail() {
return errorDetail;
}
/**
* @param errorDetail the errorDetail to set
*/
public void setErrorDetail(String errorDetail) {
this.errorDetail = errorDetail;
}
/**
* @return the regex
*/
public String getRegex() {
return regex;
}
/**
* @param regex the regex to set
*/
public void setRegex(String regex) {
this.regex = regex;
}
/**
* @return the length
*/
public String getLength() {
return length;
}
/**
* @param length the length to set
*/
public void setLength(String length) {
this.length = length;
}
}
package test.tag下的class:
package test.tag;
import test.validator.CustomValidator;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorELTag;
import javax.faces.context.FacesContext;
import javax.servlet.jsp.JspException;
import javax.el.ValueExpression;
import javax.el.ELContext;
/**
*
* @author SailingLee
*/
public class CustomValidatorTag extends ValidatorELTag {
private ValueExpression length;
private ValueExpression regex;
private ValueExpression errorSummary;
private ValueExpression errorDetail;
@Override
protected Validator createValidator() throws JspException {
CustomValidator validator = new CustomValidator();
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
validator.setLength((String) length.getValue(elContext));
validator.setRegex((String) regex.getValue(elContext));
if (errorSummary != null)
validator.setErrorSummary((String) errorSummary.getValue (elContext));
if (errorDetail != null)
validator.setErrorDetail((String) errorDetail.getValue (elContext));
return validator;
}
/**
* @param length the length to set
*/
public void setLength(ValueExpression length) {
this.length = length;
}
/**
* @param regex the regex to set
*/
public void setRegex(ValueExpression regex) {
this.regex = regex;
}
/**
* @param errorSummary the errorSummary to set
*/
public void setErrorSummary(ValueExpression errorSummary) {
this.errorSummary = errorSummary;
}
/**
* @param errorDetail the errorDetail to set
*/
public void setErrorDetail(ValueExpression errorDetail) {
this.errorDetail = errorDetail;
}
public void release() {
length = null;
regex = null;
errorSummary = null;
errorDetail = null;
}
}
<?xml version='1.0' encoding='UTF-8'?>
<!-- =========== FULL CONFIGURATION FILE ================================== -->
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>testManageBean</managed-bean-name>
<managed-bean-class>test.managebean.TestManageBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<validator><!--看见网上很多例子都在这里加上下面两行,但经过测试,没有这两行也完全没影响。(看了下,发现这里的配置只在jsf1.1中需要) -->
<validator-id>test.validator.CustomValidator</validator-id>
<validator-class>test.validator.CustomValidator</validator-class>
</validator>
</faces-config>
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>customvalidator</short-name>
<uri>/WEB-INF/CustomValidator</uri>
<tag>
<name>email</name>
<tag-class>test.tag.CustomValidatorTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>length</name>
<required>true</required>
<deferred-value>
<type>java.lang.String</type>
</deferred-value>
</attribute>
<attribute>
<name>regex</name>
<required>true</required>
<deferred-value>
<type>java.lang.String</type>
</deferred-value>
</attribute>
<attribute>
<name>errorSummary</name>
<deferred-value>
<type>java.lang.String</type>
</deferred-value>
</attribute>
<attribute>
<name>errorDetail</name>
<deferred-value>
<type>java.lang.String</type>
</deferred-value>
</attribute>
</tag>
</taglib>
<jsp-config>
<taglib>
<taglib-uri>http://email.com</taglib-uri>
<taglib-location>/WEB-INF/CustomValidator.tld</taglib-location>
</taglib>
</jsp-config>
页面代码:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="custom" uri="http://email.com"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Custom Validate Email</title>
</head>
<body>
<f:view>
<h:form id="myform">
Email:<h:inputText id="postCode" value="#{testManageBean.postCode}">
<custom:email length="10" regex="[a-z]*@[a-z]*.[a-z]*"/>
</h:inputText>
<h:commandButton action="#{testManageBean.doSomeThing}" value="validate email"/>
</h:form>
<h:messages/>
</f:view>
</body>
</html>
使用类库是jsf1.2版本的。
效果图如下:
注:该例子中关于自定义errorSummary和errorDetail的功能没有实现。
- 大小: 7.8 KB
分享到:
相关推荐
Mojarra是JSF规范的主要实现之一,它包含了JSF 1.2的完整实现,包括组件库、渲染器、事件处理等。"mojarra-1.2_12-b01-FCS"这个版本是Mojarra 1.2系列的一个稳定版本,修复了多个bug,提高了性能和稳定性。 **学习...
5. ** faces-config.xml**:JSF配置文件,定义了组件、导航规则、转换器和验证器等。在JSF 1.2中,开发者可以通过此文件配置应用程序的行为。 6. **部署到Web应用**:为了使用JSF 1.2,你需要将`jsf.jar`文件复制到...
2. **Improved Validation and Conversion**:JSF 1.2增强了验证和转换机制,允许开发者定义自定义的验证和转换规则,提高了数据输入的准确性和一致性。 3. **Managed Beans**:JSF 1.2引入了Managed Beans,简化了...
- JSF 1.2开始支持Ajax(异步JavaScript和XML),通过Partial State Saving(部分状态保存)技术,实现了页面部分区域的更新,提升了Web应用的交互性和响应速度。 7. **FacesMessage API**: - FacesMessage API...
**JSF 1.2 简介** JavaServer Faces(JSF)是Java平台上的一个用于构建用户界面的组件模型框架,它主要用于创建Web应用程序。JSF 1.2是该框架的一个早期版本,发布于2006年,为开发者提供了丰富的UI组件和事件处理...
通过定义Validator接口的实现,开发者可以自定义输入数据的验证规则。转换器(Converter)则负责在组件值与Java对象之间进行类型转换。 ### 6. 事件处理 JSF事件模型允许在组件之间触发和监听事件。`ActionEvent`...
在这个"JSF1.2.07版源代码"中,我们可以深入理解JSF的核心机制和实现细节。 1. **JSF架构概述** JSF由多个组件构成,包括视图层、模型层、控制层和服务层。源代码中包含的组件如Facelets、UIComponent、Managed ...
这个API包“jsf1.2_04api”包含了JSF 1.2版本的类库和接口,供开发者在项目中引用和使用。 JSF的核心组件包括: 1. **Facelets**:JSF 1.2引入了Facelets作为默认的视图定义语言,替代了原来的JSP。Facelets是一种...
2. **验证框架的增强**:JSF 1.2加强了验证机制,允许开发者定义自定义验证规则,并且可以将验证错误与特定的UI组件关联。此外,新的`Validator`接口支持验证链,使得多个验证器可以依次执行。 3. **国际化和本地化...
8. **Converter**和**Validator**:JSF提供了一种机制,可以自定义数据转换和验证过程。Converter用于将用户的输入转换为模型中的类型,而Validator则在提交之前验证用户输入。 9. **FacesMessage**:框架用于向...
- **错误处理与验证**:JSF的验证框架在源代码中清晰可见,了解其工作流程可以帮助你编写自定义验证器。 5. **扩展与自定义** - **自定义组件**:通过继承`UIComponent`或其子类,可以创建自定义组件,源代码提供...
开发者可以使用这些接口来创建自定义组件,实现监听器,以及处理请求和响应。 ### 2. `jsf-ri` `jsf-ri`代表了JSF的参考实现(Reference Implementation)。它是JSF规范的具体实现,提供了所有API接口的实现细节。...
- JSF 1.2 具有六步处理生命周期:恢复视图、应用请求值、处理验证、更新模型值、调用应用和呈现响应。通过源码我们可以理解每个阶段的具体操作。 - 验证阶段是关键,源码中可以看到 `Validator` 接口及其实现,...
转换器负责将客户端表示的数据转换为服务器端可以处理的格式,验证器则确保数据符合预设的业务规则。 6. **国际化和本地化**:JSF 1.2提供了强大的I18N(国际化)和L10N(本地化)支持,允许开发者轻松地创建多语言...
- **验证框架**:JSF 1.2引入了更强大的验证机制,允许开发者定义自定义验证规则。 - **Ajax支持**:虽然不如后来的JSF 2.0版本完善,但JSF 1.2也引入了基本的Ajax功能,使页面部分更新成为可能。 4. **使用...
开发人员可以利用这些功能快速实现复杂的数据处理逻辑而无需编写大量自定义代码。 5. **事件处理**:JSF支持多种类型的事件,如用户触发的动作事件、系统级事件等。这些事件可以被监听器捕获并执行相应的处理逻辑。...
使用jsf1.2+spring3.0+hibernate3.3实现集成,利用annotation实现自动对象管理注入,用户表的登录增删改查操作,包括验证码ajax集成,消息机制,国际化处理,自定义转换器,自定义验证器等 qq:38732796 欢迎讨论
在这个"jsf_1.2_08"主题中,我们将深入探讨JSF 1.2的主要特性和组件,以及如何使用mojarra实现这一版本的JSF。 Mojarra是JSF规范的主要实现之一,它由Sun Microsystems(现在是Oracle的一部分)开发。在"mojarra-...