论坛首页 Java版 Webwork

代码擂台,特别有请buaawhl

浏览 38968 次
该帖已经被评为精华帖
作者 正文
时间:2004-07-15
我也是一直在做Web应用,但是我的做法可以说极土,只用了jsp和java bean。没有用到任何的taglib,也没有用过任何现有的流行的框架。但是我想发起一个讨论,就是实现一些非常常见的Web应用,不同的方式,各自的代码是怎么样的,各位了解的人都把自己的实现方式贴出来,大家“比划比划”

1、学生成绩单
假设一个班级的学生,每人选修了数量不等的课程,在学期结束之后,需要打印一份班级的成绩单。大致的表格是这样的:

[code:1]
<table>
<tr>
<td>姓名</td>
<td>平均成绩</td>
<td>课程</td>
<td>单科成绩</td>
</tr>
<tr>
<td>张三</td>
<td>80</td>
<td>语文</td>
<td>80</td>
</tr>
<tr>
<td rowspan="2">李四</td>
<td rowspan="2">85</td>
<td>语文</td>
<td>80</td>
</tr>
<tr>
<td>数学</td>
<td>90</td>
</tr>
</table>
[/code:1]

2、服务项目列表
假设一家公司提供一系列的服务,这些服务被分为N个大类,每个大类又包含m个小类。我们需要把这个列表显示出来。大致的表格如下:

[code:1]
<table>
<tr>
<td colspan="4">A类服务</td>
</tr>
<tr>
<td>A1服务</td>
<td>A2服务</td>
<td>A3服务</td>
<td>A4服务</td>
</tr>
<tr>
<td colspan="4">B类服务</td>
</tr>
<tr>
<td>B1服务</td>
<td>B2服务</td>
<td>B3服务</td>
<td>B4服务</td>
</tr>
<tr>
<td>B5服务</td>
<td>B6服务</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
[/code:1]

就先出这样个题吧,其他的典型应用,等我想到了再写出来。
   
时间:2004-07-15
我的方式是 :

JSP+STRUTS+DAO+PO+MAP+VO+Hibernate!

虽然比楼上的构架多了五层.但是开发速度并不慢,现在我的瓶颈在STRUTS这一层,这一层开发效率低了.但总开发效率我觉得还是比得上 JSP+BEAN的


PO+MAP+VO+Hibernate 全部用工具生成, DAO层则半自动化.
   
0 请登录后投票
时间:2004-07-15
dhj1 写道
我的方式是 :

JSP+STRUTS+DAO+PO+MAP+VO+Hibernate!

虽然比楼上的构架多了五层.但是开发速度并不慢,现在我的瓶颈在STRUTS这一层,这一层开发效率低了.但总开发效率我觉得还是比得上 JSP+BEAN的


PO+MAP+VO+Hibernate 全部用工具生成, DAO层则半自动化.


把代码贴出来吧,咱们“用事实说话”:)
   
0 请登录后投票
时间:2004-07-15
庄表伟 写道
我也是一直在做Web应用,但是我的做法可以说极土,只用了jsp和java bean。没有用到任何的taglib,也没有用过任何现有的流行的框架。但是我想发起一个讨论,就是实现一些非常常见的Web应用,不同的方式,各自的代码是怎么样的,各位了解的人都把自己的实现方式贴出来,大家“比划比划”

1、学生成绩单
假设一个班级的学生,每人选修了数量不等的课程,在学期结束之后,需要打印一份班级的成绩单。大致的表格是这样的:

[code:1]
<table>
<tr>
<td>姓名</td>
<td>平均成绩</td>
<td>课程</td>
<td>单科成绩</td>
</tr>
<tr>
<td>张三</td>
<td>80</td>
<td>语文</td>
<td>80</td>
</tr>
<tr>
<td rowspan="2">李四</td>
<td rowspan="2">85</td>
<td>语文</td>
<td>80</td>
</tr>
<tr>
<td>数学</td>
<td>90</td>
</tr>
</table>
[/code:1]

2、服务项目列表
假设一家公司提供一系列的服务,这些服务被分为N个大类,每个大类又包含m个小类。我们需要把这个列表显示出来。大致的表格如下:

[code:1]
<table>
<tr>
<td colspan="4">A类服务</td>
</tr>
<tr>
<td>A1服务</td>
<td>A2服务</td>
<td>A3服务</td>
<td>A4服务</td>
</tr>
<tr>
<td colspan="4">B类服务</td>
</tr>
<tr>
<td>B1服务</td>
<td>B2服务</td>
<td>B3服务</td>
<td>B4服务</td>
</tr>
<tr>
<td>B5服务</td>
<td>B6服务</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
[/code:1]

就先出这样个题吧,其他的典型应用,等我想到了再写出来。


感谢邀请。
我努力回答你的题目。不要见笑。因为我不太明白你的HTML代码里面的规则和规律。我试着用fastm解决这个问题。

第一个问题,没有看出来具体的规律和规则。试写如下:

Fast Template is like.
[code:1]
<table>
<tr>
<td>姓名</td>
<td>平均成绩</td>
<td>课程</td>
<td>单科成绩</td>
</tr>
<!-- BEGIN DYNAMIC: score -->
<tr>
<td>{name}</td>
<td>{average_score}</td>
<td>{subject}</td>
<td>{score}</td>
</tr>
<!-- END DYNAMIC: score>
</table>
[/code:1]

java code is like.
[code:1]
List scores = new ArrayList();
IValueSet score1 = new ValueSet();
score1.setVariable("{name}", "张三");
....

scores.add(score1);
...

IValueSet valueSet = ValueSet();
valueSet.setDynamicVariable("score", scores);

response.getWriter().write(template.toString(valueSet));

[/code:1]

第二个问题,大概看出来了规律和规则。应该是每4个服务换一次行。试写如下:

fastm Template
[code:1]
<table>
<!-- BEGIN DYNAMIC: service_category-->
<tr>
<td colspan="4">{service_category}</td>
</tr>
<!-- BEGIN DYNAMIC: tr -->
<tr>
<!-- BEGIN DYNAMIC: td -->
<td>{service_name}</td>
<!-- END DYNAMIC: td -->
</tr>
<!-- END DYNAMIC: tr -->

<!-- END DYNAMIC: service_category -->
</table>
[/code:1]

java code is like
[code:1]

List serviceCategories = new ArrayList();

(for each service data){ // 假设所有的数据都存在于service data list里面

IValueSet serviceCategory = new ValueSet();
serviceCategory.setVariable("{service_category}",
service data.service category);

List services = service data.services;
int nServices = services.size();

int nLoop = nServices / 4;
List trs = new ArrayList();

int count = 0; // service counter

for(int j = 0; j < nLoop; j++){
IValueSet tr = new ValueSet();

List tds = new ArrayList();
for(int k = 0; k < 4; k++){
IValueSet td = new ValueSet();
td.setVariable("service_name", services[count]);

tds.add(td);

count++;
}
tr.setDynamicValueSet("td", tds);
trs.add(tr);
}
serviceCategory.setDynamicValueSets("tr", trs);

serviceCategories.add(serviceCategory);
}

IValueSet valueSet = new ValueSet();
valueSet.setDynamicValueSets("service_category", serviceCategories);

response.getWriter().write(template.toString(valueSet));
[/code:1]
   
0 请登录后投票
时间:2004-07-16
to:buaawhl

你没有理解我的意思,第一个题,关键在于rowspan="n",这个n要等于该学生的选修科目数。

第二个题,关键在于子服务的数目不一定能被4整除,剩下的空位,要用&nbsp;补足。

更加根本的问题在于,你的模板,有没有对逻辑判断的支持,支持程度如何?
   
0 请登录后投票
时间:2004-07-16
用velocity试写如下,代码已经过测试.

[code:1]###### 测试数据 ####################################
#set ( $score1 = ['语文','80'] )
#set ( $s1_scores = [$score1] )
#set ( $s1 = ['张三','80',$s1_scores] )

#set ( $score2 = ['数学','90'] )
#set ( $s2_scores = [$score1,$score2] )
#set ( $s2 = ['李四','85',$s2_scores] )

#set ( $students = [$s1,$s2] )
###################################################

<table border='1'>
<tr>
<td>姓名</td>
<td>平均成绩</td>
<td>课程</td>
<td>单科成绩</td>
</tr>
#foreach ( $student in $students )
<tr>
#set ( $rowspan="" )
#if ( $student.get(2).size() > 1 )
#set ( $rowspan = " rowspan='$student.get(2).size()'" )
#end
<td$rowspan>$student.get(0)</td>
<td$rowspan>$student.get(1)</td>
#set ( $index = 0 )
#foreach ( $score in $student.get(2) )
<td>$score.get(0)</td>
<td>$score.get(1)</td>
</tr>#if ( $index < $student.get(2).size() - 1 ) <tr> #end
#set ($index = $index + 1)
#end
#end
</table>[/code:1]

[code:1]###### 测试数据 ####################################
#set ( $subservice_a = ['A1服务','A2服务','A3服务','A4服务'] )
#set ( $service_a = ['A类服务',$subservice_a] )
#set ( $subservice_b = ['B1服务','B2服务','B3服务','B4服务','B5服务','B6服务'] )
#set ( $service_b = ['B类服务',$subservice_b] )
#set ( $services = [$service_a, $service_b] )
###################################################

<table border="1">
#foreach ( $service in $services )
<tr>
<td colspan="4">$service.get(0)</td>
</tr>
#set ( $rows = $service.get(0).size() % 4 )
#if ( $rows > 0 ) #set ( $rows = 1 ) #else #set ( $rows = 0 ) #end
#set ( $rows = $rows + $service.get(1).size() / 4 )
#foreach ( $row in [1 .. $rows] )
<tr>
#foreach ( $col in [1 .. 4 ] )
#set ( $index = ( $row - 1 ) * 4 + $col - 1 )
#if ( $index < $service.get(1).size() )
<td>$service.get(1).get($index)</td>
#else
<td>&</td>
#end
#end
</tr>
#end
#end
</table>[/code:1]
   
0 请登录后投票
时间:2004-07-16
谢谢,这样非常好!
   
0 请登录后投票
时间:2004-07-16
引用
你没有理解我的意思,第一个题,关键在于rowspan="n",这个n要等于该学生的选修科目数。

[code:1]<table>
<!-- BEGIN DYNAMIC: service_category-->
<tr>
<td colspan="4">{service_category}</td>
</tr>
<!-- BEGIN DYNAMIC: tr -->
<tr>
<!-- BEGIN DYNAMIC: td -->
<td>{service_name}</td>
<!-- END DYNAMIC: td -->
</tr>
<!-- END DYNAMIC: tr -->

<!-- END DYNAMIC: service_category -->
</table>
[/code:1]
把4改成{number}就可以了,由後端代码返回number.第二个,算是针对html tag的逻辑,让buaawhl试试
   
0 请登录后投票
时间:2004-07-16
这就更不对了,如果在数据部分,还要考虑到显示的逻辑,那不是乱了?
   
0 请登录后投票
时间:2004-07-16
我用Velocity写的,代码如下。
第一题:
[code:1]
<table border=1>
<tr>
<td>姓名</td>
<td>平均成绩</td>
<td>课程</td>
<td>单科成绩</td>
</tr>
#foreach ($student in $students)
#set ($scoreSheets = $student.getScoreSheets())
#foreach ($sheet in $scoreSheets)
<tr>
#if ($index == 0)
<td rowspan=$scoreSheets.size()>$student.getName()</td>
<td rowspan=$scoreSheets.size()>$student.getAverageScore()</td>
#end
<td>$sheet.getCourse()</td>
<td>$sheet.getScore()</td>
</tr>
#set ($index = $index + 1)
#end
#end
</table>
[/code:1]

第二题:
[code:1]
#foreach ($service in $services)
<tr>
<td colspan="4">$service.getName()</td>
</tr>

#set ($index = 0)
#foreach ($subService in $service.getSubServices())
#if ($index % 4 == 0)<tr>#end
<td>$subService.getName()</td>
#if ($index % 4 == 3)</tr>#end
#set ($index = $index + 1)
#end

#if ($index % 4 != 0)
#foreach ($i in [$index % 4 .. 3])
<td>& nbsp;</td>
#end
</tr>
#end

#end
[/code:1]

分析:因为HTML中固有的"rowspan"和"colspan"非结构化的原因,有时候不得不用一些较复杂逻辑语句来控制页面显示,减少了页面的可读性
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐