2004年09月30日

1、在jsp页中加入一条语句:
<%@ page contentType=”text/html;charset=gb2312″ %>中文显示就正常了。

2、对于从网页中的文本框通过String parameter = request.getParameter(“parameter”);方式获得的字符串,均是8859_1的编码,
如果想把它显示在网页上就必须得用parameter = new String(parameter.getBytes(“8859_1”),”gb2312”)进行转换,windows和linux这两种系统都是一样的。
有一个简单方法,就是在 getParameter() 方法获取参数之前,使用request.setCharacterEncoding(“GB2312″);,将提交的信息转化为 GB2312 编码。


3、但是对于将数据写入数据库的问题,采取的方式就不同了:
windows下,必须要采用该字符串转换再插入数据库,而linux下就不需要,而是直接把8859_1编码的字符插入。
如果从数据库中读出的数据,对于windows因为在插入时已经做了转换,所以读出时已经是gb2312的,当把它显示在网页上时,不需要做编码转换,而 linux上的mysql中的数据是8859_1的所以要做编码的转换。

4、 如果你给某个字符串变量赋予一个中文字符串的值,那么在你取出他时,在网页上的显示是不需要做字符转换的,
但是如果你要在linux下做字符的比较,则还需要把字符做parameter = new String(parameter.getBytes(“gb2312”),”8859_1”)的转换。

2004年09月29日

JSP页面中的元素

一,释:三种注释,<!–  –>会打印到客户端,剩下的两种被JSP引擎忽略。

二,模板元素:指JSP中的静态HTLM或者XML内容,它影响页面的结构和美观程度,但那是美工的事,与程序员无关。

三,脚本元素:包括声明(Declaration,表达式(Expression)和Scriptlets,除去一些微小的差异外,Scriptlets完全可以取代前两种的功能。

四,指令元素:

JSP指令是JSPJSP包容器发送的消息。他们用来设置全局值,如类声明,要实现的方法,输出内容类型等,并不向客户口产生任何输出。它只影响本JSP文件。

1,  age指令:用来定义和操作许多重要的页面的属性,这些属性与JSP包容器进行通信。在JSP的任何地方,以任何顺序,一个页面可以包含任意数量的page指令。但除了import指令外,其它的指令只能出现一次。几个重要的page指令:

<% @  page import =”java.io.*,java.util.*”%>//导入包

<% @  buffer=”  ”%>//定义对客户输出流的缓冲模型。

<% @  info=”  ”%>//可以使用servlet.getServletInfo()得到该字符串

<% @  isErrorPage=”  ”%>

<% @  errorPage=”  ”%>

<% @  isThreadSafe=” ” %>//JSP文件是否能多线程使用

2,  include指令:ASP中用的很多了吧,后面再介绍。

3,  taglib指令:详见作者以前文章《Struts中的自定义标记》。

五,动作元素

JSP动作元素是使用XML语法写成的,它是在请求处理阶段起作用的,它影响JSP运行时的行为和发送给客户的应答。它们应当由所有的包容器提供,而不管它们的实现如何。

从效果上来说,一个标准动作是能够嵌入到JSP页面之中的一个标记。在页面被编译为servlet期间,当包容器遇到这个标记时,就用相应于请求的预定义的任务的JAVA代码来代替它。

1<jsp:param>:为其他标签提供附加信息。

  <jsp:param name=”paramName” value=”paramValue”/>

  它与<jsp:include>,<jsp:forward>,<jsp:plugin>一起使用。

2<jsp:include>

   如果包含是静态文件,那么仅仅是把内容加到JSP文件中去,这个文件不会被JSP编译器执行,如果是动态文件,将会被JSP编译器材执行。

  理论上<% @  page include=””%><jsp:include>有所不同,我把它叫做自动刷新,但实际上使用较高版本的tomcat时,他们的功能是一样的。

下面是这一标记的示例代码:

<%@ page contentType=”text/html; charset=gb2312″ language=”java” %>

<html>

<body>

<%@ include file=”static.html” %>

<%//只是把文件包含进来%>

<a href=”two.jsp”>goto two–></a><br>

this examples show include works

<jsp:include page=”two.jsp” flush=”true”>

  <jsp:param name=”a1″ value=”<%=request.getParameter(“name”)%>” />

  <jsp:param name=”a2″ value=”<%=request.getParameter(“password”)%>” />

</jsp:include>

</body>

</html>

  ?this is static.html>

<html>

<body>

<form method=post action=”jsp_include.jsp”>

<table>

<tr>

<td>please input your name:</td></tr>

<tr><td>

<input type=text name=name>

</td></tr>

<tr><td>input you password:</td>

<td>

<input type=text name=password>

</td>

</tr>

<tr>

<td>

<input type=submit value=login>

</td>

</tr>

</table>

</body>

</html>

?this is a two.jsp–>

<%@ page contentType=”text/html; charset=gb2312″ language=”java” %>

举例说明include的工作原理:

<br>

this is a1=<%=request.getParameter(“a1″)%>

<br>

this is a2=<%=request.getParameter(“a2″)%>

<br>

<% out.println(“hello from two.jsp”);%>

3,<jsp:forward> 是允许将请求转发到另一个JSPServlet,或者静态资源文件。当要根据不同的请求,转换到不同的视图时,这个动作特别有用。但请求被转向到的资源必须位于同JSP发送请求相同的上下文环境中。

<jsp:forward page=”url”>

<jsp:param name=”paramName” value=”paramValue”/>

</jsp:forward>

4,<jsp:useBean> 它用来实例化JavaBean,或者定位一个已经存在的Bean实例,并且把它赋给一个变量名(或者id)。并给定一个具体的范围来确定对象的生命周期。

<jsp:useBean id=”myclassname” scope=”page” class=”Class1” type=”Class2”/ >

等价于:Class2 myclassname=new Class1();

page:表示对象与到该页面的特定的请求相关联。

Request:表示对象与到该页面的特定的客户请求相联系。如果请求被使用<jsp:forward>标准动作发送到别的jsp,或者使用<jsp:include>动作包含了另外的JSP,则在所涉及的JSP中,该对象是有效的。

Session:在当前会话中,在由同一个客户发送的任何的请求中,该对象都是有效的。

Application:在同一个web应用程序中,在任何的JSP页面中,该对象都是有效的。

5,<jsp:setProperty> <jsp:getProperty>

  useBean一起协作,用来设置Bean的简单属性和索引属性,因为它的使用太频繁了,那我就少说点吧,大家在具体代码中学习。

<jsp:serproperty name=”beanname” BopertyDetails />

A, property=*;

B,property=”propertyName” param=”parameterName”

  Bean中的属性名与Request中参数名不同时使用这个方法。

C,property=”propertyName”

  Bean中的属性与Request中的参数名必须相同。

D,property=”propertyName” value=”propertyValue”

 

package com.terac.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DBTest {
public static void main(String[] args) {
try {
String user = “user”;
String password = “password”;
String driver = “COM.ibm.db2.jdbc.net.DB2Driver”;
//”oracle.jdbc.driver.OracleDriver”;
//”com.mysql.jdbc.Driver”;
//”org.postgresql.Driver”;
String url = “jdbc:db2://localhost/a”;
//”jdbc:oracle:thin:@localhost:1521:a”;
//”jdbc:mysql://localhost/a”;
//”jdbc:postgresql://localhost:5740/a”;
String sql = “SELECT current timestamp FROM sysibm.sysdummy1″;
//”SELECT sysdate FROM dual”;
//”SELECT now()”;
//”SELECT current_timestamp”;
Class.forName(driver).newInstance();
Connection c = DriverManager.getConnection(url, user, password);
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

2004年09月17日

感谢yuxuan兄,帮你贴上来了。呵呵
Oracle Fail Safe 简要安装步骤
    硬件环境:两台 4600 r 服务器(双网卡/36G/1*700Hz/1G)
一台 HP LH4 服务器(做主域控制器)
一台 SureFibre 200 R 光纤通道磁盘柜;
    软件环境:操作系统:Windows 2000 Advanced Server
数据库:Oracle 9.0.1
高可用软件:MSCS、Oracle Fail Safe
    说明:本文档是建立在 MSCS 已经正确安装和配置基础上的(关于 MSCS 的安装请参照另外提供的文档)简要安装步骤;详细的安装文档请参考另外提供的 PDF 文档;
    Oracle Fail Safe 是架构在 Microsoft Cluster Server(MSCS)上的一个 Oracle 产品,为提供 Oracle 的一些产品(数据库、Oracle Application Server 等)提供高可用性,因此在安装此产品之前,必须正确安装和配置 MSCS。
    安装步骤:
1、  在节点一上安装 Oracle 9.0.1,选择自定义安装,安装过程中选择部创建数据库;
2、  重新启动节点一;
3、  在节点二上安装 Oracle 9.0.1,选择自定义安装,安装过程中选择部创建数据库;
4、  重新启动节点二;
5、  在节点一上创建要添加到集群中的数据库,新数据库不要配置 Net8,即不要配置 listener.ora 和 tnsnames.ora 文件。注意 Control 文件、redo log files 和 data files 必须创建在磁盘柜的共享分区上;
6、  在节点一和节点二的注册表中相应位置添加第五步所创建的数据库的 ORACLE_SID;
7、  在节点一上安装 FailSafe 3.2;
8、  重新启动节点一;
9、  在节点二上安装 FailSafe 3.2;
10、  重新启动节点二;
11、  在两台机器上修改文件c:\winnt\system32\drivers\etc\hosts 如下:
192.168.34.1     clunode1  (节点1)
192.168.34.2     clunode2  (节点2)
192.168.34.122   mycluster  (MSCS Cluster 的别名,也就是虚拟 IP的别名)
192.168.34.100   client1     (客户端信息)
注意节点上listener 使用的 IP 地址应该是虚拟 IP;
12、  打开 Oracle Fail Safe Manager
Start -> Programs -> OraHome91> -> Oracle Fail Safe Manager
打开后出现 Add Cluster to Tree 对话框,在该对话框里输入 CLUSTER 名称,会
提示输入在域里有管理权限的用户名和密码;输入后会出现 Verify Cluster 对话
框,对该集群各项资源进行有效性验证;
13、  在每台节点机上检查是否有服务 OracleMSCSServices,并启动该服务;
14、  在每台节点机上启动集群管理器(启动 -> 程序 -> 管理工具 -> 集群管理器),在 Cluster Group 检查是否有 Oracle Services for MSCS 这一项;并检查 Resource Types 中是否有 Oracle Database 和 Oracle TNS Listener。
15、  在 Oracle Fail Safe Manager 中的Groups 菜单里选择 Create;打开 Create Group Wizard 后可以设置 failover 和 failback 策略,并自动打开 Add Resource to Group Wizard 可以向组添加virtual address(选择Resources,然后Add to Group)。
16、  在 Troubleshooting 菜单上选择 Verify Standalone Database 验证 Oracle数据库以及 Oracle Net 配置,该命令确认 Oracle Fail Safe 可以访问数据库,并且 standlone 数据库位于共享分区上;
17、  在 Resources 菜单上选择 Add to Group,然后选择 Oracle Database打开 Add Resource to Group Wizard,该向导用来将 single-instance Oracle database server 配置为基于 MSCS 的高可用性数据库服务器;  
  
其他说明:
在安装完 fail safe 后,Windows 2000 中的群集管理器中 群集配置 -〉 资源类型 -〉 下会出现两个资源类型:Oracle Database 和 Oracle TNS Listener,两者使用的资源 DLL 都是 FsResOdbs.dll 。
在 FailSafe 里添加组 grptest 并将数据库群集添加后,在群集管理器里也增加了该组,组包含的内容有:IP Address 192.168.34.71、Network Name scsi817、Disk R:、OracleOraHome81TNSListenerFslscsi817 和 LEGEND(数据库实例名)
其中:(C:\winnt\system\drivers\etc 的内容如下:)
192.168.34.45    t310
192.168.34.46    t350
192.168.34.70    scsiclu  (群集的名称)
192.168.34.71    scsi817  (Oracle 集群使用的 IP 和网络名称)
=================================================================

双机容错方案

目前许多建立和应用信息系统的企业,在系统应用不断改进的同时,开始注意提高企业信息系统的可用性和可靠性。通过双机容错系统为企业提供系统高可用性保障是目前企业普遍采用的方法。医疗机构工作性质的特殊性要求其信息系统7天×24小时不间断运行,采用双机容错方案为系统提供了高可用解决方案。本文将对医疗信息系统的双机容错环境下Oracle数据库应用做详细介绍。  
系统配置  
  该系统的硬件配置如下:
  主数据库服务器: 富士通Primergy MS-610服务器(双Xeon 700MHz CPU,1GB内存)。  
  数据库备份服务器: 富士通Team Server C870ie GP5C875(双PentiumⅢ 700MHz CPU,1GB内存)。  
  容错软件: 天地公司的SLHA 3.0软件包。  
  磁盘阵列: IQstore R1500(带2个SCSI接口)。  
  线路连接: 2台服务器用RS-232串口线和RJ-45网络线相连(如图1所示)。
  软件配置如下。  
  操作系统: Windows NT Server 4.0  
  服务器软件配置: Windows NT 4.0 Service Pack 5、Internet Explorer 5.0、Microsoft Data Access Component 2.0,Oracle数据库为7.3.3企业版。  
  双机容错的实现  
  1. 操作系统的安装  
  我们用A机表示数据库服务器,用B机表示备份数据库服务器。首先在物理上将所需硬件设备连接好,分别在各自服务器上安装Windows NT Server 4.0操作系统及补丁包等。然后,进入磁盘管理器,将磁盘阵列划分为2个逻辑盘D和E,此时2台服务器都可访问磁盘阵列。  
  2.Oracle数据库的安装  
  先关闭B机,在A机上安装Oracle数据库,安装路径默认为D盘,归档日志放在E盘。安装完毕后,将Oracle的3个服务(此处SID为ORCL,所以3个服务就是OracleServiceORCL、OracleStartORCL和OracleTNSlistener)的启动方式改为手动并将此3个服务停止。注意: 改为手动的目的是为了让这3个服务由双机容错软件来启动,而不是由操作系统启动。  
  然后,关闭A机,启动B机,格式化D盘,将刚刚由A机建立在磁盘阵列上的Oracle目录也格式化掉; 在B机上安装Oracle数据库,安装路径默认为D盘,安装完毕,同样将Oracle的3个服务的启动方式改为手动并停止3个服务。  
  双机上安装Oracle的实质就是将Oracle系统分别装在2台服务器上,而数据只存储在磁盘阵列上。
  3.双机容错软件的安装及双机容错环境的建立  
  双机容错软件的安装非常简单,只需启动A机和B机,在2台服务器上分别安装该软件即可。建立双机容错环境是将磁盘阵列上的D盘和E盘以及Oracle 的3个服务交由双机容错软件控制,并由双机容错软件进行切换。
  在双机容错软件SLHA的”Configuration”选项中将数据库服务器设为Active状态,即平时正常工作状态时,此时数据库服务器工作,备份服务器等待。当A机Active时,只有A机可以访问磁盘阵列,B机不能访问磁盘阵列。此时,Oracle数据库服务器实际上是A机,A机的IP地址就是Active IP Address,同时A机的主机名为Active Host Name; 当A机因故不能工作时,A机的状态会被”心跳线”侦测到,这时B机开始切换到Active状态,接管磁盘阵列,此时的Oracle数据库服务器改为B机,B机的IP地址就是Active IP Address,同时B机的主机名为Active Host Name。上述操作均由系统自动完成,实践证明切换所需的时间很快,对客户端的影响很小。
  需要注意的问题  
  1.当在A机安装完Oracle数据库后在B机安装Oracle数据库时,一定要先将磁盘阵列D盘格式化,而不是只将D盘中已由A机安装的Oracle数据库删除,否则可能会出现意想不到的错误,例如Oracle侦听服务失败等;  
  2.最终安装好Oracle数据库后,要对D:\Oracle\Orant\network\Admin\ Listener.ora文件进行修改,其中Server名称一定要改为Active host name Alias,如不进行修改将使客户端的Oracle数据库用户无法连接到Oracle数据库中。  
  3.在Hosts文件中增加一条记录,使Active IP Address和Active Host Name相互对应,这样系统就会自动起到解析作用。Hosts文件位于c:\Winnt\ system32\drivers\etc目录下。  
  4.要注意不到万不得已,不要强行切换,避免产生数据错误。如必须对双机进行切换,可先进入Svrmgr Oracle服务器控制台,用Shutdown命令关闭Oracle数据库,再进行切换。
  双机容错的原理  
  图2为系统双机容错的示意图,从图2可以看出2台服务器共享一个外部存储设备,通过心跳检测的方法监听对方的工作状态,当一台服务器因为某种原因不能提供相应服务时,另一台服务器将启动相应服务功能,使主服务器提供的应用继续运行。
   
  图2中的2台服务器安装相同的操作系统(硬件配置不必相同),如Windows NT Server 4.0,每台服务器安装2块网卡。服务器的一块网卡连接交换机,与局域网相连(即图2中Public Net); 另一块网卡和对方服务器的一块网卡相连,构成Private Net; 同时2台服务器由串口线相连,2台服务器间相连的串口线和服务器之间的RJ-45网线共同构成2台服务器之间的”心跳线”。2台服务器就是通过心跳线来互相监听对方工作状态的。注意: 同时采用网线和串口线组成”心跳线”的目的是为了确保”心跳线”的冗余。图2中的Public Drives(即双机共享磁盘阵列)是2台服务器都可以访问的磁盘,它实际上是一台磁盘阵列柜,由六块SCSI硬盘组成。磁盘阵列通过SCSI电缆分别连向2台服务器。2台服务器共用一个Active IP地址和Active Host Name。当某台服务器Active(即激活)时,Active IP Address和Active Host Name就指向那台服务器。  
  双机环境下的Oracle数据库机理  
  Oracle数据库安装在磁盘阵列上(即图2中Public Drives),2台服务器都可以访问它,但不能同时访问。Oracle Server for NT主要提供3个服务:OracleServiceSID、OracleStartSID和OracleTNSlistener。在数据库服务器正常工作时,由数据库服务器控制磁盘阵列柜,此时只有该服务器可以访问磁盘阵列,该服务器上的Oracle服务处于启动(Active)状态,此时该服务器就扮演图2中Active Server的角色,备份服务器处于等待(Standby)状态,即图2中Backup Server。  
  当数据库服务器发生故障不能工作时,双机容错系统会检测到数据库服务器的状态,从而使备份服务器自动激活,接管磁盘阵列并自动启动Oracle的3个服务,而对于客户端来说,只经历一个短暂的服务器重启过程,访问的数据仍是磁盘阵列中的数据。  
  注意: 是双机容错软件而不是操作系统来控制Oracle 的启动和停止,即由双机容错软件来控制这3个Oracle服务的启动和停止,实现Oracle数据库在双机之间的切换。

一、注释
程序中的注释能够帮助理解程序。但是也不能太多,太多同样会影响程序的可读性。要遵循简练,准确,易理解的原则。

1、文件头:文件的头部应该有个对本文件的详细描述。内容包括版权,版本号,生成日期,作者,内容,功能,函数功能,与其他文件的关系,修改日志等。尤其是每次修改,都应该写入修改日志。

下面是一个常用的模版
/*************************************************
  Copyright (C), 2000-2004, ******
  File name:      // 文件名
  Author:       Version:        Date: // 作者、版本及完成日期
  Description:    // 用于详细说明此程序文件完成的主要功能,与其他模块
                  // 或函数的接口,输出值、取值范围、含义及参数间的控
                  // 制、顺序、独立或依赖等关系
  Others:         // 其它内容的说明
  Function List:  // 主要函数列表,每条记录应包括函数名及功能简要说明
    1. ….
  History:        // 修改历史记录列表,每条修改记录应包括修改日期、修改
                  // 者及修改内容简述  
    1. Date:
       Author:
       Modification:
    2. …
*************************************************/

2、函数:列出函数的目的,功能、输入输出、返回值、调用关系等。
模版:
/*************************************************
  Function:       // 函数名称
  Description:    // 函数功能、性能等的描述
  Calls:          // 被本函数调用的函数清单
  Called By:      // 调用本函数的函数清单
  Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
  Table Updated:  // 被修改的表(此项仅对于牵扯到数据库操作的程序)
  Input:          // 输入参数说明,包括每个参数的作
                  // 用、取值说明及参数间关系。
  Output:         // 对输出参数的说明。
  Return:         // 函数返回值的说明
  Others:         // 其它说明
*************************************************/

3、文件内部注释:编写代码的同时应该写出注释,修改代码时应该连同修改注释。保证注释与文件的同步。写注释时应该遵循简洁,准确,明了的原则,尽量少使 用缩写,尤其是不常用的缩写。注释的位置应该在被注释语句的上方或右方,位于上方时,应该与上方的语句用空行分开。注释应该与被注释语句相同缩进。

4、命名:变量,数据结构等如果命名不是充分自注释的,必须有注释。说明其作用,取值范围,在哪里使用,适用时的注意事项等。

5、语句:分支语句必须给出注释。包括语句块的功能,输出。程序块结束行右方必须给出注释以表明程序块结束。switch语句由于某种情况在一个case结束后必须进入另一个case语句时,必须加上注释。

6、其他需要注意的事项:应该避免在一行代码或表达式中使用注释;函数,变量,结构等的命名尽量遵循规范,使代码成为自注释的;注释应该是对代码的解释或对意图的说明,帮助理解代码。


二、排版

    正确的排版方式有助于程序的理解,增加可读性。并且在编写代码的过程中,有助于梳理思路。

1、程序块必须采用缩进风格编写,最好是缩进4个空格。最好不用使用“tab”键,不同的编辑器对“tab”的解释方式不同,容易造成混乱。

2、相对独立的程序块之间、变量说明之后必须加空行。

3、较长的语句应该换行。尽量在低优先级的操作符出换行。换行要有必要缩进,并把操作符放在此行最前面。如果是函数的参数,则不允许将某一参数隔断,应该在两个参数之间换行,中间的逗号放在上一行的最后,

4、if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。括号(程序块的分界符)也独占一行,不缩进,其内语句才开始缩进。

5、多个短句不允许放在同一行。

6、在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

三、 标识符命名
1、标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
    说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。
    示例:如下单词的缩写能够被大家基本认可。
    temp      可缩写为  tmp  ;
    flag      可缩写为  flg  ;
    statistic 可缩写为  stat ;
    increment 可缩写为  inc  ;
    message   可缩写为  msg  ;

2、命名中若使用特殊约定或缩写,则要有注释说明。
    说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。

3、自己特有的命名风格,要自始至终保持一致,不可来回变化。
    说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。

4、对于变量命名,禁止取单个字符(如i、j、k…),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。
    说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
    示例:下面所示的局部变量名的定义方法可以借鉴。
    int liv_Width
    其变量名解释如下:
        l      局部变量(Local)  (其它:g    全局变量(Global)…)
        i      数据类型(Interger)
        v      变量(Variable)   (其它:c    常量(Const)…)
        Width  变量含义
这样可以防止局部变量与全局变量重名。

5、命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。
    示例: Add_User不允许,add_user、AddUser、m_AddUser允许。

6、:除非必要,不要用数字或较奇怪的字符来定义标识符。
     示例:如下命名,使人产生疑惑。
    #define _EXAMPLE_0_TEST_
    #define _EXAMPLE_1_TEST_
    void set_sls00( BYTE sls );

    应改为有意义的单词命名
    #define _EXAMPLE_UNIT_TEST_
    #define _EXAMPLE_ASSERT_TEST_
    void set_udt_msg_sls( BYTE sls );

7、在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。
    说明:对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。

8、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

    add / remove       begin / end        create / destroy
    insert / delete    first / last       get / release
    increment / decrement                 put / get
    add / delete       lock / unlock      open / close
    min / max          old / new          start / stop
    next / previous    source / target    show / hide
    send / receive     source / destination
    cut / paste        up / down
    示例:
    int  min_sum;   
    int  max_sum;
    int  add_user( BYTE *user_name );
    int  delete_user( BYTE *user_name );

9、除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义。

2004年09月16日
文档的作用和分类

黎宇 (转载自国家计算机标准和文件模板)
  软件文档(document)也称文件,通常指的是一些记录的数据 和数据媒体,它具有固定不变的形式,可被人和计算机阅读。它和 计算机程序共同构成了能完成特定功能的计算机软件(有人把源 程序也当作文档的一部分)。我们知道,硬件产品和产品资料在整 个生产过程中都是有形可见的,软件生产则有很大不同,文档本 身就是软件产品。没有文档的软件,不成其为软件,更谈不到软件 产品。软件文档的编制(documentation)在软件开发工作中占有突 出的地位和相当的工作量。高效率、高质量地开发、分发、管理和维 护文档对于转让、变更、修正、扩充和使用文档,对于充分发挥软 件产品的效益有着重要意义。 然而,在实际工作中,文档在编制和使用中存在着许多问 题,有待于解决。软件开发人员中较普遍地存在着对编制文档不感 兴趣的现象。从用户方面看,他们又常常抱怨:文档售价太高、文 档不够完整、文档编写得不好、文档已经陈旧或是文档太多,难于 使用等等。究竟应该怎样要求它,文档应该写哪些,说明什么问 题,起什么作用?这里将给出简要的介绍。

图 文档桥梁作用
  文档在软件开发人员、软件管理人员、维护人员、用户以及计 算机之间的多种桥梁作用可从图中看出。软件开发人员在各个阶段中以文档作为前阶段工作成果的体现和后阶段工作的依据,这个作用是显而易见的。软件开发过程中软件开发人员需制定一些工作计划或工作报告,这些计划和报告都要提供给管理人员, 并得到必要的支持。管理人员则可通过这些文档了解软件开发项目安排、进度、资源使用和成果等。软件开发人员需为用户了解软件的使用、操作和维护提供详细的资料,我们称此为用户文档。
  以上三种文档构成了软件文档的主要部分。我们把这三种文档所包括的内容列在图6中。其中列举了十三个文档,这里对它们作一些简要说明:
  · 可行性研究报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供 选择的各种可能实施的方案,说明并论证所选定实施方案的理由。
  · 项目开发计划:为软件项目实施方案制定出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所 需的硬件及软件资源等。项目开发计划应提供给管理部门,并作 为开发阶段评审的参考。
  · 软件需求说明书:也称软件规格说明书,其中对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是用 户与开发人员双方对软件需求取得共同理解基础上达成的协议, 也是实施开发工作的基础。
  · 数据要求说明书:该说明书应给出数据逻辑描述和数据采 集的各项要求,为生成和维护 系统数据文卷作好准备。
  · 概要设计说明书:该说 明书是概要设计阶段的工作 成果,它应说明功能分配、模 块划分、程序的总体结构、输 入输出以及接口设计、运行设 计、数据结构设计和出错处理 设计等,为详细设计奠定基 础。
  · 详细设计说明书:着重 描述每一模块是怎样实现的, 包括实现算法、逻辑流程等。
  ·用户手册:本手册详细 描述软件的功能、性能和用户 界面,使用户了解如何使用该软件。

图 三种文档
  · 操作手册:本手册为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。
  · 测试计划:为做好组装测试和确认测试,需为如何组织测试制定实施计划。计划应包括测试的内容、进度、条件、人员、测试用 例的选取原则、测试结果允许的偏差范围等。
  · 测试分析报告:测试工作完成以后,应提交测试计划执行 情况的说明。对测试结果加以分析,并提出测试的结论意见。
  · 开发进度月报:该月报系软件人员按月向管理部门提交的 项目进展情况报告。报告应包括进度计划与实际执行情况的比较、 阶段成果、遇到的问题和解决的办法以及下个月的打算等。
  · 项目开发总结报告:软件项目开发完成以后,应与项目实 施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本 和投入的人力。此外还需对开发工作作出评价,总结出经验和教训。


  · 哪些需求要被满足,即回答”做什么?”
  · 所开发的软件在什么环境中实现以及所需信息从哪里来, 即回答”从何处?”
  · 某些开发工作的时间如何安排,即回答”何时干?”
  · 某些开发(或维护)工作打算由”谁来干?” · 某些需求是怎么实现的?
  · 为什么要进行那些软件开发或维护修改工作? 上述十三个文档都在一定程度上回答了这六个方面的问题。这可从表中看到。
表 文档所回答的问题

  至此,我们对文档的作用有了进一步的理解。每一个文档的任 务也是明确的,任何一个文档都此是多余的。

为了保证软件质量,写些必要的文档是必要的。尤其是下面几个,在软件实施过程中,是必需应该完成的。在这之前,绝不进入编码阶段。

· 软件需求说明书:也称软件规格说明书,其中对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是用 户与开发人员双方对软件需求取得共同理解基础上达成的协议, 也是实施开发工作的基础。
· 数据要求说明书:该说明书应给出数据逻辑描述和数据采 集的各项要求,为生成和维护 系统数据文卷作好准备。
· 概要设计说明书:该说 明书是概要设计阶段的工作 成果,它应说明功能分配、模 块划分、程序的总体结构、输 入输出以及接口设计、运行设 计、数据结构设计和出错处理 设计等,为详细设计奠定基 础。
· 详细设计说明书:着重 描述每一模块是怎样实现的, 包括实现算法、逻辑流程等。

完成这部分才允许进入编码阶段。而以下内容也必不可少。

· 测试计划:为做好组装测试和确认测试,需为如何组织测试制定实施计划。计划应包括测试的内容、进度、条件、人员、测试用 例的选取原则、测试结果允许的偏差范围等。
· 测试分析报告:测试工作完成以后,应提交测试计划执行 情况的说明。对测试结果加以分析,并提出测试的结论意见。
· 开发进度月报:该月报系软件人员按月向管理部门提交的 项目进展情况报告。报告应包括进度计划与实际执行情况的比较、 阶段成果、遇到的问题和解决的办法以及下个月的打算等。
· 项目开发总结报告:软件项目开发完成以后,应与项目实 施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本 和投入的人力。此外还需对开发工作作出评价,总结出经验和教训。

为了养成一个良好的习惯,决定强迫自己做这些。其他的还有些东西,就,就看着办啦。

 

一、熟悉简单的项目实施规范和编程规范。
1、项目之前的分析文档要齐全。
2、程序编写方面,变量定义,注释方式,缩进等要规范。

二、熟悉一些简单的功能实现。
太长时间没做东西了,很多很简单的东西都不会了,不得不好好复习下了,只靠google作东西很慢滴。

三、做一个完整的项目。
从问题定义、需求分析、系统设计、编码,测试,完整的走一边,注意项目的控制和文档方面的东西。就当是培养次习惯。

import=”java.sql.*” 

String dbName = ”sun.jdbc.odbc.JdbcOdbcDriver”;
  String url = ”jdbc:odbc:tmp”;//odbc源
    Connection con=null;
    Statement stmt=null;
    ResultSet rs=null; 


    try {
          Class.forName(dbName);
          /**建立数据库连接*/ 
         }
    catch(ClassNotFoundException e)
        {
          System.out.print(“加载数据库驱动程序错误:”); 
        }
     try{
           con = DriverManager.getConnection(url,”",”");
           stmt=con.createStatement();
           String sql=”select * from [Sheet1$]“;//Sheet1为EXCEL表中的页名
           rs=stmt.executeQuery(sql); 

           while(rs.next())
                  {
                      System.out.println(rs.getString(1)+
                      ” ”+ rs.getString(2)+” ”+
                       rs.getString(3));
                   } 

        }
        catch(Exception e1)
          { 
            System.out.println(e1.toString());
           }
       try{
              rs.close();
              stmt.close();
              con.close();
          }
          catch(Exception e){}