论坛首页 Java企业应用论坛

代码擂台,特别有请buaawhl

浏览 69604 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-07-18  
如果真的要比较,找一个正经一点的jsp过来,中间没有java代码的那种,最好使用了jstl。
而且,比较的起点是model已经将所有需要现实的数据对象准备好。比较的基点是 fastm模板 + java端ValueSet构建程序 vs velocity脚本。
最好先把那些与动态无关的细节去掉,javascript也先略掉,省得影响注意力。
0 请登录后投票
   发表时间:2004-07-18  
这是我的JSP+Taglib的例子,效果图在附件里。

<!-- 查询条件 -->

<table width="100%" border="0" cellspacing="0" cellpadding="0" height="30" class="searchbox">
<form name="roomCondition" method="post" action="/hotel/room_list.jsp">
<tr> 
	<td>房号<ww:textfield name="ROOM_NO" size="5" value="#$ROOM_NO"/>&
		楼层<ww:select name="FLOOR" value="#$FLOOR" list="#hotelService.getFloors(#currentOrgRole.id);" listKey="name" listValue="id" nullLabel="所有"/>&
		房类<ww:select name="ROOM_TYPE" value="#$ROOM_TYPE" list="#dictionary.getItems('room_type');" listKey="text" listValue="code" nullLabel="所有房类"/>&房态<ww:select name="ROOM_STATUS" value="#$ROOM_STATUS" list="#dictionary.getItems('room_status');" listKey="text" listValue="code" nullLabel="所有房态"/> &
		<button onclick="submitAction();">查询</button>
</td>
</tr>
</form>
</table>

<!-- magic:table 是表格控件 -->

<magic:table
		query="select r from Room as r where (? is null or r.roomNo=?); and (? is null or r.floor=? ); and (? is null or r.roomType=?); and (? is null or r.status=?);"
		title="客房列表"
		rowId="#r.id"
		length="50"
		showSequence="false"
		selectUI="checkbox"
	>
	<magic:queryParam value="#$ROOM_NO"/>
	<magic:queryParam value="#$ROOM_NO"/>
	<magic:queryParam value="#$FLOOR"/>
	<magic:queryParam value="#$FLOOR"/>
	<magic:queryParam value="#$ROOM_TYPE"/>
	<magic:queryParam value="#$ROOM_TYPE"/>
	<magic:queryParam value="#$ROOM_STATUS"/>
	<magic:queryParam value="#$ROOM_STATUS"/>
	
	<magic:column value="#r.roomNo" title="客房号" href="'javascript:onEdit(' + #r.id + ');'"/>
	<magic:column value="#r.building.party.name" title="楼宇"/>
	<magic:column value="#r.floor.name" title="楼层"/>
	<magic:column value="#r.roomTypeObj.text" title="房类"/>
	<magic:column value="#dictionary.getText('room_status',#r.status);" title="房态"/>
	<magic:column value="#formatUtil.longToCurrency(#r.roomTypeObj.price);" title="客房价格"/>
	<ww:if test="!#$selectmode && !#$viewmode">
		<magic:column value="'设置'" title="房态设置" href="'javascript:setRoomStatus(' + #r.id + ');'"/>
	</ww:if>
</magic:table>
0 请登录后投票
   发表时间:2004-07-18  
charon 写道
如果真的要比较,找一个正经一点的jsp过来,中间没有java代码的那种,最好使用了jstl。
而且,比较的起点是model已经将所有需要现实的数据对象准备好。比较的基点是 fastm模板 + java端ValueSet构建程序 vs velocity脚本。
最好先把那些与动态无关的细节去掉,javascript也先略掉,省得影响注意力。


我前面的贴子里面有一个Portal Demo,恰好符合你的要求。
能否提供一个JSTL或Velocity的对应版本?
0 请登录后投票
   发表时间:2004-07-18  
charon 写道

比如,你刚才给的那个jsp的例子就是一个写的极其烂的例子。java程序都写在脚本里面了。本身就不符合mvc的架构。
fastm的取代目标不会是这种脚本吧。
至于重用机制,找spring的samples里面的东西看一看。虽然那里只有jsp的,但velocity的也差不多
另外,你的那个与jsp对应的fastm,请把java端代码也写上。否则的话,相当于没意义


我下载了Spring的源代码。找了一下JSP。但没有找到具体的重用机制。给点提示好吗?
你是说include file之类的重用吗?
如果只有这个,我的blog文章中已经分析过了include file重用。
include file只能把整个code + html重用。
哪怕html的静态风格和布局需要一点变化,include file就不管用了。

从你的说法来看,JSTL才是脚本。我以为JSP的脚本是Java,所以才提供了那段代码。既然你说很烂,我就把它删了。
0 请登录后投票
   发表时间:2004-07-18  
看完前面6页,很明显感受到,各人的观点很大程度上取决于他在Web开发上的长处/弱点,比如 dlee,会比较推荐使用XMLHTTP+JS构建复杂的View,而buaawhl可能是因为不是特别擅长HTML/JS,所以提出的fastm,是不是希望可以通过一些所见即所得的工具来编写页面呢?

不过以我个人喜好而言,我还是喜欢使用手工来写HTML代码的,所见即所得的工具产生的代码,一是过于冗长和罗索,二是精确的地方反而很难控制,而且,纵容了copy/paste的坏习惯,所以,我不会接受所有的控制逻辑都方在Java代码的方式,嘿嘿。
0 请登录后投票
   发表时间:2004-07-18  
buaawhl 写道


我下载了Spring的源代码。找了一下JSP。但没有找到具体的重用机制。给点提示好吗?
你是说include file之类的重用吗?
如果只有这个,我的blog文章中已经分析过了include file重用。
include file只能把整个code + html重用。
哪怕html的静态风格和布局需要一点变化,include file就不管用了。

在spring的samples\countries中有一个例子,这个例子和你想象的有非常大的不同,你可以仔细去看一看,关键是war\WEB-INF\classes下面的那个views-countries.properties文件,还有与之对应的那个model.jsp.
布局放置在model.jsp中,好处就在于整个应用风格的一致性。
我用的是velocity,配置方式和这个几乎一模一样。

引用

从你的说法来看,JSTL才是脚本。我以为JSP的脚本是Java,所以才提供了那段代码。既然你说很烂,我就把它删了。

也许是我对那些把大段java代码放置在jsp中深恶痛绝吧,虽然对于前taglib时代,用if/else/for 等控制显示逻辑的做法还是情有可原的,但是把大堆其它代码也放在这里,就有很大的问题。首先就是调试巨难,没法重用,很多时候导致的是jsp+数据库的直接2层结构。
在现在的jstl年代,jsp中不用jstl或特定框架给出的定制标签是不可想象的。在我的印象里面,2001年是个分水岭。那个时候虽然jstl还没有落局,但是struts已经成形了。
0 请登录后投票
   发表时间:2004-07-18  
charon 写道

在spring的samples\countries中有一个例子,这个例子和你想象的有非常大的不同,你可以仔细去看一看,关键是war\WEB-INF\classes下面的那个views-countries.properties文件,还有与之对应的那个model.jsp.
布局放置在model.jsp中,好处就在于整个应用风格的一致性。
我用的是velocity,配置方式和这个几乎一模一样。


哦,这么详细的提示和专业帮助。
非常感谢你为我的提问花的时间。

在model.jsp文件。
<c:import url="${nav}"/>
<c:import url="${content}"/>

在views-countries.properties文件。
copyView.attributesCSV=htitle=[copy.htitle],nav=[nav.jsp],content=[copy.jsp]

这种配置方式确实很灵活,能够实现布局的重用(Model.jsp)。并且实现了Tile的功能。
比如,如果content=copy.jsp。Model.jsp就把Copy.jsp引入到相应的位置。
这样每个jsp文件都是可以重用的。这种重用确实做的很不错了。

不过,我们还是再讨论一下更低一个层次的重用。:-)
在jsp或Velocity内部的逻辑的重用。(sorry, 因为这是fastm的强项,所以不厌其烦的多说一下。多包涵)

比如,我们来看copy.jsp的代码。

<h2><fmt:message key="copy.title"/></h2>
<p>&</p>
<c:choose>
  <c:when test="${copyMade}">
    <h3><fmt:message key="copy.ok"/></h3>
  </c:when>
  <c:otherwise>
    <h3><fmt:message key="copy.nok"/></h3>
  </c:otherwise>
</c:choose>


如果我们有这样的需求怎么办?
比如,有些页面需要把风格显示为h4, 而不是h3.
并且需要添加一行文字。
这时候怎么办?只好把这个文件拷贝到另一个文件。
把所有的h3换成h4。然后把文字添加进去。

<h2><fmt:message key="copy.title"/></h2>
<p>&</p>
<c:choose>
  <c:when test="${copyMade}">
    here we add a line.
    <h4><fmt:message key="copy.ok"/></h4>
  </c:when>
  <c:otherwise>
     here we add a line too.
    <h4><fmt:message key="copy.nok"/></h4>
  </c:otherwise>
</c:choose>


这时候,
<c:choose>
  <c:when test="${copyMade}">
  </c:when>
  <c:otherwise>
  </c:otherwise>
</c:choose>


这段逻辑是无法重用的。
这种换Skin的情况(不同的显示风格和位置,相同的数据)在应用中也经常存在。
如果这段逻辑存在于Java Code中(比如fastm的做法),那么这段逻辑就可以重用了。
0 请登录后投票
   发表时间:2004-07-19  
如果就事论事,这个h3/h4或者文字的替换还是非常简单的。可以把这类东西在velocity文件中搞成一个变量。最后在那个属性文件中设置这个变量的值(同时也可以设置默认值)。
需要更改的只是那个属性文件。如果需要动态更改,则这个变量还可以从session中直接读过来。这里有一个优先关系。
对于同一个velocity文件,因为静态属性的设置不同,在静态上就可以起到多个的效果。如果是动态的,则完全是占位符号的设置问题。
你那个门户的demo太复杂,现在才有点看明白。不过,我估计仅就这个例子而言,大概是平分秋色(主要是fastm的那个begin.....太多了,而且成对出现,对长度有影响,差不多抵消了velocity的foreach)。
但是,如果不使用js脚本,要求对刚才操作的列显示不同的颜色,做这样的一个改动的话,你觉得该怎么办?
0 请登录后投票
   发表时间:2004-07-19  
charon 写道
如果就事论事,这个h3/h4或者文字的替换还是非常简单的。可以把这类东西在velocity文件中搞成一个变量。最后在那个属性文件中设置这个变量的值(同时也可以设置默认值)。
需要更改的只是那个属性文件。如果需要动态更改,则这个变量还可以从session中直接读过来。这里有一个优先关系。
对于同一个velocity文件,因为静态属性的设置不同,在静态上就可以起到多个的效果。如果是动态的,则完全是占位符号的设置问题。
你那个门户的demo太复杂,现在才有点看明白。不过,我估计仅就这个例子而言,大概是平分秋色(主要是fastm的那个begin.....太多了,而且成对出现,对长度有影响,差不多抵消了velocity的foreach)。
但是,如果不使用js脚本,要求对刚才操作的列显示不同的颜色,做这样的一个改动的话,你觉得该怎么办?


:-) sorry. 那个demo的UI不是很友好。
你这么一说,我相信Velocity实现起来也不复杂。
只是一个粗浅的Demo,就不用花时间实现了。

如果不使用js,fastm只好在java code中设置颜色变量了。你指出过这是个
bad smell。而Velocity只要用if 逻辑就可以实现。

-----
“需要更改的只是那个属性文件。如果需要动态更改,则这个变量还可以从session中直接读过来。这里有一个优先关系。
对于同一个velocity文件,因为静态属性的设置不同,在静态上就可以起到多个的效果。如果是动态的,则完全是占位符号的设置问题。”
-----
你这么一说,我才知道,Velocity的用法如此强大。这个问题确实没有问题。
你觉得,“变量”、“占位符号”这个概念和fastm的基本思路有没有相通的地方?

另外,假如风格和位置变化比较大的情况下,Velocity有什么好的方法?
比如,同样的数据,一个List显示风格,和一个Table显示风格。
0 请登录后投票
   发表时间:2004-07-19  
看了fastm,总感觉template和valueset之间还有一层。
0 请登录后投票
论坛首页 Java企业应用版

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