论坛首页 Java企业应用论坛

代码擂台,特别有请buaawhl

浏览 71450 次
该帖已经被评为精华帖
作者 正文
   发表时间: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>


就先出这样个题吧,其他的典型应用,等我想到了再写出来。
   发表时间: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、学生成绩单
假设一个班级的学生,每人选修了数量不等的课程,在学期结束之后,需要打印一份班级的成绩单。大致的表格是这样的:

<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););;
0 请登录后投票
   发表时间:2004-07-16  
to:buaawhl

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

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

更加根本的问题在于,你的模板,有没有对逻辑判断的支持,支持程度如何?
0 请登录后投票
   发表时间: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>&amp;</td>		
			#end		
		#end  
  </tr>  
	#end  
#end
</table>
0 请登录后投票
   发表时间:2004-07-16  
谢谢,这样非常好!
0 请登录后投票
   发表时间: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试试
0 请登录后投票
   发表时间:2004-07-16  
这就更不对了,如果在数据部分,还要考虑到显示的逻辑,那不是乱了?
0 请登录后投票
   发表时间: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"非结构化的原因,有时候不得不用一些较复杂逻辑语句来控制页面显示,减少了页面的可读性
0 请登录后投票
   发表时间: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
0 请登录后投票
论坛首页 Java企业应用版

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