基于 Sun JSF 的 PanelHorizontalLayout,tablelayout , rowlayout , cellformat的实现

本文介绍了一种使用 JavaServer Faces (JSF) 实现自定义布局组件的方法。通过继承 `BaseRender` 类并实现特定的功能,可以创建如表格、行布局等组件。这些组件能够方便地应用于 JSF 应用程序中,实现更加灵活和定制化的 UI 布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]BaseRender[/b]


import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;

public abstract class BaseRender extends Renderer {
abstract boolean needSpecialAttribute();
abstract void writeSpecialAttributes(UIComponent component,
ResponseWriter writer)throws IOException;
protected void writeCommonAttributes(UIComponent component,
ResponseWriter writer, String clientId) throws IOException {

String width = (String) component.getAttributes().get(HtmlElement.WIDTH);
String height = (String) component.getAttributes().get(HtmlElement.HEIGHT);
String styleClass = (String) component.getAttributes()
.get(HtmlElement.STYLECLASS);
String inlineStyle = (String) component.getAttributes().get(HtmlElement.INLINESTYLE);
writer.writeAttribute(HtmlElement.ID,clientId, null);
if (width != null) {
writer.writeAttribute(HtmlElement.WIDTH, width, null);
}
if (height != null) {
writer.writeAttribute(HtmlElement.HEIGHT, height, null);
}

if (inlineStyle != null) {
writer.writeAttribute(HtmlElement.STYLE, inlineStyle, null);
}
if (styleClass != null) {
writer.writeAttribute(HtmlElement.CLASS, styleClass, null);
}
if (needSpecialAttribute()) {
writeSpecialAttributes(component,writer);
}
}
}





[b]TableLayoutRenderClass[/b]

import java.io.IOException;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class TableLayoutRenderer extends BaseRender {
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);
writer.startElement("table", component);
writeCommonAttributes(component, writer, clientId);
//encodeRow(context,component, writer, clientId);
//encodeCommand(component, writer, clientId);
}
public void encodeEnd(FacesContext context, UIComponent component)throws IOException {
try {
context.getResponseWriter().endElement("table");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void encodeChildren(FacesContext context, UIComponent component)
throws IOException
{
for(UIComponent child : (List<UIComponent>)component.getChildren()) {

try {
if (child instanceof HtmlRowLayout) {
//super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

@Override
boolean needSpecialAttribute() {
// TODO Auto-generated method stub
return false;
}
@Override
void writeSpecialAttributes(UIComponent component, ResponseWriter writer)
throws IOException {
// TODO Auto-generated method stub

}

}



[b]HtmlTableLayOut ComponentClass[/b]



package com.test.jsftest;

import javax.faces.component.UIPanel;

public class HtmlTableLayout extends UIPanel {
public HtmlTableLayout() {
setRendererType("com.test.jsftest.HtmlTableLayout");
}

}




[b]RowLayout Render Class[/b]

import java.io.IOException;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class RowLayoutRenderer extends BaseRender {
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);
writer.startElement("tr", component);
writeCommonAttributes(component, writer, clientId);
//encodeRow(context,component, writer, clientId);

}
public void encodeChildren(FacesContext context, UIComponent component)
throws IOException
{
try{
for(UIComponent child : (List<UIComponent>)component.getChildren()) {
if (child instanceof HtmlCellFormat)
{
//super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
}
// else
// {
// ResponseWriter rw = context.getResponseWriter();
// rw.startElement("td", null);
// super.encodeChildren(context, child);
// rw.endElement("td");
// }
}

}catch(Exception e) {

}
}
public void encodeEnd(FacesContext context, UIComponent component) {
try {
context.getResponseWriter().endElement("tr");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
boolean needSpecialAttribute() {
// TODO Auto-generated method stub
return false;
}
@Override
void writeSpecialAttributes(UIComponent component, ResponseWriter writer)
throws IOException {
// TODO Auto-generated method stub

}






}





[b]RowLayout Component Class[/b]


package com.test.jsftest;

import javax.faces.component.UIPanel;

public class HtmlRowLayout extends UIPanel {
public HtmlRowLayout() {
setRendererType("com.test.jsftest.HtmlRowLayout");
}
}



[b]CellFormat Render Class[/b]



import java.io.IOException;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class CellFormatRenderer extends BaseRender {
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);
writer.startElement("td", component);
writeCommonAttributes(component, writer, clientId);
//encodeCell(context,component, writer, clientId);
//encodeCommand(component, writer, clientId);
}

public void encodeEnd(FacesContext context, UIComponent component) {
try {
context.getResponseWriter().endElement("td");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void encodeChildren(FacesContext context, UIComponent component)
throws IOException
{
for(UIComponent child : (List<UIComponent>)component.getChildren()) {
if (child.isRendered()) {
try {
//super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


@Override
boolean needSpecialAttribute() {
// TODO Auto-generated method stub
return false;
}

@Override
void writeSpecialAttributes(UIComponent component, ResponseWriter writer)
throws IOException {
// TODO Auto-generated method stub

}

}


[b]CellFormatComponent Class[/b]


package com.test.jsftest;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.component.UIPanel;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
import javax.faces.event.FacesListener;
import javax.faces.render.Renderer;

public class HtmlCellFormat extends UIPanel {

public HtmlCellFormat() {
setRendererType("com.test.jsftest.HtmlCellFormat");
}

}



[b]PanelHorizontalLayout Class [/b]




import java.io.IOException;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class PanelHorizontalLayoutRender extends BaseRender {

public boolean getRendersChildren()
{
return true;
}
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);

writer.startElement("table", component);
writeCommonAttributes(component, writer, clientId);
writer.startElement("tr", component);
//encodeAttribute(context, component, writer, clientId);

encodeChild(context, writer, component);

//context.getResponseWriter().endElement("tr");
//context.getResponseWriter().endElement("table");
// encodeCommand(component, writer, clientId);
}

public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
try {

context.getResponseWriter().endElement("tr");
context.getResponseWriter().endElement("table");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void encodeChildren(FacesContext context, UIComponent component)
throws IOException {

}



private void encodeChild(FacesContext context, ResponseWriter writer, UIComponent component) throws IOException {
for (UIComponent child : (List<UIComponent>) component.getChildren()) {


if (child instanceof HtmlCellFormat) {
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
}else {
writer.startElement("td", component);

// super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
writer.endElement("td");
}

}
}
@Override
boolean needSpecialAttribute() {
// TODO Auto-generated method stub
return true;
}
@Override
void writeSpecialAttributes(UIComponent component, ResponseWriter writer) throws IOException {
// TODO Auto-generated method stub
String vAlign = (String) component.getAttributes().get("vAlign");
String hAlign = (String) component.getAttributes().get("hAlign");
if (vAlign != null) {
writer.writeAttribute("vAlign", vAlign, null);
}
if (hAlign != null) {
writer.writeAttribute("align", hAlign, null);
}
}
}




[b]PanelGroupLayout [/b]

import java.io.IOException;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class PanelGroupLayoutRender extends BaseRender {
private static final String HORIZONTAL_LAY_OUT = "Horizontal";
private static final String VERTICAL_LAY_OUT = "Vertical";

public boolean getRendersChildren()
{
return true;
}
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = component.getClientId(context);

writer.startElement("table", component);
writeCommonAttributes(component,writer,clientId);

encodeChild(context, writer, component);


}

public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
try {


context.getResponseWriter().endElement("table");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void encodeChildren(FacesContext context, UIComponent component)
throws IOException {


}



private void encodeChild(FacesContext context, ResponseWriter writer, UIComponent component) throws IOException {

String layoutType = (String) component.getAttributes().get("layout");
if (layoutType == null || HORIZONTAL_LAY_OUT.equals(layoutType)) {
writer.startElement("tr", component);
for (UIComponent child : (List<UIComponent>) component.getChildren()) {


if (child instanceof HtmlCellFormat) {
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
}else {
writer.startElement("td", component);

// super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
writer.endElement("td");
}

}
writer.endElement("tr");
}else if (VERTICAL_LAY_OUT.equals(layoutType)) {


for (UIComponent child : (List<UIComponent>) component.getChildren()) {
writer.startElement("tr",component);

if (child instanceof HtmlCellFormat) {
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
}else {

writer.startElement("td",component);
// super.encodeChildren(context, child);
child.encodeBegin(context);
child.encodeChildren(context);
child.encodeEnd(context);
writer.endElement("td");

}
writer.endElement("tr");

}

}


}
@Override
boolean needSpecialAttribute() {
// TODO Auto-generated method stub
return false;
}
@Override
void writeSpecialAttributes(UIComponent component, ResponseWriter writer) {
// TODO Auto-generated method stub

}
}





[b]Faces-config.xml[/b]



<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>
<application>
<!-- Enables Facelets -->
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>

<component>
<component-type>
com.test.jsftest.TextWithCmd
</component-type>
<component-class>
com.test.jsftest.UITextWithCmd
</component-class>
</component>
<component>
<component-type>
com.test.jsftest.HtmlCellFormat
</component-type>
<component-class>
com.test.jsftest.HtmlCellFormat
</component-class>
</component>
<component>
<component-type>
com.test.jsftest.HtmlRowLayout
</component-type>
<component-class>
com.test.jsftest.HtmlRowLayout
</component-class>
</component>

<component>
<component-type>
com.test.jsftest.HtmlTableLayout
</component-type>
<component-class>
com.test.jsftest.HtmlTableLayout
</component-class>
</component>
<render-kit>
<renderer>
<component-family>
javax.faces.Panel
</component-family>
<renderer-type>
com.test.jsftest.HtmlCellFormat
</renderer-type>
<renderer-class>
com.test.jsftest.CellFormatRenderer
</renderer-class>
</renderer>

<renderer>
<component-family>
javax.faces.Panel
</component-family>
<renderer-type>
com.test.jsftest.HtmlRowLayout
</renderer-type>
<renderer-class>
com.test.jsftest.RowLayoutRenderer
</renderer-class>
</renderer>

<renderer>
<component-family>
javax.faces.Panel
</component-family>
<renderer-type>
com.test.jsftest.HtmlTableLayout
</renderer-type>
<renderer-class>
com.test.jsftest.TableLayoutRenderer
</renderer-class>
</renderer>

<renderer>
<component-family>
javax.faces.Input
</component-family>
<renderer-type>
com.test.jsftest.TextCmd
</renderer-type>
<renderer-class>
com.test.jsftest.TextCmdRenderer
</renderer-class>
</renderer>
</render-kit>
</faces-config>



[b]taglib.xml[/b]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE facelet-taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">

<namespace>http://caterpillar.onlyfun.net/custimizedtag</namespace>
<tag>
<tag-name>textcmd</tag-name>
<component>
<component-type>
com.test.jsftest.TextWithCmd
</component-type>
<renderer-type>
com.test.jsftest.TextCmd
</renderer-type>
</component>
</tag>

<tag>
<tag-name>cellFormat</tag-name>
<component>
<component-type>
com.test.jsftest.HtmlCellFormat
</component-type>
<renderer-type>
com.test.jsftest.HtmlCellFormat
</renderer-type>
</component>
</tag>

<tag>
<tag-name>RowLayout</tag-name>
<component>
<component-type>
com.test.jsftest.HtmlRowLayout
</component-type>
<renderer-type>
com.test.jsftest.HtmlRowLayout
</renderer-type>
</component>
</tag>


<tag>
<tag-name>TableLayout</tag-name>
<component>
<component-type>
com.test.jsftest.HtmlTableLayout
</component-type>
<renderer-type>
com.test.jsftest.HtmlTableLayout
</renderer-type>
</component>
</tag>
</facelet-taglib>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值