爪哇一角

共同探讨STRUTS#HIBERNATE#SPRING#EJB等技术
posts - 3, comments - 6, trackbacks - 0, articles - 99
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

十一 自定义组件标签

Posted on 2009-01-20 14:50 非洲小白脸 阅读(218) 评论(0)  编辑  收藏 所属分类: JSF

完成了UIComponent的定制后,下面就需要自定义一个Tag来与之对应。自定义Tag的目的在于设定UIComponent的属性,取得Renderer的值等。

自定义Tag需要继承UIComponentTag

package test;

import javax.faces.application.Application;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.el.ValueBinding;

import javax.faces.webapp.UIComponentTag;

继承了UIComponentTag

 
public class TextWithCmdTag extends UIComponentTag {

    private String size;

    private String value;

绑定到自定义的Component组件。

 
    public String getComponentType() {

        return "test.TextWithCmd";

    }

绑定到Renderer。这里没有设定,因为这个组件没有用Renderer编解码,而是Component自己实现的。

 
    public String getRendererType() {

        return null;

    }

    public void setProperties(UIComponent component) {

        super.setProperties(component);

      

        setStringProperty(component, "size", size);

        setStringProperty(component, "value", value);

    }

    private void setStringProperty(UIComponent component,

                       String attrName, String attrValue) {

        if(attrValue == null)

            return;

设置Tag的值绑定到Component上。这样,Component取值的时候,如果元件属性设定值找不到,就会从绑定值中去寻找。

 
        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();

        size = null;

        value = null;

    }

    public String getSize() {

        return size;

    }

    public void setSize(String size) {

        this.size = size;

    }

    public String getValue() {

        return value;

    }

    public void setValue(String value) {

        this.value = value;

    }

 }

▲绑定到Tag上的Conponent组件用的是faces-config.xml中定义的别名,所以我们随时可以替换掉对于的Component而不改变Tag代码。

自定义Tag需要在Tld中声明:

<tag>

     <name>textcmd</name>

     <tag-class>test.TextWithCmdTag</tag-class>

     <body-content>empty</body-content>

     <attribute>

        <name>size</name>

     </attribute>

     <attribute>

        <name>value</name>

        <required>true</required>

     </attribute>

 </tag>

具体程序参看示例程序。

 

新建一个JSP和一个绑定好的javaBean,就可以看到运行结果了。

对这类jspBean的建立,前面已经有很多例子了,这里就不再说了。

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<%@ taglib uri="/WEB-INF/textcmd.tld" prefix="oc"%>

<html>

<link href="../../styles.css" rel="stylesheet" type="text/css" />

<head>

<title></title>

</head>

<body>

<f:view>

       <h:form>

     Input data: <oc:textcmd size="10" value="#{componentTestBean.data}" />

       </h:form>

       <h:outputText value="#{componentTestBean.data}" />

</f:view>

</body>

</html>

运行地址:http://localhost:8080/jsfTest/pages/componentTest.faces

具体程序参看示例程序。

 


只有注册用户登录后才能发表评论。


网站导航: