NetBeans中JSF应用开发(6)

 
创建自定义转换器
尽管使用必填域和转换器进行验证非常简单,但是也非常有限。例如,验证器可以验证生日域是一个有效的日期,但是不能验证日期是之前的日期。为了调整日期验证的方式,我们将创建一个自定义验证器。我们的验证器将验证日期的格式是正确的并且是过去的日期。如果遇到错误,验证器将显示相应的消息。
要创建一个自定义转换器,你需要创建一个实现 javax.faces.converter.Converter 接口的类,并且在 faces-config.xml 中注册这个类。你可以通过 <f:converter> 标记来使用转换器。
1.       右键点击工程节点,然后选择 New > Java Class ,把类命名为 MyDateConverter ,并放在 astrologer.convert 包中,然后点击 Finish
2.       在类的声明中,实现 Converter 接口,如下:
 public class MyDateConverter implements Converter {
3.       使用 IDE 的提示来添加合适的 import 语句,并实现抽象方法。 ( 在前面部分,你使用了 IDE 提示来实现 validate 方法 ) IDE 生成两个方法: getAsObject and getAsString
4.       把下面的代码添加在方法 getAsObject ( 确保把方法声明中的 String 参数改成 value):
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        String pattern = "dd/MM/yyyy";
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Date nDate;
        try {
             nDate = sdf.parse(value);
        } catch (ParseException ex) {
            FacesMessage message = new FacesMessage();
            message.setDetail("Date is missing or not valid");
            message.setSummary("Date is missing or not valid");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ConverterException(message);
        }
        if(nDate.getTime() > new Date().getTime()){
            FacesMessage message = new FacesMessage();
            message.setDetail("Date is bigger than current date");
            message.setSummary("Date is bigger than current date");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ConverterException(message);
        }
        return nDate;
    }
5.       修改方法的签名,并把下面的代码添加到 getAsString 方法中 ( 在方法签名中,确保把 Object 参数的名字修改为 value)
public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object value) {
    return value.toString();
}
6.       使用 Alt+Shift+F 添加必须的 import 语句。 ( 你应该选择引入 java.text.ParseException java.util.Date )
7.       代开 faces-config.xml ,然后添加下面的代码:
<converter>
   <converter-id>astrologer.MyDateConverter</converter-id>
   <converter-class>astrologer.convert.MyDateConverter</converter-class>
</converter>
   
8.       打开 greeting.jsp 更新表单:
<p>Enter your name: <h:inputText value="#{UserBean.name}" id="name" required="true"/>
<h:message for="name" style="color:#f00;" /></p>
<p>Enter your email: <h:inputText value="#{UserBean.email}" id="email" required="true">
        <f:validator validatorId="astrologer.EmailValidator" />
    </h:inputText>
<h:message for="email" style="color:#f00;" /></p>
<p>Enter your birthday: <h:inputText value="#{UserBean.birthday}" id="birthday" required="true">
        <f:converter converterId="astrologer.MyDateConverter" />
    </h:inputText> <h:message for="birthday" style="color:#f00;" />
(dd/mm/yyyy)</p>
<h:commandButton value="Submit" action="#{UserBean.submit}" />
 
    
9.       运行工程,当您输入一个无效的日期或者将来的日期,您将会看到下面的错误信息:
关于自定义转换器参考书上 180 页。
书:《 Java EE 5 实用教程》
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值