我的第一个jsf组件

最近我的朋友提供了Swing组件库(通过这里可以去详细了解http://www.zfqjava.com/zh_CN/),看了非常佩服他的杰作,以及他在java这个领域所取得的成就。Swing这个技术让我越来越感到她的扩展性很强。

  由于工作原因,对于组件的了解,来源于JSF的组件。尽管现在她不够完美,她却继承了Swing优秀的血统。

  经过这最近几日的尝试,终于完成了一个简单的输出组件。感觉很有趣。发出来供大家分享。

功能很简单是:一个div 含有一组简单属性。

1、  组件类

 

package com.yjk.web.jsf.component;

import javax.el.ValueExpression;

import javax.faces.component.UIOutput;

/**

 *

 * @author yujikuan

 */

public class SimpleUIOutput extends UIOutput {

 

    @Override

      public java.lang.String getFamily()

     {

         return "yjkFamily";

      }

    protected String title ;

        public String getTitle() {

        if (null != this.title) {

        return this.title;

    }

    ValueExpression _ve = getValueExpression("title");

    return (_ve != null) ? (String) _ve.getValue(getFacesContext().getELContext()) : "";

       }

}

2、  标签类

 

package com.yjk.web.jsf.component.tag;

 

import com.yjk.web.jsf.component.SimpleUIOutput;

import javax.el.ValueExpression;

import javax.faces.component.UIComponent;

import javax.faces.webapp.UIComponentELTag;

 

 

/**

 *

 * @author yujikuan

 */

public class TickerTag extends UIComponentELTag  {

 

    @Override

    public void release() {

        // the super class method should be called

        super.release();

        style = null;

        title = null;

    }

 

    @Override

    protected void setProperties(UIComponent component) {

        // the super class method should be called

        super.setProperties(component);

        if (style != null) {

            component.getAttributes().put("style", style);

        }

        if (title != null) {

        SimpleUIOutput suio=(SimpleUIOutput) component;

          if(title.isLiteralText())

          {

             suio.getAttributes().put("title", title);

           }

          else{

             suio.setValueExpression("title", title);

          }

        }

    }

 

    public String getComponentType() {

        return "ticker";

    }

 

    public String getRendererType() {

         return "tickerRenderer";

    }

    private String style;

 

    public String getStyle() {

        return style;

    }

 

    public void setStyle(String style) {

        this.style = style;

    }

    private ValueExpression title;

 

    public ValueExpression getTitle() {

        return title;

    }

 

    public void setTitle(ValueExpression title) {

        this.title = title;

    }

}

3、  呈现类

 

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package com.yjk.web.jsf.component.render;

 

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.context.ResponseWriter;

import javax.faces.render.Renderer;

import com.yjk.web.jsf.component.SimpleUIOutput;

/**

 *

 * @author yjk

 */

public class SimpleUIOutputRender extends Renderer {

 

    @Override

    public void encodeBegin(FacesContext context,

            UIComponent component)

            throws java.io.IOException {

 

         ResponseWriter writer = context.getResponseWriter();

        writer.startElement("div", component);

        String style = (String) component.getAttributes().get("style");

        if (style != null) {

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

         }

         writer.writeAttribute("id", component.getClientId(context), null);

         writer.writeAttribute("title", ((SimpleUIOutput)component).getTitle(), null);

    }

    @Override

    public void encodeEnd(FacesContext context, UIComponent component)

               throws java.io.IOException

    {

          ResponseWriter writer = context.getResponseWriter();

          writer.endElement("div");

     }

}

4、  Faces-config.xml

  <component>

        <component-type>ticker</component-type>

        <component-class>com.yjk.web.jsf.component.SimpleUIOutput</component-class>

    </component>

    <render-kit>

        <renderer>

            <component-family>yjkFamily</component-family>

            <renderer-type>tickerRenderer</renderer-type>

            <renderer-class>com.yjk.web.jsf.component.render.SimpleUIOutputRender</renderer-class>

        </renderer>

    </render-kit>

5、  Tld

<?xml version="1.0" encoding="UTF-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <tlib-version>1.0</tlib-version>

    <short-name>yjkweb</short-name>

    <uri>http://yjkweb.com</uri>

    <tag>

        <name>myTicker</name>

        <tag-class>com.yjk.web.jsf.component.tag.TickerTag</tag-class>

        <attribute>

            <name>style</name>

        </attribute>

        <attribute>

            <name>id</name>

        </attribute>

        <attribute>

            <name>rendered</name>

            <rtexprvalue>false</rtexprvalue>

            <deferred-value>

                <type>java.lang.String</type>

            </deferred-value>

        </attribute>

        <attribute>

            <name>title</name>

            <rtexprvalue>false</rtexprvalue>

            <deferred-value>

                <type>java.lang.String</type>

            </deferred-value>

        </attribute>

        <attribute>

            <name>binding</name>

            <rtexprvalue>false</rtexprvalue>

            <deferred-value>

                <type>com.yjk.web.jsf.component.SimpleUIOutput</type>

            </deferred-value>

        </attribute>

    </tag>

</taglib>

6、  页面

<yu:myTicker  title="#{mydemo.title}"  binding="#{BPB.out}" id="one" style="border:10px solid darkblue;width:100px">

             <f:verbatim>hello</f:verbatim>

       </yu:myTicker>

这里BPB是一个Bean,使用的binding的功能。

代码如下:

package demo;

 

import com.yjk.web.jsf.component.SimpleUIOutput;

 

/**

 *

 * @author yjk

 */

public class BannerPageBean {

 

    private SimpleUIOutput out;

    private Boolean rendered;

 

    public SimpleUIOutput getOut() {

        return out;

    }

 

    public void setOut(SimpleUIOutput out) {

        this.out = out;

    }

 

    public Boolean getRendered() {

        return rendered;

    }

 

    public void setRendered(Boolean rendered) {

        this.rendered = rendered;

    }

    public String turnOn()

    {

          out.setRendered(true);

          return null;

    }

    public String turnOff()

    {

          out.setRendered(false);

           return null;

    }

}

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值