弱弱的发一贴:Ext.Tab without Ext.Tab

本文介绍了一种将 Ext.Tab 组件转换为 JSPTag 的方法,以便于在 Java Web 项目中更便捷地使用。该方法允许通过 JSP 属性配置 Tab 的各种特性,如宽度、高度、自动滚动等,并支持 Tab 的无限嵌套。
[b]1.写在前面[/b]
最近由于公司框架中的Tab组件Bug多多,迟迟不能解决。遂自己动手把Ext.Tab写成JSPTag来使用。发出来给和偶一样经常在海边拾贝壳的小鸟们借鉴参考之用。JS大师你们肯定要说,我是没事找事,直接用EXT不就行了何必那么麻烦,但问题是直接使用EXT的话,页面将大量引入一堆难读的JS和html而且也给一些作坊型的项目组带来了学习培训的成本。
[b]2.实现的功能[/b]
由Java后端根据JSPTag生成Ext.Tab界面所需的html元素和JS。实现全部功能不需要程序员编写一行html代码或者JS。主要功能列表:
无限嵌套生成标签卡。
标签卡容器的自动扩展、自动滚动条、高度、宽度、当前活动标签卡的JSP属性设置。
标签卡的禁用、onclick事件响应的JSP属性设置。
支持request重置当前活动标签卡。
[b]3.JSP代码[/b]

<body>
<%
TabsUtil.setActiveTab(request, 2);
%>
<eRed:tabs tabsId="tabs" activeTab="0" width="400" height="100" autoScroll="true">
<eRed:tab tabId="table1" title="标签卡1">
<font size="800">标签卡1</font>
</eRed:tab>
<eRed:tab tabId="table2" title="标签卡2" disabled="true">
标签卡2
</eRed:tab>
<eRed:tab tabId="table3" title="标签卡3" onclick="test">
标签卡3
</eRed:tab>
</eRed:tabs>
</body>
<script type="text/javascript">
function test(){
Ext.MessageBox.alert('系统提示:', "响应onclick事件!");
}
</script>

[b]4.效果图[/b]
[img]http://www.shangrilaagroecology.org/eredlab/resource/e3/eredtab.jpg[/img]
[b]5.关键代码[/b]
[b]TLD描述:[/b]

<tag>
<name>tabs</name>
<tagclass>com.eredlab.uilib.common.layout.ExtTabsTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>标签卡容器标签-eRedUI公共标签</info>
<attribute>
<name>tabsId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>activeTab</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>width</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>height</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>autoScroll</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>

<tag>
<name>tab</name>
<tagclass>com.eredlab.uilib.common.layout.ExtTabTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>标签卡标签-eRedUI公共标签</info>
<attribute>
<name>tabId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>title</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>disabled</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>onclick</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>

[b]标签实现类[/b]

/**
* EXT风格标签选项卡容器标签-公共标签
* @author
* @version eRedUI V0.1
*/
public class ExtTabsTag extends BodyTagSupport{
private String tabsId;
private String activeTab;
private String width;
private String height;
private String autoScroll;
private List tabs;
public ExtTabsTag(){
super();
tabs = new ArrayList();
}

/**
* 标签开始:Do Nothing!
*/
public int doStartTag() throws JspException{
tabs.clear();
HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
String tabNo = (String)request.getAttribute(UiConstants.EXTTAB_ACTIVETAB);
this.activeTab = (tabNo == null || tabNo == "") ? "0" : tabNo;
return super.EVAL_BODY_BUFFERED;
}

/**
* 标签结束:输出代码描述字符流
*/
public int doEndTag() throws JspException{
JspWriter writer = pageContext.getOut();
try {
String tabsDivStart = "<div id=\"tabs\">";
writer.println(tabsDivStart);
for(int i = 0; i < tabs.size(); i++){
ExtTab tab = (ExtTab)tabs.get(i);
String tabDivStart = "<div id=\"" + tab.getTabId() + "\" class=\"x-hide-display\">";
writer.println(tabDivStart);
String tabDivContent = tab.getContent();
writer.println(tabDivContent);
String tabDivEnd = "</div>";
writer.println(tabDivEnd);
}
String tabsDivEnd = "</div>";
writer.println(tabsDivEnd);
String scriptStart = "<script type=\"text/javascript\">";
writer.println(scriptStart);
String tabsScriptStart = "Ext.onReady(function(){var " + this.getTabsId() + " = new Ext.TabPanel({";
tabsScriptStart = tabsScriptStart + "renderTo: '" + this.getTabsId() + "',";
tabsScriptStart = tabsScriptStart + "width:" + (this.width == null ? "780" : this.width) + ",";
tabsScriptStart = tabsScriptStart + "activeTab:" + (this.activeTab == null ? "0" : this.activeTab) + ",";
tabsScriptStart = tabsScriptStart + "frame:true,";
if(this.height != null)
tabsScriptStart = tabsScriptStart + "height:" + this.height + ",";
if(this.autoScroll != null)
tabsScriptStart = tabsScriptStart + "autoScroll:" + this.autoScroll + ",";
tabsScriptStart = tabsScriptStart + "defaults:{autoHeight: true},";
tabsScriptStart = tabsScriptStart + "items:[";
writer.println(tabsScriptStart);
String tabScriptStart = "";
for(int i = 0; i < tabs.size(); i++){
ExtTab tab = (ExtTab)tabs.get(i);
tabScriptStart = tabScriptStart + "{contentEl:'" + tab.getTabId() + "',";
if(tab.getDisabled() != null)
tabScriptStart = tabScriptStart + "disabled:" + tab.getDisabled() + ",";
if(tab.getOnclick() != null)
tabScriptStart = tabScriptStart + "listeners: {activate:" + tab.getOnclick() + "},";
tabScriptStart = tabScriptStart + "title: '" + tab.getTitle();
tabScriptStart = tabScriptStart + "'},";
}
String tabScriptStart2 = tabScriptStart.substring(0, tabScriptStart.length() - 1);
writer.println(tabScriptStart2);
String tabScriptEnd = "]";
writer.println(tabScriptEnd);
String tabsScriptEnd = "});});";
writer.println(tabsScriptEnd);
String scriptEnd = "</script>";
writer.println(scriptEnd);
} catch (IOException e) {
e.printStackTrace();
}
return super.doEndTag();
}

/**
* 添加Tab卡片
*/
public void addTab(ExtTabTag pTab){
tabs.add(pTab);
}

/**
* 添加Tab卡片
*/
public void addTab(ExtTab pTab){
tabs.add(pTab);
}

/**
* 释放资源
*/
public void release(){
super.release();
this.activeTab = null;
this.tabsId = null;
this.width = null;
this.height = null;
}

public String getTabsId() {
return tabsId;
}
public void setTabsId(String tabsId) {
this.tabsId = tabsId;
}
public String getActiveTab() {
return activeTab;
}
public void setActiveTab(String activeTab) {
this.activeTab = activeTab;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}

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

public void setAutoScroll(String autoScroll) {
this.autoScroll = autoScroll;
}
}




/**
* EXT风格标签选项卡标签-公共标签
* @author
* @version eRedUI V0.1
*/
public class ExtTabTag extends BodyTagSupport{
private String tabId;
private String title;
private String disabled;
private String onclick;
public ExtTabTag(){}

/**
* 标签开始:Do Nothing!
*/
public int doStartTag() throws JspException{
return super.EVAL_BODY_BUFFERED;
}

/**
* 标签结束:输出代码描述字符流
*/
public int doEndTag() throws JspException{
String content = this.bodyContent.getString();
ExtTabsTag tabs = (ExtTabsTag)findAncestorWithClass(this, ExtTabsTag.class);
ExtTab tab = new ExtTab();
tab.setTabId(this.getTabId());
tab.setTitle(this.getTitle());
tab.setContent(content);
tab.setDisabled(this.getDisabled());
tab.setOnclick(this.getOnclick());
tabs.addTab(tab);
//tabs.addTab(this);
return super.doEndTag();
}

/**
* 释放资源
*/
public void release(){
super.release();
this.tabId = null;
this.title = null;
}

public String getTabId() {
return tabId;
}
public void setTabId(String tabId) {
this.tabId = tabId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}

public void setDisabled(String disabled) {
this.disabled = disabled;
}

public void setOnclick(String onclick) {
this.onclick = onclick;
}

public String getDisabled() {
return disabled;
}

public String getOnclick() {
return onclick;
}
}

打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 MPU6050是由InvenSense公司研的六轴惯性测量单元(IMU),该设备融合了三轴陀螺仪和三轴加速度计。它能够即时检测设备在三维空间中的运动参数,例如角速度和加速度等指标。DMP(Digital Motion Processing)是MPU6050内部集成的种硬件加速技术,它能够对传感器数据进行处理并实现姿态计算,从而降低主控制器如STM32的计算压力。 STM32是款基于ARM Cortex-M架构的微控制器,该器件在嵌入式系统领域得到了广泛部署,其特点是处理性能高且能耗低,非常适合用于处理复杂的传感器数据和控制任务。在MPU6050的姿态计算应用场景中,STM32通常负责与MPU6050进行通信、获取传感器数据,并基于DMP提供的结果进行后续的数据处理和应用。 在"MPU6050姿态计算STM32源代码(DMP)"这项目中,研究者已经完成了将MPU6050的六轴数据通过DMP进行加工,并利用STM32进行读取和解析这些数据的工作。源代码可能涵盖以下几个核心组成部分: 1. **配置初始化**:初始化STM32的GPIO、I2C接口,目的是为了与MPU6050建立有效的通信连接。此外,还需要对MPU6050的寄存器进行设置,激活DMP功能,并设定采样频率和滤波器参数。 2. **数据交换**:利用STM32的I2C接口周期性地从MPU6050获取DMP的输出结果,这些数据通常涵盖设备的角速度、加速度以及姿态角(包括俯仰角、翻滚角和偏航角等)。 3. **姿态计算**:尽管DMP已经对原始数据进行了基础处理,但在STM32端可能还需要进行二次处理,例如采用卡尔...
源码链接: https://pan.quark.cn/s/8f33d1350bc1 在电子工程领域中,选择与理解芯片扮演着关键角色。当我们面对陌生的芯片时,检索相关文献是获取必要信息的主要途径。以下是些推荐的芯片资料检索平台,它们能够协助工程师们迅速获取所需数据,从而提升设计工作的效率。 1. **329 万 PDF 集成芯片资料下载**(http://www.sylxb.cn/PDF/pdfsearch.html):该网站汇集了众多PDF格式的芯片数据手册,支持用户在线查阅或下载,是搜集芯片规格和参数的优选资源。 2. **Datasheet search 集成电路速查网**:作为个专门的集成电路检索平台,该网站通过关键词搜索可迅速定位芯片的技术参数和应用指南。 3. **21icsearch 芯片查询网**(http://www.21icsearch.com):21icsearch 是中国领先的电子技术网站,其丰富的芯片数据库不仅包含详尽的芯片资料,还设有相关论坛和社区供工程师们交流探讨。 4. **datasheetpdf 芯片查询网**:此网站专注于提供PDF格式的芯片数据手册,便于用户快速获取和查阅芯片的详细规格。 5. **IC112 芯片查询网**:IC112 提供了大量的芯片资料,涵盖引脚布局、功能说明、电气特性等,对于设计人员而言极具实用价值。 6. **中国电子市场网**(www.dzsc.com):除了芯片资料查询功能,该网站还支持在线购买和交易,是电子元件采购的重要渠道。 7. **中国最大的芯片交易网**(www.ic72.com):该网站不仅提供芯片查询服务,还实时更新市场价格动态,对于关注市场变化的设计师具有重要参考意义。 ...
源码下载地址: https://pan.quark.cn/s/7f0543051140 BIOS(基本输入/输出系统)是计算机在启动时最先被加载的固件,其中包含了系统启动所需的基本程序以及硬件设备的驱动代码。BIOS版本的更新通常是为了修正故障、提升硬件的兼容性或增强系统的整体性能。"万能BIOS刷新工具Universal Flash Utility V8.93"是款专门设计用于更新和刷新BIOS的实用程序,该工具宣称具有广泛的兼容性,尽管其是否适用于所有主板尚无定论,但对于大多数常见主板来说应该是可行的。刷新BIOS的操作过程涉及以下核心要点: 1. **BIOS的功能**:BIOS充当计算机硬件与操作系统之间的连接桥梁,负责初始化硬件设备、执行POST(开机自检)自检,并加载操作系统的引导扇区。 2. **BIOS刷新**:当BIOS存在缺陷或新硬件需要更优化的支持时,就需要进行BIOS刷新。这过程通常包括获取新的BIOS固件,然后借助刷新工具将其写入BIOS芯片。 3. **刷新潜在风险**:BIOS刷新并非没有风险的操作,如果在过程中突然断电或其他意外生,可能导致BIOS损坏,使计算机无法正常启动。因此,在执行BIOS刷新之前,必须确保电源的稳定性,并且备份当前的BIOS以防万。 4. **Universal Flash Utility**:这是个广受欢迎的BIOS刷新工具,它使用户能够安全地更新BIOS文件,通常具备简单直观的界面和多种安全措施,以减少刷新操作中出现错误的可能性。 5. **兼容性问题**:尽管工具名称为“万能”,但并非所有主板都能适用。在使用之前,用户应当核实该工具是否支持自己的主板型号,否则可能会导致不兼容的情况。 6. ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值