JSF 自定义组件

E:/workspace/zdy/src/com/Field/FieldComponent.java
package  com.Field;

import  javax.faces.component.UIInput;
import  javax.faces.context.FacesContext;

// 继承UIInput类
public   class  FieldComponent  extends  UIInput  {
    
// 定义image属性名称src
    private String src;
    
// 定义image属性名称height
    private String height;
    
// 定义image属性名称width
    private String width;
    
// 定义label控件
    private String label;
    
//定义table中td的width属性
    private String tdwidth;
    
    @Override
    
public Object saveState(FacesContext context) {
        
// 定义values数组,用来保存属性
        Object values[] = new Object[6];
        values[
0= super.saveState(context);
        
// 保存文件路径src到values[1]中
        values[1= src;
        
// 保存image的height属性
        values[2= height;
        
// 保存image的width属性
        values[3= width;
        
        
// 保存label的值
        values[4= label;
        
// 保存table中td的width值
        values[5= tdwidth;
        
return ((Object) (values));
    }


    
//必要的
    @Override
    
public void restoreState(FacesContext context, Object state) {
        Object values[] 
= (Object[]) state;
        
super.restoreState(context, values[0]);
        src 
= (String) values[1];
        height
=(String) values[2];
        width
=(String) values[3];
        label
=(String) values[4];
        tdwidth
=(String) values[5];
    }

    
    
//必要的
    public FieldComponent() {
        
this.setRendererType("Field");
    }

    
    @Override
    
public String getFamily() {
        
return "Field";
    }


    
public boolean isError() {
        
return !this.isValid();
    }

    
    
// 生成src的get方法
    public String getSrc() {
        
return src;
    }


    
// 生成src的set方法
    public void setSrc(String src) {
        
this.src = src;
    }

    
    
//生成height的get方法
    public String getHeight() {
        
return height;
    }


    
//生成height的set方法
    public void setHeight(String height) {
        
this.height = height;
    }

    
    
//生成width的get方法
    public String getWidth() {
        
return width;
    }


    
//生成width的set方法
    public void setWidth(String width) {
        
this.width = width;
    }


    
//生成label控件的get方法
    public String getLabel() {
        
return label;
    }


    
//生成label控件的set方法
    public void setLabel(String label) {
        
this.label = label;
    }


    
public String getTdwidth() {
        
return tdwidth;
    }


    
public void setTdwidth(String tdwidth) {
        
this.tdwidth = tdwidth;
    }

}

E:/workspace/zdy/src/com/Field/FieldTag.java
package  com.Field;

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;

import  com.Field.FieldComponent;

public   class  FieldTag  extends  UIComponentTag  {
    
// 定义变量src用以保存文件路径
    private String src;

    
// 定义变量height用以保存图片的属性height
    private String height;

    
// 定义变量width用以保存image的属性width
    private String width;
    
    
// 定义label属性
    private String label;
    
    
private String tdwidth;

    
/**
     * 
@see javax.faces.webapp.UIComponentTag#setProperties
     *      (javax.faces.component.UIComponent)
     
*/

    @Override
    
protected void setProperties(UIComponent component) {
        
/* You have to call the super class */
        
super.setProperties(component);
        
// ((FieldComponent) component).setSrc(src);这行可加可不加
        ((FieldComponent) component).setSrc(src);
        
// 下面的初始值必须要加
        ((FieldComponent) component).setHeight(height);
        ((FieldComponent) component).setWidth(width);
        
//下面是label
        ((FieldComponent) component).setLabel(label);
        
        ((FieldComponent) component).setTdwidth(tdwidth);
        
        FacesContext context 
= FacesContext.getCurrentInstance();
        Application application 
= context.getApplication();

        
//TODO table中td的属性width
        if (UIComponentTag.isValueReference(tdwidth)) {
            ValueBinding tdwidthbinding 
= application.createValueBinding(tdwidth);
            component.setValueBinding(
"tdwidth", tdwidthbinding);
        }
else{
            ((FieldComponent) component).setTdwidth(tdwidth);
        }

        
        
//TODO label控件
        if (UIComponentTag.isValueReference(label)) {
            
// 创建一个ValueBinding对象,将label路径保binding到label中
            ValueBinding labelbinding = application.createValueBinding(label);
            component.setValueBinding(
"label", labelbinding);
        }
 else {
            
// 对FieldComponent类中的src进行赋值
            ((FieldComponent) component).setLabel(label);
        }

        
        
// TODO image的src属性设置
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(src)) {
            
// 创建一个ValueBinding对象,将src路径保binding到src中
            ValueBinding binding = application.createValueBinding(src);
            component.setValueBinding(
"src", binding);
        }
 else {
            
// 对FieldComponent类中的src进行赋值
            ((FieldComponent) component).setSrc(src);
        }


        
// TODO image的height属性设置
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(height)) {
            
// 创建一个ValueBinding对象,将图片height属性binding到height中
            ValueBinding bindingheight = application.createValueBinding(height);
            component.setValueBinding(
"height", bindingheight);
        }
 else {
            ((FieldComponent) component).setHeight(height);
        }


        
// TODO image的width属性设置
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(width)) {
            
// 创建一个ValueBinding对象,将图片width属性binding到width中
            ValueBinding bindingwidth = application.createValueBinding(width);
            component.setValueBinding(
"width", bindingwidth);
        }
 else {
            ((FieldComponent) component).setWidth(width);
        }

    }


    
/**
     * 
@see javax.faces.webapp.UIComponentTag#getComponentType() 必要的方法,如没有则类报错.
     
*/

    @Override
    
public String getComponentType() {
        
return "Field";
    }


    
/**
     * 
@see javax.faces.webapp.UIComponentTag#getRendererType() 必要的方法,如没有则类报错.
     
*/

    @Override
    
public String getRendererType() {
        
return "Field";
    }


    
public String getSrc() {
        
return src;
    }


    
public void setSrc(String src) {
        
this.src = src;
    }


    
public String getHeight() {
        
return height;
    }


    
public void setHeight(String height) {
        
this.height = height;
    }


    
public String getWidth() {
        
return width;
    }


    
public void setWidth(String width) {
        
this.width = width;
    }


    
public String getLabel() {
        
return label;
    }


    
public void setLabel(String label) {
        
this.label = label;
    }


    
public String getTdwidth() {
        
return tdwidth;
    }


    
public void setTdwidth(String tdwidth) {
        
this.tdwidth = tdwidth;
    }

}

E:/workspace/zdy/src/com/Field/FieldRenderer.java
package  com.Field;

import  java.io.IOException;

import  javax.faces.application.Application;
import  javax.faces.component.UIComponent;
import  javax.faces.context.FacesContext;
import  javax.faces.context.ResponseWriter;
import  javax.faces.el.ValueBinding;
import  javax.faces.render.Renderer;
import  javax.faces.webapp.UIComponentTag;

import  com.Field.FieldComponent;

// 继承Renderer类
public   class  FieldRenderer  extends  Renderer  {

    @Override
    
public void encodeBegin(FacesContext context, UIComponent component)
            
throws IOException {
        FieldComponent fieldComponent 
= (FieldComponent) component;
        ResponseWriter writer 
= context.getResponseWriter();
        writer.write(
"<table>");
        writer.write(
"<tr>");
        writer.write(
"<td align='center'>");
        
// 引用下面的encodesrc方法
        encodesrc(writer, fieldComponent);
        writer.write(
"</td>");
        writer.write(
"</tr>");
        writer.write(
"<tr>");
        writer.write(
"<td align='center' style='word-wrap:break-word;' width='"
                
+ encodetdwidth(writer, fieldComponent) + "'>");
        
// 引用下面的encodelabel方法
        encodelabel(writer, fieldComponent);
        writer.write(
"</td>");
        writer.write(
"</tr>");
        writer.write(
"</table>");

        writer.flush();
    }



    
private String encodetdwidth(ResponseWriter writer,
            FieldComponent fieldComponent) 
throws IOException {
        FacesContext currentInstance 
= FacesContext.getCurrentInstance();
        Application application 
= currentInstance.getApplication();

        
// TODO table中td的属性width
        
// TODO label设置
        Object tdwidth;
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(fieldComponent.getTdwidth())) {
            
// 创建ValueBinding的对象保存src路径
            ValueBinding binding = application
                    .createValueBinding(fieldComponent.getTdwidth());
            tdwidth 
= binding.getValue(currentInstance);
        }
 else {
            tdwidth 
= fieldComponent.getTdwidth();
        }

        writer.startElement(
"tdwidth", fieldComponent);
        
return (String) tdwidth;
    }


    
// 定义encodelabel方法
    private void encodelabel(ResponseWriter writer,
            FieldComponent fieldComponent) 
throws IOException {
        FacesContext currentInstance 
= FacesContext.getCurrentInstance();
        Application application 
= currentInstance.getApplication();
        
// TODO label设置
        Object labelvalue;
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(fieldComponent.getLabel())) {
            
// 创建ValueBinding的对象保存src路径
            ValueBinding binding = application
                    .createValueBinding(fieldComponent.getLabel());
            labelvalue 
= binding.getValue(currentInstance);
        }
 else {
            labelvalue 
= fieldComponent.getLabel();
        }

        writer.startElement(
"label", fieldComponent);
        
if (!fieldComponent.isError()) {
            
// 当HTML标签有某属性时才应用writeAttribute
            
// 当没有标签属性时用write直接输出
            writer.write((String) labelvalue);
        }

        writer.endElement(
"label");
    }


    
// 定义encodesrc方法
    private void encodesrc(ResponseWriter writer, FieldComponent fieldComponent)
            
throws IOException {
        FacesContext currentInstance 
= FacesContext.getCurrentInstance();
        Application application 
= currentInstance.getApplication();

        
// TODO image的src属性设置
        Object path;
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(fieldComponent.getSrc())) {
            
// 创建ValueBinding的对象保存src路径
            ValueBinding binding = application
                    .createValueBinding(fieldComponent.getSrc());
            path 
= binding.getValue(currentInstance);
        }
 else {
            path 
= fieldComponent.getSrc();
        }


        
// TODO image的height属性设置
        Object height;
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(fieldComponent.getHeight())) {
            
// 创建ValueBinging的对象保存height属性
            ValueBinding bindingheight = application
                    .createValueBinding(fieldComponent.getHeight());
            height 
= bindingheight.getValue(currentInstance);
        }
 else {
            height 
= fieldComponent.getHeight();
        }


        
// TODO image的width属性设置
        Object width;
        
// 判断参数是否为绑定值,是的时候绑定,不是的时候直接赋值.
        if (UIComponentTag.isValueReference(fieldComponent.getWidth())) {
            
// 创建ValueBinging的对象保存width属性
            ValueBinding bindingwidth = application
                    .createValueBinding(fieldComponent.getWidth());
            width 
= bindingwidth.getValue(currentInstance);
        }
 else {
            width 
= fieldComponent.getWidth();
        }


        writer.startElement(
"image", fieldComponent);
        
if (!fieldComponent.isError()) {
            writer.writeAttribute(
"src", (String) path, "src");
            writer.writeAttribute(
"height", (String) height, "height");
            writer.writeAttribute(
"width", (String) width, "width");
        }

        writer.endElement(
"image");
    }

}

在webRoot 下的WEB-INF下创建Field.tld文件
< taglib >
    
< tlib-version > 0.03 </ tlib-version >
    
< jsp-version > 1.2 </ jsp-version >
    
< short-name > F </ short-name >
    
< uri > http://Field.com </ uri >
    
< description > ArcMind tags </ description >

    
< tag >
        
< name > field </ name >
        
< tag-class > com.Field.FieldTag </ tag-class >

        
< body-content > JSP </ body-content >
        
< attribute >
            
< name > height </ name >
        
</ attribute >
        
< attribute >
            
< name > width </ name >
        
</ attribute >
        
< attribute >
            
< name > src </ name >
        
</ attribute >
        
< attribute >
            
< name > label </ name >
        
</ attribute >
        
< attribute >
            
< name > tdwidth </ name >
        
</ attribute >
    
</ tag >
</ taglib >
faces-config文件
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd" >

< faces-config >

    
<!--  当FieldComponent类没有继承UIInput类时报错  -->
    
< component >
        
< component-type > Field </ component-type >
        
< component-class > com.Field.FieldComponent </ component-class >
    
</ component >

    
<!--  当FieldRenderer类没有继承Renderer类时报错  -->
    
< render-kit >
        
< renderer >
            
< component-family > Field </ component-family >
            
< renderer-type > Field </ renderer-type >
            
< renderer-class > com.Field.FieldRenderer </ renderer-class >
        
</ renderer >
    
</ render-kit >

    
< managed-bean >
        
< managed-bean-name > FieldBean </ managed-bean-name >
        
< managed-bean-class > com.Bean.FieldBean </ managed-bean-class >
        
< managed-bean-scope > session </ managed-bean-scope >
    
</ managed-bean >

    
< navigation-rule >
        
< navigation-case >
            
< from-outcome > index </ from-outcome >
            
< to-view-id > /index.jsp </ to-view-id >
        
</ navigation-case >
    
</ navigation-rule >
</ faces-config >

E:/workspace_new/zdy/src/com/Bean/FieldBean.java
package  com.Bean;

import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;

import  javax.faces.context.ExternalContext;
import  javax.faces.context.FacesContext;
import  javax.faces.event.ActionEvent;
import  javax.servlet.http.HttpServletRequest;

public   class  FieldBean  {
    
private String outcome;
    
private int rows = 0;

    
private int colums = 0;
    
    
private String src = "c:/cat.jpg";

    
private String height = "100";

    
private String width = "100";

    
private String label = "abcdabcdabcdabcd";

    
private String tdwidth = "100";

    
private List listItem;

    
private Iterator itr;

    
// 初始init方法
    public String init() throws Exception {
        
this.setListItem(this.listadd());
        
return "index";
    }


    
//将List的值赋给叠代器
    public void initIterator() {
        itr 
= listItem.iterator();
    }


    
//判断List下一条数据是否存在.
    public boolean hasNext() {
        
if (itr == null{
            itr 
= listItem.iterator();
        }

        
return itr.hasNext();
    }


    
//将List中下一条的值赋给Bean的变量.
    public void getNext() {
        FieldBean listItem 
= (FieldBean) itr.next();
        
this.setSrc(listItem.getSrc());
        
this.setHeight(listItem.getHeight());
        
this.setWidth(listItem.getWidth());
        
this.setLabel(listItem.getLabel());
        
this.setTdwidth(listItem.getTdwidth());
    }


    
public void itemadd(int num) {
        System.out.println(
this.getListItem().get(num));
    }


    
//为list添加几项值
    public List listadd() {
        List listitem 
= new ArrayList();
        FieldBean fb 
= new FieldBean();
        fb.setSrc(
"c:/cat.jpg");
        fb.setHeight(
"100");
        fb.setWidth(
"100");
        fb.setLabel(
"aaaaaaaaaaaaaaa");
        fb.setTdwidth(
"100");
        listitem.add(fb);
        FieldBean fb1 
= new FieldBean();
        fb1.setSrc(
"c:/tree.jpg");
        fb1.setHeight(
"100");
        fb1.setWidth(
"100");
        fb1.setLabel(
"bbbbbbbbbbbbbbb");
        fb1.setTdwidth(
"100");
        listitem.add(fb1);
        FieldBean fb2 
= new FieldBean();
        fb2.setSrc(
"c:/cc.jpg");
        fb2.setHeight(
"100");
        fb2.setWidth(
"100");
        fb2.setLabel(
"ccccccccccccccc");
        fb2.setTdwidth(
"100");
        listitem.add(fb2);
        FieldBean fb3 
= new FieldBean();
        fb3.setSrc(
"c:/dd.jpg");
        fb3.setHeight(
"100");
        fb3.setWidth(
"100");
        fb3.setLabel(
"dddddddddddddddd");
        fb3.setTdwidth(
"100");
        listitem.add(fb3);
        
return listitem;
    }


    
// CommandLink按钮actionListener属性对应的方法
    public void listener(ActionEvent e) throws Exception {
        
this.setRows(1);
        
this.setColums(1);
         ExternalContext context 
= FacesContext.getCurrentInstance().getExternalContext();
         HttpServletRequest request 
= (HttpServletRequest) context.getRequest();
           
this.setLabel(request.getParameter("name"));
        outcome 
= "index";
    }

    
    
public String outcome() {
        
return outcome;
    }


    
public String getSrc() {
        
return src;
    }


    
public void setSrc(String src) {
        
this.src = src;
    }


    
public String getHeight() {
        
return height;
    }


    
public void setHeight(String height) {
        
this.height = height;
    }


    
public String getWidth() {
        
return width;
    }


    
public void setWidth(String width) {
        
this.width = width;
    }


    
public String getLabel() {
        
return label;
    }


    
public void setLabel(String label) {
        
this.label = label;
    }


    
public String getTdwidth() {
        
return tdwidth;
    }


    
public void setTdwidth(String tdwidth) {
        
this.tdwidth = tdwidth;
    }


    
public List getListItem() {
        
return listItem;
    }


    
public void setListItem(List listItem) {
        
this.listItem = listItem;
    }


    
public int getColums() {
        
return colums;
    }


    
public void setColums(int colums) {
        
this.colums = colums;
    }


    
public int getRows() {
        
return rows;
    }


    
public void setRows(int rows) {
        
this.rows = rows;
    }

}

index.jsp
<% @ page language="java" pageEncoding="UTF-8" %>
<% @ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<% @ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<% @ taglib uri="http://Field.com" prefix="F" %>
< html >
    
< head >
        
< title > My JSP 'index.jsp' starting page </ title >
    
</ head >
    
< body >
        
< f:view >
            
< h:form >
                行
< h:inputText  value ="#{FieldBean.rows}" ></ h:inputText >
                列
< h:inputText  value ="#{FieldBean.colums}" ></ h:inputText >
                
<!--  #{FieldBean.src}  -->
                
< h:commandButton  value ="显示"  action ="#{FieldBean.init}" ></ h:commandButton >


                
< jsp:useBean  id ="FieldBean"  class ="com.Bean.FieldBean"
                    scope
="session"   />
                
< h:outputText  value ="#{sessionScope.FieldBean.src}"   />
                
< h:outputText  value ="#{sessionScope.FieldBean.label}"   />
                
< table >
                    
<%
                                FieldBean.init();
                                
//System.out.println(FieldBean.getListItem().size());
                                
if (FieldBean.getListItem().size() != 0) {
                            FieldBean.initIterator();
                            
for (int i = 0; i < FieldBean.getRows(); i++) {
                    
%>
                    
< tr >
                        
<%
                                        
for (int j = 0; j < FieldBean.getColums(); j++) {
                                        
if (FieldBean.hasNext()) {
                                    FieldBean.getNext();
                                    
//System.out.print(i);
                        
%>
                        
< td >
                            
< h:commandLink  actionListener ="#{FieldBean.listener}"
                    action
="#{FieldBean.outcome}" >
                                
< f:param  name ="name"  value ="#{sessionScope.FieldBean.label}" ></ f:param >
                                
< F:field  src ="#{sessionScope.FieldBean.src}"
                                    height
="#{sessionScope.FieldBean.height}"
                                    width
="#{sessionScope.FieldBean.width}"
                                    label
="#{sessionScope.FieldBean.label}"
                                    tdwidth
="#{sessionScope.FieldBean.tdwidth}" >
                                
</ F:field >
                            
</ h:commandLink >
                        
</ td >
                        
<%
                                    }
                                    }
                                }
                        
%>
                    
</ tr >
                    
<%
                    }
                    
%>
                
</ table >
                
< hr >
                                
< h:dataTable  value ="#{FieldBean.listItem}"  var ="list"  rows ="2"
                    first
="0"  rendered ="true" >
                    
< h:column >
                        
< F:field  src ="#{list.src}"  height ="#{list.height}"
                            width
="#{list.width}"  label ="#{list.label}"
                            tdwidth
="#{list.tdwidth}" >
                        
</ F:field >
                    
</ h:column >
                
</ h:dataTable >
            
</ h:form >
        
</ f:view >
    
</ body >
</ html >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值