当前页面: 开发资料首页 → 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构建数据库驱动的应用程序