代码贴士
select标签用来实现下拉列表框,emptyOption属性取值为true,表示第一个下拉列表项为空白,取值为false或省略该属性,则不生成空白列表项;list属性则指定用来生成下拉列表项的数据源,若该数据源是一个Map对象,则默认的会将该Map对象的key值作为列表项的值(在程序中使用),将value值作为列表项的标签(显示给用户);name 属性指定了与表单的处理类中对应的setXXX()与getXXX()方法。
fielderror标签用来输出通过Action类的addFieldError()方法保存的信息,param标签则指定要输出保存的哪条信息。如果要输出保存的全部信息,可使用<s2:fielderror/>。“%{}”用来计算表达式,被计算的表达式写在“{}”中,如<s2:property value="%{100+1}"/>,将输出“101”,所以,代码中为param标签的value属性指定的是字符串值typeError,若写为<s2:param value="typeError"/>,则此时的typeError相当于一个页面变量。例如:<s2:set name="myError" value="%{'typeError'}"/><s2:param value="myError"/>与<s2:param value="%{'typeError'}"/>实现的功能是相同的。
3.在InfoAction类中实现处理信息发布请求的方法
例程42中指定表单所触发的请求为info_Add.action,根据例程34中cityinfo.xml文件的配置,表单将被提交到InfoAction类的Add()方法中进行处理,在这之前需要进行表单验证。下面先来创建验证表单的方法。
创建验证表单的validateAdd()方法。
在该方法中,首先获取表单数据,然后再依次进行验证。首先验证用户输入是否为空,在都不为空的情况下,再来验证输入的联系电话和E-mail格式是否正确。在验证过程中,若验证失败,则调用addFieldError()方法保存提示信息。validateAdd()方法的代码如下:
例程43 代码位置:光盘\TM\01\src\com\yxq\action\InfoAction.java
public void validateAdd(){
int type=infoSingle.getInfoType(); //获取信息类别表单数据
String title=infoSingle.getInfoTitle(); //获取信息标题表单数据
String content=infoSingle.getInfoContent(); //获取信息内容表单数据
String phone=infoSingle.getInfoPhone(); //获取联系电话表单数据
String linkman=infoSingle.getInfoLinkman(); //获取联系人表单数据
String email=infoSingle.getInfoEmail(); //获取E-mail地址表单数据
boolean mark=true;
if(type<=0){
mark=false;
addFieldError("typeError",getText("city.info.no.infoType")); //getText(String key)方法用来获取properties
资源文件中key指定的键值存储的内容
}
……//省略了其他表单数据的验证
if(mark){ //若表单数据都不为空
……//省略了验证联系电话和E-mail格式的代码
}
}
创建处理请求的Add()方法。
表单验证成功后,调用Add()方法处理请求。在该方法中先获取表单数据,然后生成SQL语句,最后调用OpDB类对象的OpUpdate()方法向数据表中插入记录,完成信息发布。Add()方法的代码如下:
例程44 代码位置:光盘\TM\01\src\com\yxq\action\InfoAction.java
public String Add(){
String addType=request.getParameter("addType"); //获取访问该方法的请求要进行的操作
if(addType==null||addType.equals("")){
request.setAttribute("mainPage","/pages/add/addInfo.jsp");
addType="linkTo";
}
if(addType.equals("add")){ //执行信息发布操作
request.setAttribute("mainPage","/pages/error.jsp");
OpDB myOp=new OpDB();
Integer type=Integer.valueOf(infoSingle.getInfoType()); //获取信息类别
String title=infoSingle.getInfoTitle(); //获取信息标题
String content=DoString.HTMLChange(infoSingle.getInfoContent()); //转换信息内容中的HTML字符
String phone=infoSingle.getInfoPhone(); //获取联系电话
phone = phone.replaceAll(",","●"); //替换“,”符号
String linkman=infoSingle.getInfoLinkman(); //获取联系人
String email=infoSingle.getInfoEmail(); //获取E-mail地址
String date=DoString.dateTimeChange(new java.util.Date()); //获取当前时间并转换为字符串格式
String state="0"; //设置已审核状态为0
String payfor="0"; //设置已付费状态为0
Object[] params={type,title,content,linkman,phone,email,date,state,payfor};
String sql="insert into tb_info values(?,?,?,?,?,?,?,?,?)";
int i=myOp.OpUpdate(sql,params); //调用业务对象的OpUpdate()方法向数据表中插入记录
if(i<=0) //操作失败
addFieldError("addE",getText("city.info.add.E")); //保存失败提示信息
else { //操作成功
sql="select * from tb_info where info_date=?"; //生成查询刚刚发布信息的SQL语句
Object[] params1={date};
int infoNum=myOp.OpSingleShow(sql, params1).getId(); //获取刚刚发布信息的ID值
addFieldError("addS",getText("city.info.add.S")+infoNum); //保存成功提示信息
}
}
return SUCCESS;
}
4.配置cityinfo.xml文件
对信息发布请求的配置,与列表显示某类别中所有信息请求的配置相同,可参看例程34。
1.8.4 单元测试
在进行软件开发的过程中,避免不了出现错误或未发现的Bug,这些错误和Bug发现得越早,对后面的开发和维护越有利,因此测试在软件开发的过程中显得越来越重要。软件测试通常可分为单元测试、综合测试和用户测试,其中单元测试是程序员在开发过程中最为常用的。
1.单元测试概述
具体来说,单元就是指一个可独立完成某个操作的程序元素,通常为方法或过程,因此所谓单元测试,就是针对这个方法或过程进行的测试。但通常情况下,很少存在不与其他方法发生调用与被调用关系的方法,所以也可将对一组用来完成某个操作的方法或过程进行的测试称为单元测试。
对单元的理解可归纳为以下几点:
不可再分的程序模块。
该模块实现了一个具体的功能。
实现了某一功能的模块,与程序中其他模块不发生关系。
对于面向过程的语言来说,如C语言,进行的单元测试一般针对函数或过程,而像Java这种面向对象的语言,单元测试通常是针对类。
对单元测试的理解可归纳为以下几点:
它是一种验证行为。
程序中的每一项功能都可以通过单元测试来验证其正确性。这为以后的开发提供支持,就算是开发后期,也可以轻松地增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西,而且为代码的重构提供了保障。这样,开发员可以更自由地对程序进行改进。
它是一种设计行为。
编写单元测试将使开发员从调用者的角度观察、思考。特别是先写测试,迫使开发人员把程序设计成易于调用和可测试的。
它是一种编写文档的行为。
单元测试是一种无价的文档,它是展示类或函数如何使用的最佳文档。这份文档是可编译、可运行的,并且永远保持与代码同步。
2.单元测试带来的好处
对于开发人员来说,进行单元测试可以大大减少程序的调试时间及程序中的Bug。
对于整个项目来说,减少了调试时间,缩短了项目开发周期。对项目中的模块进行单元测试后,保证项目最后交付给用户进行测试时有可靠依据。
对于测试人员来说,减少了反馈的问题。
最主要的是,为项目的后期维护带来了很大的方便,并可减少后期维护的费用。
3.JUnit单元测试工具的介绍与使用
JUnit是程序单元测试的框架,专门用于测试Java开发的程序。同类产品还包括NUnit(.Net)、CPPUnit(C++),都属于xUnit中的成员。目前JUnit的最新版本是JUnit 4.4。在Eclipse开发工具中已经集成了JUnit的多个版本,本节将介绍如何在Eclipse中使用JUnit进行单元测试。在介绍JUnit的使用之前,先来看一下测试成功与失败后的运行结果,如图1.43和图1.44所示。