最近在做一个公司的框架,采用extjs+dwr,由于考虑到extjs的学习曲线,希望开发人员即便不会也能使用,于是我就打算用jsp自定义标签来实现。我觉得凡是用ext框架的公司都会用标签或者其他方式生成一些ext代码,否则多麻烦啊。
由于刚开始接触extjs,所以很多用法都在探索中。有不妥的地方请指正
效果图:

看看,jsp多简洁,开发人员用起来会很舒服
- <stk-ui:panel width="400" title="测试">
- <form action="/login.jsp" id="testForm1">
- 姓名:<stk-ui:textField id="t1"/><br>
- <stk-ui:formButton text="提交" btnType="submit" formId="testForm1"/>
- </form>
- </stk-ui:panel>
<stk-ui:panel width="400" title="测试">
<form action="/login.jsp" id="testForm1">
姓名:<stk-ui:textField id="t1"/><br>
<stk-ui:formButton text="提交" btnType="submit" formId="testForm1"/>
</form>
</stk-ui:panel>
panel.ftl
- <div id="${parameters.id}Div">
- <div id="${parameters.id}El" class="x-hidden" align="center">
- <script type="text/javascript">
- Ext.onReady(function()
- {
- new Ext.Panel({
- <#if parameters.frame?exists>
- frame:${parameters.frame},
- </#if>
- <#if parameters.title?exists>
- title:'${parameters.title}',
- </#if>
- <#if parameters.bodyStyle?exists>
- bodyStyle:'${parameters.bodyStyle}',
- </#if>
- <#if parameters.autoLoad?exists>
- autoLoad:'${parameters.autoLoad}',
- </#if>
- <#if parameters.autoScroll?exists>
- autoScroll:${parameters.autoScroll},
- </#if>
- <#if parameters.collapsible?exists>
- collapsible:'${parameters.collapsible}',
- </#if>
- <#if parameters.height?exists>
- height:${parameters.height},
- </#if>
- <#if parameters.x?exists>
- x:${parameters.x},
- </#if>
- <#if parameters.y?exists>
- y:${parameters.y},
- </#if>
- width: '${parameters.width}',
- defaults: {width: (${parameters.width}-30)},
- renderTo:'${parameters.id}Div',
- id:'${parameters.id}',
- items: new Ext.Container({
- el:'${parameters.id}El'
- })
- });
- $("#${parameters.id}El").removeClass("x-hidden");
- });
- </script>
<div id="${parameters.id}Div">
<div id="${parameters.id}El" class="x-hidden" align="center">
<script type="text/javascript">
Ext.onReady(function()
{
new Ext.Panel({
<#if parameters.frame?exists>
frame:${parameters.frame},
</#if>
<#if parameters.title?exists>
title:'${parameters.title}',
</#if>
<#if parameters.bodyStyle?exists>
bodyStyle:'${parameters.bodyStyle}',
</#if>
<#if parameters.autoLoad?exists>
autoLoad:'${parameters.autoLoad}',
</#if>
<#if parameters.autoScroll?exists>
autoScroll:${parameters.autoScroll},
</#if>
<#if parameters.collapsible?exists>
collapsible:'${parameters.collapsible}',
</#if>
<#if parameters.height?exists>
height:${parameters.height},
</#if>
<#if parameters.x?exists>
x:${parameters.x},
</#if>
<#if parameters.y?exists>
y:${parameters.y},
</#if>
width: '${parameters.width}',
defaults: {width: (${parameters.width}-30)},
renderTo:'${parameters.id}Div',
id:'${parameters.id}',
items: new Ext.Container({
el:'${parameters.id}El'
})
});
$("#${parameters.id}El").removeClass("x-hidden");
});
</script>
button.ftl 和 textField.ftl省略,标签类也省略
tr
生成的代码:
- <div id="5068fb04-a387-4091-9c70-9810fe47ee6aDiv">
- <div id="5068fb04-a387-4091-9c70-9810fe47ee6aEl" class="x-hidden" align="center">
- <script type="text/javascript">
- Ext.onReady(function()
- {
- new Ext.Panel({
- frame:true,
- title:'测试',
- autoScroll:true,
- width: '400',
- defaults: {width: (400-30)},
- renderTo:'5068fb04-a387-4091-9c70-9810fe47ee6aDiv',
- id:'5068fb04-a387-4091-9c70-9810fe47ee6a',
- items: new Ext.Container({
- el:'5068fb04-a387-4091-9c70-9810fe47ee6aEl'
- })
- });
- $("#5068fb04-a387-4091-9c70-9810fe47ee6aEl").removeClass("x-hidden");
- });
- </script>
- <form action="/login.jsp" id="testForm1">
- 姓名:<span id="t1TextSpan"></span>
- <script type="text/javascript">
- Ext.onReady(function()
- {
- Ext.QuickTips.init();
- new Ext.form.TextField
- ({
- renderTo:'t1TextSpan',
- id:'t1'
- });
- });
- </script>
- <br>
- <span id="9c9e1b2f-7544-4210-a71e-af4336a7f580BtnSpan" style="width:1px;"></span>
- <script type="text/javascript">
- Ext.onReady(function()
- {
- new Ext.Button({
- type:'submit',
- handler:function(){document.getElementById('testForm1').submit();},
- text:'提交',
- id:'9c9e1b2f-7544-4210-a71e-af4336a7f580',
- renderTo:'9c9e1b2f-7544-4210-a71e-af4336a7f580BtnSpan'
- });
- });
- </script>
- </form>
- </div>
- </div>
<div id="5068fb04-a387-4091-9c70-9810fe47ee6aDiv">
<div id="5068fb04-a387-4091-9c70-9810fe47ee6aEl" class="x-hidden" align="center">
<script type="text/javascript">
Ext.onReady(function()
{
new Ext.Panel({
frame:true,
title:'测试',
autoScroll:true,
width: '400',
defaults: {width: (400-30)},
renderTo:'5068fb04-a387-4091-9c70-9810fe47ee6aDiv',
id:'5068fb04-a387-4091-9c70-9810fe47ee6a',
items: new Ext.Container({
el:'5068fb04-a387-4091-9c70-9810fe47ee6aEl'
})
});
$("#5068fb04-a387-4091-9c70-9810fe47ee6aEl").removeClass("x-hidden");
});
</script>
<form action="/login.jsp" id="testForm1">
姓名:<span id="t1TextSpan"></span>
<script type="text/javascript">
Ext.onReady(function()
{
Ext.QuickTips.init();
new Ext.form.TextField
({
renderTo:'t1TextSpan',
id:'t1'
});
});
</script>
<br>
<span id="9c9e1b2f-7544-4210-a71e-af4336a7f580BtnSpan" style="width:1px;"></span>
<script type="text/javascript">
Ext.onReady(function()
{
new Ext.Button({
type:'submit',
handler:function(){document.getElementById('testForm1').submit();},
text:'提交',
id:'9c9e1b2f-7544-4210-a71e-af4336a7f580',
renderTo:'9c9e1b2f-7544-4210-a71e-af4336a7f580BtnSpan'
});
});
</script>
</form>
</div>
</div>
目前已经完成的标签大概有6个,确实遇到不少困难,比如button单独使用会自动换行等问题。唉,不容易啊
这个例子估计相对简单,导致大家有点误解,来看看经过一段时间努力,完成的ajaxGrid的标签:
效果图:

jsp代码,就这么简单。该分页是取部分数据分页而不是全取。合计是全部数据合计。并且扩展了排序功能,能组合排序。还有一点功能需要完善,相信会很好用。
- <stk-ui:table id="sqlTable" actionName="TestSql" pageSize="8" width="780" height="370" title="Sql例子+双击事件+合计" needDetail="true" needCollect="true">
- <stk-ui:column property="OpTime" title="操作时间" pattern="yyyy-MM-dd hh:mm:ss"/>
- <stk-ui:column property="UserCode" title="操作员" key="userinfo" pattern="code|name" parser="translate"/>
- <stk-ui:column property="OpClass" title="操作类型" parser="dict" key="1086"/>
- <stk-ui:column property="id" title="金额" collectMethod="SUM,AVG" parser="number" align="right"/>
- <stk-ui:column property="OpContent" title="操作内容"/>
- <stk-ui:column property="IpAddr" title="IP地址" cssStyle="color:red"/>
- <stk-ui:column property="FirstLevel" title="一级菜单" parser="translate" key="menu"/>
- <stk-ui:column property="SecondLevel" title="二级菜单" parser="translate" key="menu"/>
- <stk-ui:column property="Memo" title="备注" maxWords="20" needHint="true"/>
- </stk-ui:table>
<stk-ui:table id="sqlTable" actionName="TestSql" pageSize="8" width="780" height="370" title="Sql例子+双击事件+合计" needDetail="true" needCollect="true">
<stk-ui:column property="OpTime" title="操作时间" pattern="yyyy-MM-dd hh:mm:ss"/>
<stk-ui:column property="UserCode" title="操作员" key="userinfo" pattern="code|name" parser="translate"/>
<stk-ui:column property="OpClass" title="操作类型" parser="dict" key="1086"/>
<stk-ui:column property="id" title="金额" collectMethod="SUM,AVG" parser="number" align="right"/>
<stk-ui:column property="OpContent" title="操作内容"/>
<stk-ui:column property="IpAddr" title="IP地址" cssStyle="color:red"/>
<stk-ui:column property="FirstLevel" title="一级菜单" parser="translate" key="menu"/>
<stk-ui:column property="SecondLevel" title="二级菜单" parser="translate" key="menu"/>
<stk-ui:column property="Memo" title="备注" maxWords="20" needHint="true"/>
</stk-ui:table>
其中Action现在可以对应一个类返回Query对象,也可以做成一个xml配置方式。反正还在完善中!
本文介绍了一种结合ExtJS和DWR技术的自定义JSP标签方法,通过简化前端开发流程,使开发者即使不懂ExtJS也能快速构建界面。文中详细展示了如何使用自定义标签创建面板、表单和表格组件,并提供了代码示例。

395

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



