自定义表单比较复杂,编写了几个组件CustomForm组件、CustomError组件、CustomValidationDecorator自定义验证该文件使用了@Override如果报错请选择项目的jdk版本为1.6。代码如下:
CustomForm.java
/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 网址: http://www.flywind.org
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.components;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.FormValidationControl;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.ValidationDecorator;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.SupportsInformalParameters;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.Environment;
import com.tapestry.app.commons.CustomValidationDecorator;
@SupportsInformalParameters
public class CustomForm implements FormValidationControl {
@Inject
private Environment environment;
@Component(id = "form", publishParameters = "context, tracker, clientValidation, zone, secure, validationId, validate, class",
inheritInformalParameters = true)
private Form form;
void beginRender(MarkupWriter writer) {
environment.push(ValidationDecorator.class, new CustomValidationDecorator(environment, writer));
}
void afterRender(MarkupWriter writer) {
environment.pop(ValidationDecorator.class);
}
@Override
public void clearErrors() {
form.clearErrors();
}
@Override
public boolean getHasErrors() {
return form.getHasErrors();
}
@Override
public boolean isValid() {
return form.isValid();
}
@Override
public void recordError(String errorMessage) {
form.recordError(errorMessage);
}
@Override
public void recordError(Field field, String errorMessage) {
form.recordError(field, errorMessage);
}
}
CustomForm.tml
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
<t:content>
<t:form t:id="form" autoFocus="false">
<t:body/>
</t:form>
</t:content>
</html>
CustomError.java
/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 网址: http://www.flywind.org
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.components;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.services.Heartbeat;
@Import(library = "CustomError.js")
public class CustomError {
@Parameter(name = "for", required = true, allowNull = false, defaultPrefix = BindingConstants.COMPONENT)
private Field field;
@Environmental
private Heartbeat heartbeat;
private Element labelElement;
boolean beginRender(MarkupWriter writer) {
final Field field = this.field;
labelElement = writer.element("span", "class", "msg");
Runnable command = new Runnable() {
public void run() {
String fieldId = field.getClientId();
labelElement.forceAttributes("id", fieldId + "-msg");
}
};
heartbeat.defer(command);
return false;
}
void afterRender(MarkupWriter writer) {
writer.end();
}
}
CustomValidationDecorator.java
/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 网址: http://www.flywind.org
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.commons;
import org.apache.tapestry5.BaseValidationDecorator;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.ValidationTracker;
import org.apache.tapestry5.corelib.components.RadioGroup;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.services.Environment;
public class CustomValidationDecorator extends BaseValidationDecorator {
private final Environment environment;
private final MarkupWriter markupWriter;
public CustomValidationDecorator(Environment environment, MarkupWriter markupWriter) {
this.environment = environment;
this.markupWriter = markupWriter;
}
@Override
public void insideLabel(Field field, Element element) {
final String radioGroupClassName = RadioGroup.class.getName();
if (field == null) {
return;
}
if (!field.getClass().getName().equals(radioGroupClassName)) {
if (field.isRequired()) {
element.addClassName("required-label");
element.getContainer().addClassName("required-label-c");
}
}
if (inError(field)) {
element.addClassName("error-label");
element.getContainer().addClassName("error-label-c");
}
}
@Override
public void insideField(Field field) {
if (field.isRequired()) {
getElement().addClassName("required-field");
getElement().getContainer().addClassName("required-field-c");
}
if (inError(field)) {
getElement().addClassName("error-field");
getElement().getContainer().addClassName("error-field-c");
}
}
private boolean inError(Field field) {
ValidationTracker tracker = getTracker();
return tracker.inError(field);
}
private ValidationTracker getTracker() {
return environment.peekRequired(ValidationTracker.class);
}
private Element getElement() {
return markupWriter.getElement();
}
}
CustomError.js
Tapestry.FieldEventManager.addMethods( {
initialize : function(field) {
this.field = $(field);
var id = this.field.id;
this.fieldContainer = this.field.parentNode;
Element.extend(this.fieldContainer);
var labelSelector = "label[for='" + id + "']";
this.label = this.field.up("form").down(labelSelector);
if (this.label) {
this.labelContainer = this.label.parentNode;
Element.extend(this.labelContainer);
}
var msgId = id + '-msg';
this.msg = $(msgId);
if (!this.msg) {
this.msg = new Element('strong', {
'id' : msgId,
'class' : 'msg'
});
this.fieldContainer.insert( {
bottom : this.msg
});
}
this.msgContainer = this.msg.parentNode;
Element.extend(this.msgContainer);
this.translator = Prototype.K;
var fem = $(this.field.form).getFormEventManager();
if (fem.validateOnBlur) {
document.observe(Tapestry.FOCUS_CHANGE_EVENT, function(event) {
/*
* If changing focus *within the same form* then perform
* validation. Note that Tapestry.currentFocusField does not
* change until after the FOCUS_CHANGE_EVENT notification.
*/
if (Tapestry.currentFocusField == this.field
&& this.field.form == event.memo.form)
this.validateInput();
}.bindAsEventListener(this));
}
if (fem.validateOnSubmit) {
$(this.field.form).observe(Tapestry.FORM_VALIDATE_FIELDS_EVENT,
this.validateInput.bindAsEventListener(this));
}
},
showValidationMessage : function(message) {
$(this.field).getStorage().validationError = true;
$(this.field.form).getStorage().validationError = true;
this.msg.update(message);
if (this.label) {
this.label.addClassName("error-label");
this.labelContainer.addClassName("error-label-c");
}
this.field.addClassName("error-field");
this.fieldContainer.addClassName("error-field-c");
this.msg.addClassName("error-msg");
this.msgContainer.addClassName("error-msg-c");
},
removeDecorations : function() {
this.msg.update(null);
if (this.label) {
this.label.removeClassName("error-label");
this.labelContainer.removeClassName("error-label-c");
}
this.field.removeClassName("error-field");
this.fieldContainer.removeClassName("error-field-c");
this.msg.removeClassName("error-msg");
this.msgContainer.removeClassName("error-msg-c");
}
} );
以上就是自定义验证所有需要的文件。以下看下使用自定义验证的代码:
CValidators1.java
/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 网址: http://www.flywind.org
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.pages;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.beaneditor.Validate;
public class CValidators1 {
@Property
@Validate("required")
private String firstName;
@Property
@Validate("required")
private String lastName;
@InjectPage
private CValidators2 validators2;
Object onSuccess(){
validators2.set(firstName, lastName);
return validators2;
}
}
CValidators1.tml
<html t:type="layout" title="tapestryStart Index" t:sidebarTitle="Framework Version"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter">
<style>
.error-msg{color:red}
</style>
<form t:type="CustomForm">
<t:errors/>
姓:<input t:type="textField" t:id="firstName" value="firstName"/><t:CustomError for="firstName"/><br/>
名字:<input t:type="textField" t:id="lastName" value="lastName"/><t:CustomError for="lastName"/><br/>
<input type="submit" value="提交"/>
</form>
</html>
CValidators2.java
/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 网址: http://www.flywind.org
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.pages;
public class CValidators2 {
private String firstName;
private String lastName;
public void set(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getName(){
return firstName + " " + lastName;
}
String[] onPassivate(){
return new String[]{firstName, lastName};
}
void onActivate(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}
CValidators2.tml
<html t:type="layout" title="tapestryStart Index" t:sidebarTitle="Framework Version"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter">
姓名:${name}<br/>
<t:pagelink page="CValidators1">返回</t:pagelink>
</html>
http://localhost/validatorcustom/cvalidators1