论坛首页 Java企业应用论坛

『讨论』关于b/s换肤大家有什么好的思路。

浏览 9991 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-12-16  
软件环境:
在java里来实现换肤好象比较困难。我感觉至少比php要困难许多。
配置文件:
struts1.1
tiles
错误提示信息:
我现在偿试用tiles来做,只能在tiles-defs.xml上做文章,做多个tiles-defs.xml,这样只能让系统来决定用户的皮肤,而不能让用户自已来决定自已的皮肤。如果只是做简单的色彩字体变换就比较容易,只是换css而已.


你的分析:
velocity实现起来会怎么样呢?

有那位做过这方面的实现?能不能分享一样思路呢?共同讨论一下。
   发表时间: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。
0 请登录后投票
   发表时间:2004-12-17  
谢谢你的分享。我正在看一些fastm,等我做一个测试之后再同你讨论。
0 请登录后投票
   发表时间:2004-12-17  
buaawhl 写道

-- 103k的附件,怎么也传不上去。sorry。



终于看到附件了,3Q!
0 请登录后投票
   发表时间: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之后丢失了">"。
0 请登录后投票
   发表时间:2004-12-25  
用turbine可以动态实现换
0 请登录后投票
   发表时间:2004-12-25  
引用
<select name="address" {readonly}>


改成:

<select name="address" {readonly} >

即在{readonly}和>之间加一个空格,就正常了。
0 请登录后投票
   发表时间:2004-12-25  
herrysun 写道
引用
<select name="address" {readonly}>


改成:

<select name="address" {readonly} >

即在{readonly}和>之间加一个空格,就正常了。


非常感谢。确实是一个bug。
fastm新版本发布的时候,会包括这个fix。
多谢herrysun的对fastm的使用和发现。
0 请登录后投票
   发表时间:2004-12-25  
不必感谢,见到国人自己的开源项目真的十分高兴! 要感谢buaawhl所作的工作。关于fastm,我看了你上面的例子,对fastm很感兴趣,有几点问题如下:
1、input.contentV.setVariable("reference", result);
     能否解释一下"reference"代表什么意思?为什么不是带{}的?
2、IValueSet嵌套的具体用法?
3、每次请求都去调模板文件,然后用Parser.parse(templateFile)解析,会不会造成性能和效率下降,是否可以通过Cache来提高效率。

正在研究中,可能说的不对,请批评指正。
0 请登录后投票
   发表时间:2004-12-25  
herrysun 写道
不必感谢,见到国人自己的开源项目真的十分高兴! 要感谢buaawhl所作的工作。关于fastm,我看了你上面的例子,对fastm很感兴趣,有几点问题如下:
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扩展功能。
一直没有这样做,不是因为难度,而是怕这种方式太灵活,类型太弱,容易引起很多误用,难以调试。这个特性还需要更多的考虑和反馈,也许以后会加入。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics