锁定老帖子 主题:『讨论』关于b/s换肤大家有什么好的思路。
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-16
在java里来实现换肤好象比较困难。我感觉至少比php要困难许多。 配置文件: struts1.1 tiles 错误提示信息: 我现在偿试用tiles来做,只能在tiles-defs.xml上做文章,做多个tiles-defs.xml,这样只能让系统来决定用户的皮肤,而不能让用户自已来决定自已的皮肤。如果只是做简单的色彩字体变换就比较容易,只是换css而已. 你的分析: velocity实现起来会怎么样呢? 有那位做过这方面的实现?能不能分享一样思路呢?共同讨论一下。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-12-16
fastm相当于java版本的php。只是定义更丰富一些,操作上更加灵活一些。
附件里是我做的fastm的一个简单的portal layout的例子。 解压后,放到Tomcat里面直接运行。点击首页里面的tile demo连接。 可以增加, 移动,删除page。 可以增加, 移动,删除 column。 可以增加, 移动,删除 content。(portlet) 用户可以在运行期间,为Page动态换skin。 本例子提供了3个layout skin,分别对应tile目录下的 tile.html, tile1.html, tile2.html. (不包含任何逻辑脚本) 扩展一下,完全可以做到动态增加布局,浏览,应用的功能。一个做CMS项目的朋友正在应用fastm做这件事情。 增加 content 的时候,可以选择内容,字体颜色,字体类型。 ---- 另, xslt, velocity, freemark, struts taglib, sitemesh 也可以用来布局。 sitemesh 用servlet filter技术实现。 有兴趣,大家可以试一下。看看如何实现与本例相同的 动态布局 效果。 动态布局的关键是 布局选择 必须支持可编程,而不仅仅是可配置。可编程 必然 可配置,可配置 却不一定 可编程。 上述技术中,能够直接支持 动态布局的,只有XSLT。 你可以在程序运行期间,选择不同的XSL。 不同的XSL里面用的显示风格和html tag不一样,但是显示逻辑(match, choose)部分,却全都是一样的,重复的。 -- 103k的附件,怎么也传不上去。sorry。 |
|
返回顶楼 | |
发表时间:2004-12-17
谢谢你的分享。我正在看一些fastm,等我做一个测试之后再同你讨论。
|
|
返回顶楼 | |
发表时间:2004-12-17
buaawhl 写道 -- 103k的附件,怎么也传不上去。sorry。 终于看到附件了,3Q! |
|
返回顶楼 | |
发表时间:2004-12-25
我修改了demo.html模板如下:
<html> <head> <title>Demo</title> </head> <body> <h1>{message}</h1> show addresses in table<br> <table border=1> <tr> <!-- BEGIN DYNAMIC : address --> <td>{city}</td><td>{zipcode}</td> <!-- END DYNAMIC : address --> </tr> </table> <br/> show addresses in select dropbox<br> <select name="address" {readonly}> <!-- BEGIN DYNAMIC : address --> <option value="{city} - {zipcode}">{city} - {zipcode}</option> <!-- END DYNAMIC : address --> </select> <br/> <br/> <a href="home.html">back to home</a> </body> </html> 在select中增加了{readonly},在FastmAction增加了代码(红色部分): public static IValueSet makeValueSet(){ IValueSet valueSet = new ValueSet(); // the whole document int n = Address.data.length; List addresses = new ArrayList(n); for(int i = 0; i < n; i++){ Object[] cityZip = Address.data[i]; IValueSet address = new ValueSet(); address.setVariable("{city}", cityZip[0]); address.setVariable("{zipcode}", cityZip[1]); addresses.add(address); } valueSet.setDynamicValueSets("address", addresses); valueSet.setVariable("{message}", "Fastm Page"); valueSet.setVariable("{readonly}", "readonly"); return valueSet; } 按说应该在输出叶面上得到: <select name="address" readonly> 但是却得到: <html> <head> <title>Demo</title> </head> <body> <h1>Fastm Page</h1> show addresses in table<br> <table border=1> <tr> <td>Bei Jing</td><td>100008</td> <td>Xia Men</td><td>361005</td> </tr> </table> <br/> show addresses in select dropbox<br> <select name="address" readonly <option value="Bei Jing - 100008">Bei Jing - 100008</option> <option value="Xia Men - 361005">Xia Men - 361005</option> </select> <br/> <br/> <a href="home.html">back to home</a> </body> </html> 在select的readonly之后丢失了">"。 |
|
返回顶楼 | |
发表时间:2004-12-25
用turbine可以动态实现换
|
|
返回顶楼 | |
发表时间:2004-12-25
引用 <select name="address" {readonly}>
改成: <select name="address" {readonly} > 即在{readonly}和>之间加一个空格,就正常了。 |
|
返回顶楼 | |
发表时间:2004-12-25
herrysun 写道 引用 <select name="address" {readonly}>
改成: <select name="address" {readonly} > 即在{readonly}和>之间加一个空格,就正常了。 非常感谢。确实是一个bug。 fastm新版本发布的时候,会包括这个fix。 多谢herrysun的对fastm的使用和发现。 |
|
返回顶楼 | |
发表时间:2004-12-25
不必感谢,见到国人自己的开源项目真的十分高兴!
![]() 1、input.contentV.setVariable("reference", result); 能否解释一下"reference"代表什么意思?为什么不是带{}的? 2、IValueSet嵌套的具体用法? 3、每次请求都去调模板文件,然后用Parser.parse(templateFile)解析,会不会造成性能和效率下降,是否可以通过Cache来提高效率。 正在研究中,可能说的不对,请批评指正。 |
|
返回顶楼 | |
发表时间:2004-12-25
herrysun 写道 不必感谢,见到国人自己的开源项目真的十分高兴!
![]() 1、input.contentV.setVariable("reference", result); 能否解释一下"reference"代表什么意思?为什么不是带{}的? 2、IValueSet嵌套的具体用法? 3、每次请求都去调模板文件,然后用Parser.parse(templateFile)解析,会不会造成性能和效率下降,是否可以通过Cache来提高效率。 正在研究中,可能说的不对,请批评指正。 多谢你对这个demo source的研究。抓住了很多问题的关键。 1. 在layout里面定义了一个 dynamic part, name 是 reference。 假如IValueSet给这个reference 设置了对应的value set list。 比如,valueSet.setDynamicValueSets("reference", a list of value sets); 这个时候,reference会分别根据list里面的每个value set显示list.size()次。 这是一般情况。 假如,IValueSet没有给reference 设置对应的value set list。 那么,这个fastm也会试图为reference找一个对应的variable。 这里就是这个用法,把一个 dynamic part整个替换掉,换成一个variable的值。 2. 上面讲的valueSet.setDynamicValueSets() 方法,就是嵌套的用法。 你看tile.xml里面的dynamic part嵌套了多层。 3. 对。可以而且应该通过page cache来做。通过TemplateLoader就可以做到。每次只是template文件改变了,才重新加载。 我的代码为了尽量简单,很多地方都省略了。比如,demo直接用input的很多公共成员变量,没有使用getter, setter。还有很多其他违反OO的地方。sorry. :-) herrysun, 如果你觉得我的解释还是不够清楚,可以直接通过MSN或Email和我讨论(if you like :-)),我们可以详细的讨论demo和fastm本身的架构和设计思路。(如果你在这javaeye站内找不到我的MSN,请发站内短信和我联系。我以前在一个帖子中写了自己的MSN,已经有些违规了,不好再写第二遍。:-)) 关于IValueSet的操作方式,我这里多说明一下。 javaeye的很多朋友提出很好的建议,说,不用这个IValueSet,可以直接采用OGNL。 Template不用和ValueSet匹配,可以直接和一个Object匹配。 fastm可以根据template里面的OGNL定义,直接去找Object里面对应的子对象或属性。这样会灵活、友好很多。velocity, freemarker都是这种Object的方式。 我也觉得这个方式非常吸引人,也一直想加入这个fastm的OGNL扩展功能。 一直没有这样做,不是因为难度,而是怕这种方式太灵活,类型太弱,容易引起很多误用,难以调试。这个特性还需要更多的考虑和反馈,也许以后会加入。 |
|
返回顶楼 | |