爪哇一角

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

十 自定义UIComponent

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

这里介绍的是让Component自身负责编码,解码的例子。

我们设置一个简单的组件,一个文本框加一个按钮。

这里我们可以继承已经实现的UIComponent组件UIInput

package test;

import java.io.IOException;

import java.util.Map;

import javax.faces.component.UIInput;

import javax.faces.context.FacesContext;

import javax.faces.context.ResponseWriter;

继承已经实现UIComponentUIInput

 
public class UITextWithCmd extends UIInput {

private static final String TEXT = ".text";

    private static final String CMD = ".cmd";

    //不使用Renderer进行解码

可以设定此组件的解码,编码不使用Renderer

 
    public UITextWithCmd() {

        setRendererType(null); 

    }

    //--------编码,生成HTML标签--------------

    public void encodeBegin(FacesContext context)

实现前台表现层的编码。可以编写成HTML或者其他表现层语言。

 
                                      throws IOException {

        ResponseWriter writer = context.getResponseWriter();

        String clientId = getClientId(context);

      

        encodeTextField(writer, clientId);

        encodeCommand(writer, clientId);

    }

    private void encodeTextField(ResponseWriter writer,

                        String clientId) throws IOException {

        writer.startElement("input", this);

        writer.writeAttribute("name", clientId + TEXT, null);

      

        //getValue()继承于UIInput

        Object value = getValue();

        if(value != null) {

            writer.writeAttribute("value",

                                  value.toString(), null);

        }

        String size = (String) getAttributes().get("size");

        if(size != null) {

            writer.writeAttribute("size", size, null); 

        }

        writer.endElement("input");

    }

    private void encodeCommand(ResponseWriter writer,

                        String clientId) throws IOException {

        writer.startElement("input", this);

        writer.writeAttribute("type", "submit", null);

        writer.writeAttribute("name", clientId + CMD, null);

        writer.writeAttribute("value", "submit", null);

        writer.endElement("input");

    }

实现标签输入值的解码。取得标签的输入值绑定到响应的Bean

 
    // ..........解码,取得标签的输入值...................................

    public void decode(FacesContext context) {

        Map reqParaMap = context.getExternalContext().

                                getRequestParameterMap();

        String clientId = getClientId(context);

        String submittedValue =

                   (String) reqParaMap.get(clientId + TEXT);

        setSubmittedValue(submittedValue);

        setValid(true);

    }

}

在配置文件faces-config.xml中声明自定义组件。

<!-- 自定义组件 -->

 <component>

     <component-type>test.TextWithCmd</component-type>

     <component-class>test.UITextWithCmd</component-class>

 </component>

这样,自定义的UIComponent组件就完成了。

 


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


网站导航: