最近我的朋友提供了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;
}
}
1806

被折叠的 条评论
为什么被折叠?



