Gwt-Ext ComboBox

2009.03.17 / 标签: , / 分类: ExtJS

这几天比较忙,每天从早到晚的写代码,改错,测试…没办法,谁让时间紧迫呢,后天就要交工,前天刚写完项目总结,我还挺郁闷的,都还没做完呢就先让把总结交了,更没想到的是我竟然写了1千6百字左右。
回到主题吧。Ext中的ComboBox使用本地数据源我会用,而使用远程服务器上抛出的数据我还没搞过。官方给的例子中也没有与我的需求相类似的,但也不能就这样放弃了吧。突发灵感,不是有GridPanel的例子吗?能不能试试根据GridPanel的例子改成ComboBox的呢?结果还真改成功了!下拉框也能分页,很不错!不过既然ComboBox有setDisplayField()方法,为什么就不提供一个getDisplayField()的方法呢?setDisplayField()设置显示值,setValueField()设置隐含值,可我现在既要显示出来的又要隐含着的,为什么就不提供一个方法呢?我想getText()方法取出来的应该是页面上显示的值了吧,可是却恰恰相反,郁闷~
看来我只能是在其onSelect事件中从record中取出需要的值,然后存放到一个隐藏域中使用了。

将JavaBean及List集合转换为JSON

2009.03.13 / 标签: ,,, / 分类: ExtJS

由于我的那个GridPanel要求数据源提供的数据为JSON格式,而我用Hibernate查出来的要么是List集合要么就是JavaBean。要把这样的数据转成JSON格式我是手工拼出来的。可是我很懒,我想用更简单更快捷的方式把他们转成JSON,为了实现这种转换,就必须找到传说中的如下6个jar包。
commons-beanutils-1.7.0.jar
commons-collections-3.2.jar
commons-lang-2.0.jar
commons-logging-1.0.4.jar
ezmorph-1.0.2.jar
json-lib-2.2.2-jdk15.jar
在net.sf.json.*下为你提供了很多工具类。但是这个直接转换出来的JSON还不是我想要的最终效果,我还需要指定数据总数等,而且这种格式要被多次使用。于是自己写了个工具类,对其进行了简单的封装。

import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
public class Java2JSON {
public static JSONObject generate(List<?> list,int count) {
Map<String, Object> map = new Hashtable<String, Object>();
map.put("totalCount", count);
map.put("topics", list);
return JSONObject.fromObject(map);
}
public static JSONObject javabean2json(Object object) {
Map<String, Object> map = new Hashtable<String, Object>();
map.put("success", true);
map.put("data", object);
return JSONObject.fromObject(map);
}
}

转换的结果是JSONObject类型,调用该对象自身的toString()方法即可得到JSON语句。

GWT-EXT GridPanel显示FormPanel模糊查询结果

2009.03.12 / 标签: ,, / 分类: ExtJS

首先当然是要提交查询条件了,这里我使用一个名为Search的Servlet来处理模糊查询。在FormPanel的Form中对其onActionComplete事件进行监听,获取Servlet返回的查询结果。而onActionComplete事件的触发需要Servlet返回一个JSON:{“success”,true},只有这里的success为true时才会触发该事件,为false则触发onActionFailed事件。

可是,我现在还要得到查询的结果啊,如果我查询结果既要触发onActionComplete又要带上查询结果,那么我的JSON就得是下面这种格式:

{success:true,results:’{totalCount:1,topics:[{id:100,custName:"neeke",summarization:"概要",linkMan:"联系人",linkPhone:"联系电话",createTime:"2009-03-17"}]}’}

可是onActionComplete的responseText是String类型的,我怎么才能获得results的值能?

经过反复摸索,终于将其搞定了。首先使用JSON.decode()将responseText转为JavaScriptObject类型,接着使用JavaScriptObjectHelper.getAttribute(jsObj, “results”)即可将results的值以String类型取出,最后使用grid.getStore().loadJsonData(results,false)将查询结果载入到GridPanel中去。具体代码如下:

searchPanel.getForm().addListener(new FormListenerAdapter(){
@Override
public void onActionComplete(Form form, int httpStatus,
String responseText) {
JavaScriptObject jsObj = JSON.decode(responseText);
String results = JavaScriptObjectHelper.getAttribute(jsObj, "results");
grid.getStore().loadJsonData(results, false);
}
});

其中loadJsonData()方法的第二个Boolean型参数指定是否将数据追加到GridPanel中去,这里我设为false,这样在载入查询结果之前会自动清空GridPanel中之前的数据。

GWT-EXT的FormPanel和GridPanel

2009.03.11 / 标签: ,, / 分类: ExtJS

这几天我是边学边用,其效率真是苦不堪言啊!每天都有新的问题,百度基本上都搜不到有用的东西,Google搜出来的都是老外的网站,而且也都很少有针对性的问题解决方案。没办法,时而百度,时而Google,最后还是觉得官方的API文档和论坛(http://www.gwt-ext.com/forum)比较有用。

GridPanel现在要加载数据进来,官方给出的例子中使用的是ScriptTagProxy进行数据代理的,API文档对其描述很长很长(后来才发现的),文档中说如果要调用远程域服务器中的数据的话建议使用ScriptTagProxy,如果是调用本地域服务器的数据的话建议使用HttpProxy,并且给出了返回数据的格式样例,这个格式是JSON格式,而API文档中对HttpProxy的描述却要求返回的是XML格式,两个怎么矛盾了?而且我试了HttpProxy,发现根本没法用,用于分页控制的start和limit参数都没了。
可是我换回ScriptTagProxy并调用自己的服务器端时也不行,我打开官方提供的那个数据源http://extjs.com/forum/topics-browse-remote.php,按照那个格式输出也同样不行,数据源的URL改成官方的就又好了,我直接就郁闷了…我想了下,是不是ScriptTagProxy在访问URL获取数据的时候带什么参数了?根据参数有选择的返回数据格式?于是将request.getQueryString()输出看了一下,其值为:start=0&limit=15&_dc=1236763663074&callback=stcCallback1001
并不是我想象中只有start和limit,于是我把这些参数拼接到官方的那个URL之后,发现其返回的值格式是这样:
stcCallback1001(JSON)
晕倒…赶紧查API文档(之前感觉这里的描述长就没多看),原来需要在Server端取出callback这个参数,然后用该参数将JSON包含起来并输出。ScriptTagProxy会读取被callback括起来的内容,而且每次请求时_dc和callback的值都是不一样的,而_dc这个参数具体干什么用“好像没写”-_-!
文档中给出的样例:

boolean scriptTag = false;
String cb = request.getParameter("callback");
if (cb != null) {
scriptTag = true;
response.setContentType("text/javascript");
} else {
response.setContentType("application/x-json");
}
Writer out = response.getWriter();
if (scriptTag) {
out.write(cb + "(");
}
out.print(dataBlock.toJsonString());
if (scriptTag) {
out.write(");");
}

现在要对GridPanel中的数据在一个FormPanel中进行编辑修改,这就要将GridPanel选中行的数据添加到FormPanel中去,且要将FormPanel放进一个Window中并弹出来。一句editForm.getForm().loadRecord(grid.getSelectionModel().getSelected())即可,可是编辑窗是弹出来了,但是里面却没有选中的那行数据,API文档中对此loadRecord()方法的描述是这样的:
Loads a Record into this form. The name of the Fields in the RecordDef must match the names of the Fields in the From.
可是我的GridPanel中各列定义的name属性和FormPanel中定义的都一样啊,怎么还是不行呢?就这一个问题让我想了好几个小时o(︶︿︶)o唉,突然间想起来了点什么,改动了一下位置就好了。
editWin.add(editForm);
editWin.show();
editForm.getForm().loadRecord(grid.getSelectionModel().getSelected());
原先我是先loadRecord()然后再调用show()方法的,结果调整了一下顺序就好了,具体为什么必须先show()我就不知道了。

现在的问题是,如何显示当前系统时间,以及将模糊查询的结果在GridPanel中显示出来,APIing…

我该何去何从呢

2009.03.08 / 标签: / 分类: 生活点滴

1.GWT-EXT OR EXT-GWT

正学着EXT-GWT,老狼说建议我还是学GWT-EXT比较有前途,难道这就是为什么我没找到EXT-GWT相关资料的原因?其实这两个的相关JAR包和API文档我都有下载,今天又看了一下GWT-EXT,感觉这个的API文档写的比EXT-GWT稍清楚一些,而且一些命名也很容易联想,网上这方面的资料好像也比较多。

2.是北京,是上海,还是深圳

找不找得到先不说,准备去哪个城市找工作成问题了。我最初最初的打算是北京(那是还没金融危机),后来了解各方面情况后打算去深圳,前几天又和几个朋友聊,说大家一起去上海吧,干什么都有个照应,房子大家也好合租。昨天晚上我一初中同学又让我和他去北京,而且老狼也建议去北京,说要么和他一起去。上海,深圳我是一个认识的人都没有,北京我有那么几个已经工作了几年的朋友。
哎~实在不知道该怎么选啦,顺其自然吧…

无觅相关文章插件,快速提升流量