Parameterisierter Validator Tag#
SomeValidator.java
import javax.el.ValueExpression; import javax.faces.application.FacesMessage; import javax.faces.component.StateHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; public class SomeValidator implements Validator, Stateholder { private ValueExpression type; private boolean transientValue; public ValueExpression getType() { return type; } public void setType(ValueExpression type) { this.type = type; } @Override public Object saveState(FacesContext context) { Object values[] = new Object[1]; values[0] = type; return values; } @Override public void restoreState(FacesContext context, Object state) { Object[] values = (Object[])state; type = (ValueExpression)values[0]; } @Override public boolean isTransient() { return transientValue; } @Override public void setTransient(boolean transientValue) { this.transientValue = transientValue; } @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { ... } }
SomeValidatorHandler.java
public class SomeValidatorHandler extends ValidateHandler { private TagAttribute type; public SomeValidatorHandler(ValidatorConfig config) { super(config); type = getRequiredAttribute("type"); } @Override protected Validator createValidator(FaceletContext context) { SomeValidator validator = (SomeValidator)context.getFacesContext().getApplication().createValidator( "intersult.some"); if (type != null) validator.setType(type.getValueExpression(context, QueryType.class)); return validator; } @Override protected MetaRuleset createMetaRuleset(Class type) { return super.createMetaRuleset(type).ignoreAll(); } }
faces-config.xml
<validator> <validator-id>intersult.some</validator-id> <validator-class>com.intersult.SomeValidator</validator-class> </validator>
intersult.taglib.xml
<tag> <tag-name>SomeValidator</tag-name> <validator> <validator-id>intersult.some</validator-id> <handler-class>com.intersult.SomeValidatorHandler</handler-class> </validator> </tag>
intersult.tld
<tag> <name>SomeValidator</name> <tag-class/> <body-content>empty</body-content> <attribute> <name>type</name> </attribute> </tag>
ViewHandler#
package com.intersult.jsf; import java.io.IOException; import javax.faces.FacesException; import javax.faces.application.ViewHandler; import javax.faces.component.UIComponent; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import com.sun.facelets.FaceletViewHandler; import com.sun.facelets.tag.jsf.ComponentSupport; public class PartialViewHandler extends FaceletViewHandler { public PartialViewHandler(ViewHandler parent) { super(parent); } @Override public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException { String region = context.getExternalContext().getRequestParameterMap().get("region"); if (region == null) { super.renderView(context, viewToRender); } else { renderRegion(context, viewToRender, region); } } private void renderRegion(FacesContext context, UIViewRoot viewToRender, String region) { try { this.buildView(context, viewToRender); UIComponent component = viewToRender.findComponent(region); ResponseWriter writer = super.createResponseWriter(context); FacesContext.getCurrentInstance().setResponseWriter(writer); ComponentSupport.encodeRecursive(context, component); writer.close(); FacesContext.getCurrentInstance().responseComplete(); } catch (IOException exception) { throw new RuntimeException(exception); } } @Override public void writeState(FacesContext context) throws IOException { String region = context.getExternalContext().getRequestParameterMap().get("region"); if (region == null) super.writeState(context); } }
Einfache Komponente#
Component:public class OutputStream extends UIComponentBase { private String url; @Override public String getFamily() { return "javax.faces.Output"; } public String getUrl() { ValueExpression expression = getValueExpression("url"); if (expression != null) return (String)expression.getValue(getFacesContext().getELContext()); return url; } public void setUrl(String url) { this.url = url; } }
Renderer:
public class OutputStreamRenderer extends Renderer { @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { OutputStream outputStream = (OutputStream)component; ResponseWriter writer = context.getResponseWriter(); URL url = new URL(outputStream.getUrl()); InputStream inputStream = null; try { inputStream = url.openStream(); IOUtils.copy(inputStream, writer); } finally { if (inputStream != null) inputStream.close(); } } }
faces-config.xml:
<component> <component-type>intersult.OutputStream</component-type> <component-class>com.intersult.OutputStream</component-class> </component> <render-kit> <render-kit-id>HTML_BASIC</render-kit-id> <renderer> <component-family>javax.faces.Output</component-family> <renderer-type>intersult.OutputStream</renderer-type> <renderer-class>com.intersult.OutputStreamRenderer</renderer-class> </renderer> </render-kit>
intersult.taglib.xml:
<tag> <tag-name>outputStream</tag-name> <component> <component-type>intersult.OutputStream</component-type> <renderer-type>intersult.OutputStream</renderer-type> </component> </tag>