作者PsMonkey (痞子军团团长)
看板java
标题Re: [J2SE] Servlet动态产生html的元件问题
时间Sat Feb 18 15:10:29 2012
※ 引述《tkcn (小安)》之铭言:
: ※ 引述《Killercat (杀人猫™)》之铭言:
: : asp.net有类似HtmlTableController的东西可以动态产生html码,所以java有没有这种?
: : 可能类似
: : HtmlTable table = new HtmlTable();
: : table.addCaptain("Web App Name : ");
: : for(FooObj obj : objlists)
: : table.addRow(new HtmlTD(obj.getName()),
: : new HtmlTD(obj.getDir()),
: : new HtmlTD()...);
: : out.println(table.generateHTML());
: : 这样的东西?
: 有的,
: 在 Google Web Toolkit (GWT) 2.0 "之前" 的版本,
: code 差不多就是长这样。
哪有这麽讨厌... ==.====
明明 Grid 跟 FlexTable 根本不用管 <tr> <td>
直接
table.setText(col, row, " blahblah");
要空格跳格都没关系(当然,如果 border 跟 css 没弄好会有点丑)
要塞其他 widget (component) 也没问题(table.setWidget())
无聊一点也可以用 VerticalPanel 跟 HorizontalPanel 慢慢弄 [殴飞]
: 之所以特别强调 "之前",是因为 2.0 以後多了 uiBinder,
: 撇开一些细节不谈,这东西其实有点像是其他语言中的 Template。
小声说:UiBinder 不太能对付表格状的东西 [殴飞]
: 简单的说就是,UI 相关的 code 如 HTML, CSS 仍然如同静态网页的写法,
: 只将需要动态改变的部份,用特殊的语法标示出来,方面程式将需要的资料塞入其中。
: 相较於 HTML, CSS, JavaScript 全塞在 JSP/Servlet 的作法,
: 使用 Template 也有助於美工与程式设计师之间的合作。
而且还有 GWT Designer(base on WindowBuilder)
想要 WYSIWYG 也可以!
: 总而言之,GWT 即使在 2.0 之後,依然支援旧的 UI 使用方式,
: 然而我个人目前还是比较喜欢 uiBinder/Template 的作法。
还有一个 2.0 以後的大绝招,叫 Cell Widget
例如你要作一个显示 Foo 这个 pojo 的清单
假设 Foo 长这样
class Foo{
String name;
Date date;
int x;
int y;
//skip getter, setter, constructor and blahblah
}
那麽
//这是主角
CellTable<Foo> list = new CellTable<Foo>();
//让日期好看 & 炫耀的多余物 XD
DateTimeFormat format = DateTimeFormat.getFormat("MM/dd");
//设定各个 column 要怎麽显示
TextColumn<Foo> nameClmn = new TextColumn<Foo>{
public String getValue(Foo vo){
return vo.getName();
}
}
TextColumn<Foo> dateClmn = new TextColumn<Foo>{
public String getValue(Foo vo){
return format.format(vo.getDate());
}
}
TextColumn<Foo> numClmn = new TextColumn<Foo>{
public String getValue(Foo vo){
return "("+vo.getX()+","+vo.getY()+")";
}
}
//设定 column 的先後顺序、还有 <th> 叫啥
list.addColumn(nameClmn, "名字");
list.addColumn(dateClmn, "日期");
list.addColumn(numClmn, "座标");
//最後设定资料来源
AsyncDataProvider<Foo> dataProvider = new AsyncDataProvider<Foo>(){
//牵扯到 GWT RPC,先跳过
//简单地说就是在这里向 server 要资料
}
dataProvider.addDataDisplay(list);
//也有 SelectionModel 可以设定点选某 row 之後的动作
//还附送分页机制,基本上两三行解决,还不用一次全部 load 回来
打完收工!
搭配 UiBinder 来配置 layout 也没问题 \囧/
还有其他的 Cell 系列 widget 可以用 \囧/
要客制化自己的 Cell widget 也不是问题 \囧/
就这麽简单、就这麽 Java、还不赶快弄一套来用 [咦咦?]
当然,我不会那麽坏心隐藏糟糕点
→Cell Widget 背後运作原理相当复杂、class hierarchy 互相纠结
在土炮地追了一两天 source code
甚至怀疑里头有重复呼叫 method 的嫌疑 (仅供参考 XD)
→这导致如果你要用 CellTable 作一些本身规格以外的事情
会有一种使不上力、也不知要无从改起的困扰
(这很可能只是个人程度问题 Orz)
在小量资料、需要一些额外操作的 pojo
我会选择自己刻 widget [炸]
: 如果你先前没接触过相关的知识,
: 不妨先去了解一下其他语言如 JSP,使用 Template 的方式,
还是一样,把糟糕点一起讲一讲
GWT 可以用 Java 写网页的很欢乐,
这里只讲「画面组成可以多 Java」
但是
→运气不好还是需要了解网页的 rendering 机制
就像真正下去写 Swing 还是会遇到 rendering 机制的问题
只是现在面对的是浏览器的机制
如果会 CSS、或身边有会 CSS 的人一起配合会少一点鬼打墙的状况
例如为甚麽(在某些浏览器)add 一个 widget 会没反应
但是 setSize() 之後就正常
他们那种每天在算 margin/padding 的人,通常会对这种东西很了解
→跟传统 JSP/PHP 比起来,debug 会困难一点
毕竟传统 JSP/PHP... 说穿了就是字串操作
当然,如果你有打算卡 AJAX
我想其他解决方案也差不多痛苦、也许 jQuery 派会容易些
但是 GWT 要抓 rendering 机制造成的错误,真的还蛮痛苦的
→目前 development mode 下,实际操作的反应的确不太快
按个 button 都可以 lag 个一秒钟才有反应
这对作游戏的可能更明显,参阅这篇
http://pt2club.blogspot.com/2011/02/gwt-html5.html
当然,实际 deploy 成 JS 就不会有速度上的困扰
: 如果仍然不习惯,那...
: 欢迎你加入 GWT 阵营 \囧/
错错错!当然是「不管你习不习惯...」
欢迎你加入 GWT 阵营 \囧/
====
总之,不要再用 servlet 兜画面了...... [炸]
--
钱锺书:
说出来的话
http://www.psmonkey.org
比不上不说出来的话
Java 版 cookcomic 版
只影射着说不出来的话
and more......
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.12.165
1F:→ Killercat:其实当初是不想跑iis/mono才选我也很熟练的java XD 02/19 01:45
2F:→ Killercat:而且我本来就在开android,很多code module可以重用 02/19 01:47
3F:→ Killercat:不过说真的新大陆也满好玩的,来玩玩看吧(?) XD 02/19 01:49