5. 系统配置文件
系统参数如数据库连接等在sysConfi.xml文件中配置,存放在“WEB-INF/xml”文件夹下,请参见该文件。
开发规范和公用方法
关于java的开发规范参见《Java 编程规范.doc》,这里仅给出用struts开发中一些的规范:
1. java文件存放按业务逻辑划分,并用模块作为包名的形式,如:telecombi.logic.sysman.security
包名都为小写形式
所有的Action和ActionForm都存放在同一包下,便于管理,不要跨包调用
2. 所有ActionForm中的属性均为“首单词小写+第二个单词首字母大写+…”的形式,如:staffId、staffName,不允许使用“_”为单词连接符
3. 需要验证的页面,均需要客户端和服务端两次验证(即对jsp中的Form进行javascript验证和Action中的excute方法中进行验证),不能只采用其中一种方法,防止客户绕过js直接提交;
在验证登录提交的form时,必须使用staticJavascript="false",否则就会把javascript写到页面里,如:
<html:javascript formName="logonForm"
dynamicJavascript="true"
staticJavascript="false"/>
<script language="Javascript1.1" src="staticJavascript.jsp"></script>
验证的formName必须和validation.xml中的Form的名字对应起来,否则验证无效
4. ActionForm是代表html中的Form的,其中的变量需要和Form中的属性对应起来,如:要在jsp中使用<form:text property="userName"/>,则使用的ActionForm中就必须有userName这个变量
5. 对于Action中的逻辑,如果处理方法在一个以上,需要另外新建一个处理类,负责对Action中的逻辑集中处理,命名为xxxDeal,如:LoginDeal;
Action通过调用该处理类的方法,实现业务逻辑处理
6. 对数据库的操作使用DBManager这个类,对其中的一些方法,具体介绍如下:
n 查询结果对象化的Select操作,使用Select(String sql,String className)方法
StringBuffer sql = new StringBuffer(
"select staff_id staffId from ts_m_staff "

.append("where staff_id='"

.append(uid).append("'"

;
try {
/**
* User是一个用户对象类,其中有staffId这个属性,以及对应的get/set方法,通过
* DBManager的Select方法获得一个User的ArrayList集合
*/
ArrayList rs = DBManager.Select(sql.toString(), User.class.getName());
/**
* 如果确定返回的只有一个对象,则可以使用
*
*/
User user=(User)rs.get(0);
}
catch (Exception ex) {
throw new ServletException(ex.getMessage());
}
取出来的数据可以存放在session或page等里,供jsp页面调用,方法为session.setAttribute(“user”,user1)
…
n Insert或Update等操作
使用DBManager里面的executeSql(String sql)方法,如果是批量处理,使用executeBatchSql(String[] sqls)方法,返回成功标志为Constants.OPERATE_SUCCESS
失败标志为Constants.OPERATE_FAILED
暂无其它信息返回
n ResultSet对象向Hashtable集合对象的转化,使用select(String sql)方法:
除了可以使用DBManager的Select把查询结果转为对象以外,还可以使用以前的直接使用ResultSet对象的方式,不过这里返回的数据集对象为Hashtable;
Hashtable存放的数据结构为:
columnName1 ? ArrayList1(该字段的结果集)
columnName2 ? ArrayList2(该字段的结果集)
…
系统中使用该方法的比较多的是用在生成下拉框数据,从select方法返回的Hashtable取到字段值,并生成LabelValueBean,具体方法如下:
/**公用函数 Hashtable 转换成 ArrayList (LabelValueBean)*/
private static ArrayList hashToLVB(Hashtable ht, String id, String name,boolean hasBlank) {
if (ht!=null){
ArrayList al = new ArrayList();
ArrayList alId = (ArrayList) ht.get(id.toUpperCase());
ArrayList alName = (ArrayList) ht.get(name.toUpperCase());
int iLen = alId.size();
if (hasBlank)
al.add(new LabelValueBean("未知", "-1"

);
for (int i = 0; i < iLen; i++) {
al.add(new LabelValueBean( (String) alName.get(i),
(String) alId.get(i)));
}
return al;
}
else{
return null;
}
}
n AutoSetForm(String sql, Object frm)方法介绍:
a) 该方法可以返回一个查询数据库后已对其中的属性赋值的对象,使用方法如下:
User user=DBManager. AutoSetForm(sql,new User());
sql为查询语句
b) 该方法还可以对页面操作后的Form进行赋值,比如在页面上提交一个对某条记录进行编辑的操作,当Action得到该条记录的Id号并查询数据库成功后,需要把各个详细信息set到ActionForm的属性变量中去,这个时候就可以使用该方法,方法如下:
form= DBManager. AutoSetForm(sql,form);
form为Action的excute方法中传入的ActionForm
7. 调用存储过程
使用DBManager中的execProc(String procName,ArrayList procPrts)方法
procName为存储过程名,procPrts是该存储过程的入口参数集,返回的是ProcOuts的对象,其中有Result和ExceptionInfo两个属性,表示返回的处理标记和异常信息(如果有的话)
8. 数据操作返回信息的处理
在对数据操作完成后,需要返回操作是否成功等信息,具体步骤如下:
n 使用属性文件中的“messages.comm”这个key,可以对该key添加具体返回信息
n 程序中使用“ActionMessages”这个对象,java程序如下:
ActionMessages ams = new ActionMessages();
…
//执行结果
ProcOuts pResult=null;
//是否调用成功
if (pResult.getResult() == -1) {
ams.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("message.common",
pResult.getExceptionInfo()));
}
if (!ams.isEmpty()) {
saveMessages(request, ams);
}
Jsp中调用方法如下:
<html:messages id="msg" message="true">
<font color="red"><bean:write name="msg"/></font>
</html:messages>