?? abstractrenderer.java
字號:
/*
* Copyright 2002,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.struts.faces.renderer;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.el.ValueBinding;
import javax.faces.render.Renderer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* <p>Abstract base class for concrete implementations of
* <code>javax.faces.render.Renderer</code> for the
* <em>Struts-Faces Integration Library</em>.</p>
*
* @version $Rev: 54934 $ $Date: 2004-10-16 18:07:50 +0100 (Sat, 16 Oct 2004) $
*/
public abstract class AbstractRenderer extends Renderer {
// -------------------------------------------------------- Static Variables
private static final Log log =
LogFactory.getLog(AbstractRenderer.class);
// -------------------------------------------------------- Renderer Methods
/**
* <p>Decode any new state of the specified <code>UIComponent</code>
* from the request contained in the specified <code>FacesContext</code>,
* and store that state on the <code>UIComponent</code>.</p>
*
* <p>The default implementation calls <code>setSubmittedValue()</code>
* unless this component has a boolean <code>disabled</code> or
* <code>readonly</code> attribute that is set to <code>true</code>.</p>
*
* @param context <code>FacesContext</code> for the current request
* @param component <code>UIComponent</code> to be decoded
*
* @exception NullPointerException if <code>context</code> or
* <code>component</code> is <code>null</code>
*/
public void decode(FacesContext context, UIComponent component) {
// Enforce NPE requirements in the Javadocs
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
// Disabled or readonly components are not decoded
if (isDisabled(component) || isReadOnly(component)) {
return;
}
// Save submitted value on EditableValueHolder components
if (component instanceof EditableValueHolder) {
setSubmittedValue(context, component);
}
}
/**
* <p>Render the beginning of the specified <code>UIComponent</code>
* to the output stream or writer associated with the response we are
* creating.</p>
*
* <p>The default implementation calls <code>renderStart()</code> and
* <code>renderAttributes()</code>.</p>
*
* @param context <code>FacesContext</code> for the current request
* @param component <code>UIComponent</code> to be decoded
*
* @exception NullPointerException if <code>context</code> or
* <code>component</code> is <code>null</code>
*
* @exception IOException if an input/output error occurs
*/
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
// Enforce NPE requirements in the Javadocs
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
if (log.isTraceEnabled()) {
log.trace("encodeBegin(id=" + component.getId() +
", family=" + component.getFamily() +
", rendererType=" + component.getRendererType() + ")");
}
// Render the element and attributes for this component
ResponseWriter writer = context.getResponseWriter();
renderStart(context, component, writer);
renderAttributes(context, component, writer);
}
/**
* <p>Render the children of the specified <code>UIComponent</code>
* to the output stream or writer associated with the response we are
* creating.</p>
*
* <p>The default implementation iterates through the children of
* this component and renders them.</p>
*
* @param context <code>FacesContext</code> for the current request
* @param component <code>UIComponent</code> to be decoded
*
* @exception NullPointerException if <code>context</code> or
* <code>component</code> is <code>null</code>
*
* @exception IOException if an input/output error occurs
*/
public void encodeChildren(FacesContext context, UIComponent component)
throws IOException {
if (context == null || component == null) {
throw new NullPointerException();
}
if (log.isTraceEnabled()) {
log.trace("encodeChildren(id=" + component.getId() +
", family=" + component.getFamily() +
", rendererType=" + component.getRendererType() + ")");
}
Iterator kids = component.getChildren().iterator();
while (kids.hasNext()) {
UIComponent kid = (UIComponent) kids.next();
kid.encodeBegin(context);
if (kid.getRendersChildren()) {
kid.encodeChildren(context);
}
kid.encodeEnd(context);
}
if (log.isTraceEnabled()) {
log.trace("encodeChildren(id=" + component.getId() + ") end");
}
}
/**
* <p>Render the ending of the specified <code>UIComponent</code>
* to the output stream or writer associated with the response we are
* creating.</p>
*
* <p>The default implementation calls <code>renderEnd()</code>.</p>
*
* @param context <code>FacesContext</code> for the current request
* @param component <code>UIComponent</code> to be decoded
*
* @exception NullPointerException if <code>context</code> or
* <code>component</code> is <code>null</code>
*
* @exception IOException if an input/output error occurs
*/
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
// Enforce NPE requirements in the Javadocs
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
if (log.isTraceEnabled()) {
log.trace("encodeEnd(id=" + component.getId() +
", family=" + component.getFamily() +
", rendererType=" + component.getRendererType() + ")");
}
// Render the element closing for this component
ResponseWriter writer = context.getResponseWriter();
renderEnd(context, component, writer);
}
// --------------------------------------------------------- Package Methods
// ------------------------------------------------------- Protected Methods
/**
* <p>Render nested child components by invoking the encode methods
* on those components, but only when the <code>rendered</code>
* property is <code>true</code>.</p>
*/
protected void encodeRecursive(FacesContext context, UIComponent component)
throws IOException {
// suppress rendering if "rendered" property on the component is
// false.
if (!component.isRendered()) {
return;
}
// Render this component and its children recursively
if (log.isTraceEnabled()) {
log.trace("encodeRecursive(id=" + component.getId() +
", family=" + component.getFamily() +
", rendererType=" + component.getRendererType() +
") encodeBegin");
}
component.encodeBegin(context);
if (component.getRendersChildren()) {
if (log.isTraceEnabled()) {
log.trace("encodeRecursive(id=" + component.getId() +
") delegating");
}
component.encodeChildren(context);
} else {
if (log.isTraceEnabled()) {
log.trace("encodeRecursive(id=" + component.getId() +
") recursing");
}
Iterator kids = component.getChildren().iterator();
while (kids.hasNext()) {
UIComponent kid = (UIComponent) kids.next();
encodeRecursive(context, kid);
}
}
if (log.isTraceEnabled()) {
log.trace("encodeRecursive(id=" + component.getId() + ") encodeEnd");
}
component.encodeEnd(context);
}
/**
* <p>Return <code>true</code> if the specified component is disabled.</p>
*
* @param component <code>UIComponent</code> to be checked
*/
protected boolean isDisabled(UIComponent component) {
Object disabled = component.getAttributes().get("disabled");
if (disabled == null) {
return (false);
}
if (disabled instanceof String) {
return (Boolean.valueOf((String) disabled).booleanValue());
} else {
return (disabled.equals(Boolean.TRUE));
}
}
/**
* <p>Return <code>true</code> if the specified component is read only.</p>
*
* @param component <code>UIComponent</code> to be checked
*/
protected boolean isReadOnly(UIComponent component) {
Object readonly = component.getAttributes().get("readonly");
if (readonly == null) {
return (false);
}
if (readonly instanceof String) {
return (Boolean.valueOf((String) readonly).booleanValue());
} else {
return (readonly.equals(Boolean.TRUE));
}
}
/**
* <p>Render the element attributes for the generated markup related to this
* component. Simple renderers that create a single markup element
* for this component should override this method and include calls to
* to <code>writeAttribute()</code> and <code>writeURIAttribute</code>
* on the specified <code>ResponseWriter</code>.</p>
*
* <p>The default implementation does nothing.</p>
*
* @param context <code>FacesContext</code> for the current request
* @param component <code>EditableValueHolder</code> component whose
* submitted value is to be stored
* @param writer <code>ResponseWriter</code> to which the element
* start should be rendered
*
* @exception IOException if an input/output error occurs
*/
protected void renderAttributes(FacesContext context, UIComponent component,
ResponseWriter writer) throws IOException {
}
/**
* <p>Render the element end for the generated markup related to this
* component. Simple renderers that create a single markup element
* for this component should override this method and include a call
* to <code>endElement()</code> on the specified
* <code>ResponseWriter</code>.</p>
*
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -