锁定老帖子 主题:代码擂台,特别有请buaawhl
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-07-15
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> 2、服务项目列表 假设一家公司提供一系列的服务,这些服务被分为N个大类,每个大类又包含m个小类。我们需要把这个列表显示出来。大致的表格如下: <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> 就先出这样个题吧,其他的典型应用,等我想到了再写出来。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-07-15
dhj1 写道 我的方式是 :
JSP+STRUTS+DAO+PO+MAP+VO+Hibernate! 虽然比楼上的构架多了五层.但是开发速度并不慢,现在我的瓶颈在STRUTS这一层,这一层开发效率低了.但总开发效率我觉得还是比得上 JSP+BEAN的 PO+MAP+VO+Hibernate 全部用工具生成, DAO层则半自动化. 把代码贴出来吧,咱们“用事实说话”:) |
|
返回顶楼 | |
发表时间:2004-07-15
庄表伟 写道 我也是一直在做Web应用,但是我的做法可以说极土,只用了jsp和java bean。没有用到任何的taglib,也没有用过任何现有的流行的框架。但是我想发起一个讨论,就是实现一些非常常见的Web应用,不同的方式,各自的代码是怎么样的,各位了解的人都把自己的实现方式贴出来,大家“比划比划”
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> 2、服务项目列表 假设一家公司提供一系列的服务,这些服务被分为N个大类,每个大类又包含m个小类。我们需要把这个列表显示出来。大致的表格如下: <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> 就先出这样个题吧,其他的典型应用,等我想到了再写出来。 感谢邀请。 我努力回答你的题目。不要见笑。因为我不太明白你的HTML代码里面的规则和规律。我试着用fastm解决这个问题。 第一个问题,没有看出来具体的规律和规则。试写如下: Fast Template is like. <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> java code is like. 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););; 第二个问题,大概看出来了规律和规则。应该是每4个服务换一次行。试写如下: fastm Template <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> java code is like 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););; |
|
返回顶楼 | |
发表时间:2004-07-16
to:buaawhl
你没有理解我的意思,第一个题,关键在于rowspan="n",这个n要等于该学生的选修科目数。 第二个题,关键在于子服务的数目不一定能被4整除,剩下的空位,要用&nbsp;补足。 更加根本的问题在于,你的模板,有没有对逻辑判断的支持,支持程度如何? |
|
返回顶楼 | |
发表时间:2004-07-16
用velocity试写如下,代码已经过测试.
###### 测试数据 #################################### #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> ###### 测试数据 #################################### #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> |
|
返回顶楼 | |
发表时间:2004-07-16
谢谢,这样非常好!
|
|
返回顶楼 | |
发表时间:2004-07-16
引用 你没有理解我的意思,第一个题,关键在于rowspan="n",这个n要等于该学生的选修科目数。
<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> 把4改成{number}就可以了,由後端代码返回number.第二个,算是针对html tag的逻辑,让buaawhl试试 |
|
返回顶楼 | |
发表时间:2004-07-16
这就更不对了,如果在数据部分,还要考虑到显示的逻辑,那不是乱了?
|
|
返回顶楼 | |
发表时间:2004-07-16
我用Velocity写的,代码如下。
第一题: <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> 第二题: #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 分析:因为HTML中固有的"rowspan"和"colspan"非结构化的原因,有时候不得不用一些较复杂逻辑语句来控制页面显示,减少了页面的可读性 |
|
返回顶楼 | |
发表时间:2004-07-16
针对庄大大的第二题稍微偷懒了一点.不过我觉得好象挺麻烦的
/** * make the ValueSet DOM * * @return IValueSet */ public IValueSet makeValueSet(); { IValueSet valueSet = new ValueSet();; List date = new ArrayList();; date.add("A1");; date.add("A2");; date.add("A3");; date.add("A4");; date.add("A5");; date.add("A6");; ServiceCategories categories = new ServiceCategories("A");; ServiceDate serviceDate = new ServiceDate(categories, date);; IValueSet serviceCategory = new ValueSet();; //String s = serviceDate.getCategory();.toString();; serviceCategory.setVariable("{service_category}","A");; List categoryDate = (ArrayList);serviceDate.getDate();; double nDate = categoryDate.size();; int nLoop = (int); Math.ceil(nDate / 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}", categoryDate.get(count););; tds.add(td);; count++; if (count == (categoryDate.size(););); { break; } } tr.setDynamicValueSets("td", tds);; trs.add(tr);; } serviceCategory.setDynamicValueSets("tr", trs);; List serviceCategories = new ArrayList();; serviceCategories.add(serviceCategory);; //IValueSet valueSet = new ValueSet();; valueSet.setDynamicValueSets("service_category", serviceCategories);; return valueSet;//valueSet; } 已经试过,可以运行 出来效果 <table border=1> <tr> <td colspan="4">A</td> </tr> <tr> <td>A1</td> <td>A2</td> <td>A3</td> <td>A4</td> </tr> <tr> <td>A5</td> <td>A6</td> </tr> 后面两个空的没有补,不过也是可以实现的,因为这个东东本来就可以处理逻辑。 引用 这就更不对了,如果在数据部分,还要考虑到显示的逻辑,那不是乱了?
好像是有点,不过不知是不是我没有真正理解,也许可以简单点。还有这东东本来在负责view部份,velocity,taglib也会处理显示逻辑.到时我们的project就有一个view package |
|
返回顶楼 | |