当前页面: 开发资料首页 → Java 专题 → JSF实例学习--JSF Weekly 电子报订阅
摘要: JSF实例学习--JSF Weekly 电子报订阅
    JSF Weekly 电子报订阅。这是网上来的一个JSF入门实例,原来它是jsf1.0版本的,我将其改为了jsf1.1版。
                  
                  
                   
                  
                  
                  
                                  
这个例子主要有三个特点:
                    一、中英文界面且资源包使用类,如中文资源包:
                  
/*
 * $Id: Resources_zh.java,v 1.2 2003/06/17 01:14:03 jack Exp $
 *
 */
package net.jackwind.jsf;
// Chinese lang. resource bundle.
public class Resources_zh extends java.util.ListResourceBundle {
static final Object[][] contents = new String[][] {
{ "locale", "请选择您的语言" },
{ "title", "JSF 演示:  电子报订阅系统 " },
{ "prompt", "您正在订阅" },
{ "newsletter", "电子报" },
{ "email", "电子信箱" },
{ "password", "密码" },
{ "confirmPassword", "确认密码" },
{ "format", "电子邮件格式" },
{ "donotuse", "请不要寄给我更多广告信息" },
{ "submit", "订阅" },
{ "url-welcome", "首页" },
{ "url-subscribe", "订阅" },
{ "passwords-not-match", "密码与重覆密码不相配。 " },
{ "go-back", "退回" },
{ "thank-you", "您的订阅申请已被提交,感谢支持。" },
{ "details", "订阅详细信息" }
};
public Object[][] getContents() {
return contents;
}
}
                 
                  二、定义了一个组件,它将用户提交的邮件地址输出时添加了一个email链接,这仅仅为了学习自定义组件。如下如示:
/*
* $Id: UIOutputEmail.java,v 1.1 2003/06/20 16:48:49 jack Exp $
*
*/
package net.jackwind.jsf;
import java.io.IOException;
  import java.util.StringTokenizer;
  import javax.faces.component.UIOutput;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
/**
  * @author JACK (Jun 19, 2003)
  * @class UIOutputEmail
  */
  public class UIOutputEmail extends UIOutput {
  private String host;
  private String user;
  
  private void parseEmail(String email) {
     StringTokenizer st = new StringTokenizer(email, "@");
  i   f (st.countTokens() != 2)
       throw new IllegalArgumentException("Invalid email address: " + email);
     user = st.nextToken();
     host = st.nextToken();
  }
  
  // This method indicates whether this component renders itself
  // or delegates rendering to a renderer.
  public boolean getRendersSelf() { 
      return true; 
  }
                   /**
  * Decode the current state of this UIComponent from the request contained in 
  * the specified FacesContext, and attempt to convert this state information 
  * into an object of the required type for this component.
  */
  // public void decode(FacesContext context) throws IOException {
  // // Not needed. 
  // }
  
  // Called during the Render Response phase
  public void encodeEnd(FacesContext context) throws IOException {
     if(user == null || host == null) {
     try {
          String clientId = getClientId(context);
          parseEmail((String)getValue());
     }catch(Exception e) {
        //System.out.println(e);
     }
    }
     ResponseWriter writer = context.getResponseWriter();
  
  // Represent this component as HTML
     writer.write("<script language='JavaScript'>\n");
     writer.write("function emailAddress(host, user) { \n");
     writer.write("document.write('
     writer.write("document.write(user + '@' + host);\n");
     writer.write("document.write('\">');\n");
     writer.write("document.write(user + '@' + host);\n");
     writer.write("document.write(\"\");\n}\n\n");
     writer.write("emailAddress('" + host + "', '" + user + "');\n");
     writer.write("</script>\n");
    }
                  }
自定义组件的标记类:
/*
 * $Id: UIOutputEmailTag.java,v 1.1 2003/06/20 16:48:49 jack Exp $
 *
 */
package net.jackwind.jsf;
import javax.faces.component.UIComponent;
import javax.faces.webapp.UIComponentTag;
import javax.faces.context.FacesContext;
import javax.faces.application.Application;
import javax.faces.el.ValueBinding;
/**
 * @author JACK(Jun 19, 2003)
 * @class UIOutputEmail
 */
public class UIOutputEmailTag extends UIComponentTag {
private String valueRef;
private String value;
public  String getComponentType() {
return "UIOutputEmail";
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public String getValueRef() {
return valueRef;
}
public void setValueRef(String newValueRef) {
valueRef = newValueRef;
}
/**
 * Return the rendererType property that selects the Renderer to be used
 * for encoding this component, or null to ask the component to render
 * itself directly. Subclasses must override this method to return the
 * appropriate value.
 */
public String getRendererType() {
return null;
}
 public void setProperties(UIComponent component) {
            super.setProperties(component);
            setStringProperty(component, "value", value); 
            setStringProperty(component, "valueRef", valueRef);  
         } 
       private void setStringProperty(UIComponent component, String attrName, String attrValue) {   
           if(attrValue == null)  
              return;   
           if(isValueReference(attrValue)) {
                FacesContext context =FacesContext.getCurrentInstance(); 
                Application application =context.getApplication();
                ValueBinding binding =application.createValueBinding(attrValue);    
                component.setValueBinding(attrName, binding);
           } 
           else {
                   component.getAttributes().put(attrName, attrValue); 
           }
      } 
      public void release() { 
         super.release();
         value = null;
         valueRef = null; 
      }
}
                  import java.util.regex.Matcher;
                    import java.util.regex.Pattern;
                  
import javax.faces.application.FacesMessage;
                    import javax.faces.component.UIComponent;
                    import javax.faces.component.UIOutput;
                    import javax.faces.context.FacesContext;
                    import javax.faces.validator.*;
/**
  * @author JACK (Jun 16, 2003)
  * @class EmailValidator
  */
  public class EmailAddressValidator implements Validator {
 /**
  * The message identifier of the Message to be created if
  * the validation fails. 
  */
  public static final String EMAIL_ADDRESS_INVALID ="net.jackwind.jsf.EMAIL_ADDRESS_INVALID";
 // Email address pattern. Used by regex.
  public static String PATTERN_EMAIL ="[a-zA-Z0-9][\\w\\.\\-]*@[a-zA-Z0-9][\\w\\.\\-]*\\.[a-zA-Z][a-zA-Z\\.]*";
  private Pattern pattern = Pattern.compile(PATTERN_EMAIL);
 public void validate(FacesContext context, UIComponent component,Object ob) {
    if ((context == null) || (component == null)) {
        throw new NullPointerException();
    }
     if (!(component instanceof UIOutput)) {
       return;
    }
  
    Object componentValue = ((UIOutput) component).getValue();
    String value = (componentValue == null ? null : componentValue.toString());
    if(value == null)
      return;
  
     if (!validateEmailAddress(value)) {
  
      FacesMessage message = new FacesMessage( FacesMessage.SEVERITY_ERROR, "邮件地址错误", "邮件地址错误"); 
      throw new ValidatorException(message);
  
     }
  }
 private boolean validateEmailAddress(String emailAddress) {
      if(emailAddress == null) return false;
      Matcher matcher = pattern.matcher(emailAddress);
      return matcher.matches();
  }
}
                  请下载全部源代码学习。
                    
                  
                    
 
↑返回目录 
前一篇: 他们在你的网站上做什么?  
 
后一篇: 学习笔记:使用JSF构建数据库驱动的应用程序