Java项目开发平台开发规范
a Java 项目开发平台开发规范
目 目
录
Java 项目开发平台开发规范
____________________________________________ 1
一、开发平台概述 _______________________________________________________ 3
二、技术综述 ___________________________________________________________ 5
1、Struts 框架技术 _____________________________________________________________ 5
2、Hibernate 数据持久化技术 _____________________________________________________ 8
3、动态 bean 技术 _____________________________________________________________ 14
三、在 BONC- - JONE 平台上进行开发 _______________________________________ 18
1、BONC-JONE 平台目录说明 ___________________________________________________ 18
2、如何使用 BONC-JONE 运行起来 ______________________________________________ 18
3、开发有关规范性要求及典型步骤 _____________________________________________ 18
四、主要函数及使用技术方法说明 ________________________________________ 41
如何使用自定义标签库? ______________________________________________________ 41
如何使用日志类写日志? ______________________________________________________ 44
如何进行资源注册? __________________________________________________________ 46
如何进行登陆权限验证? ______________________________________________________ 46
如何进行字符转换? __________________________________________________________ 46
如何对资源文件进行字符转换? ________________________________________________ 46
如何配置、读取应用配置信息? ________________________________________________ 46
如何打包 boncpersistenceobj.jar 文件? _______________________________________________ 46
数据操作方法的原理是怎样的? ________________________________________________ 46
如何将任意文件上传到数据库中,又如何下载? __________________________________ 46
如何保证在页面清空的字段能正确提交到数据库? ________________________________ 46
如何使用日期控件? __________________________________________________________ 47
如何使用 DBQuery 类进行数据查询? ____________________________________________ 47
如何自动生成 Hibernate 持久化 beans 及 map 文件?___________________________________ 47
如何使用分页技术? __________________________________________________________ 49
附录:
________________________________________________________________ 52
附 A:Struts 学习精要参考 _____________________________________________________ 52
附 B:Hibernate 学习精要参考 ___________________________________________________ 52
附 C:技术备忘 ______________________________________________________________ 52
一、 开发平台概述
BONC-JONE 开发平台是北京东方国信电子技术有限公司遵循“简单、有效、先进、可扩”的原则,通过整合 Struts 1.1 与 Hibernate 2.1 等优秀的开源技术设计并实现的一个 J2EE开发平台。
其架构图如下:
这 个 体 系 架 构 的 主 体 是 MVC 架 构 。
MVC 是 Model/View/Control 的 缩 写 。Model/View/Control 是软件设计的典型结构。在这种设计结构下,一个应用被分为三个部分:Model、View 和 Controller,每个部分负责不同的功能。Model 是指对业务数据/信息的处理模块,包括对业务数据的存取、加工、综合等;View 是指用户界面,也就是面向用
户的数据表示;Controller 则负责 View 和 Model 之间的流程控制,也就是完成两个方向的动作:1.将用户界面(View)的操作映射到具体的 Model,以完成具体的业务逻辑;2. 将通过 Model 处理完的业务数据及时反应到用户界面(View)上。
其系统组成结构图如下:
BONC -E JONE 开发平台从总体结构上充分体现了分层的系统设计思想。分层的概念起源于操作系统及网络协议设计中,但目前这个概念已在所有面向对象的应用系统中相当流行了。
BONC-JONE 开发平台主要层次分为:表示层、业务层、持久化层及一些各层公用的工具类库。
分层的系统设计思想的重点在于:
一个分层的系统在各相关层的实现代码间定义了接口,从而允许一个层的实现代码的变化不会影响到其它的层。
分层系统结构还限制隔层依赖的发生,各层的通讯是由顶向下管理的。某一层仅依赖于直接位于它下面的那一层。每一层对其他层的存在都是不知道的,除非那一层紧邻其下。即使是对紧邻其下的层它也仅需要知道如何使用接口与其通讯就可以了,而无需知道其实现细节。
BONC-JONE 开发平台通过 Struts+Tiles 技术实现了 MVC 模式中的表示层和控制层,通过 Hibernate 技术结合动态 Bean 技术融合成独特的业务 Beans 技术构建了数据层。
表示层 Struts+Tiles 业务层 业务管理接口+ 业务管理抽象类+ 业务管理实现类 持久化层 Hibernate 业务 Beans 技术
数据库 DataBase
连接池技术
平台辅助 API JDBC
二、 技术综述
1 1 、s Struts 框架技术
Struts 是一个于 基于 J2EE 的 的 MVC 框架。
J2EE 体系包括 JSP、Servlet、EJB、WEB SERVICE 等多项技术。这些技术的出现给电子商务时代的 WEB 应用开发提供了一个非常有竞争力的选择。但怎样把这些技术组合起来,形成一个适应项目需要的稳定架构对项目开发是非常重要的。
设计一个框架,需要考虑的方面很多,不仅要对 J2EE 体系中的各种技术进行筛选取舍,并要考虑到开发过程中的角色分工、后期的运行维护,以及系统扩展性等诸多因素。
因此, 一个成功的软件需要有一个成功的架构。
。
MVC 架构使得应用程序的结构更加清晰,通过将代码按照层次划分为业务逻辑/数据、用户界面和应用流程控制这三个层次,增强代码稳定性。我们知道,对于 Model、View、Controller 这三部分功能来讲,View 的实现一般是由界面设计人员和界面程序员来完成,Model 则是由业务逻辑程序员来完成,Controller 则一般由负责整体控制的程序员来完成。Controller 部分的代码比较稳定,一般会实现一个通用的架构;而 Model 则跟随商务流程的变化而变化;View 的更改则是随着用户需求的更改而更改。这种模块功能的划分有利于在代码修改过程中进行模块的隔离,而不需要把具有不同功能的代码混杂在一起造成混乱。对于项目开发而言,有利于在项目小组内按照小组成员各自的擅长进行分工,有利于三个部分并行开发、加快项目进度。
当前可供选择的较为流行的 MVC 框架有六种之多:Struts、Maverick、WebWork、Turbine、RealMothods、AOP(aspect-oriented programming)。它们应用的领域及实现的侧重点各有不同。但以 Struts 应用最广,是基于 MVC 模式的 Web 应用最经典框架,当推首选。
Struts 最早是作为 Apache Jakarta 项目的组成部分问世。项目的创立者希望通过对该项目的研究,改进和提高 Java Server Pages (JSPs)、Servlet、标签库以及面向对象的技术水准。
Struts 这个名字来源于在建筑和旧式飞机中使用的支持金属架。它的目的是为了帮助我们减少在运用 MVC 设计模型来开发 Web 应用的时间。
因 因择 此我们选择 Struts 。
Struts 鼓励按照 Model 2 方式构建应用的体系。Model 2 是 MVC 基本设计模式的一种变体。MVC 设计模式的优点是,它使得 Model、View 和 Controller 各个部分之间相对独立。Struts 在一个中心位置装配 ActionServlet、ActionMapping 和各种 Action 类,处理所有传入的 HttpServletRequest。ActionServlet 把各个传入的 HttpServletRequest 分发给 Action 类,而ActionMapping 对象可通过 Struts-config.xml 配置文件控制,它告诉 ActionServlet 如何分发请求。
本图示意了 Struts 各个部分之间的通信过程 Controller 的功能:在客户端、View 和 Model 之间起协调、仲裁的作用。只有 Controller才会与 Model 和 View 联系,在这中间它就象是一个交换机,而 Model 和 View 之间不会直接通信,这样,Model、View 和 Controller 就被分隔开来。这是成功运用 Struts 的关键所在。
说明一下:所有 Controller 的逻辑应当放入 Action 类,与应用的其他层的通信可以在这里进行。虽然我们可以把业务逻辑也放入 Controller,但一般而言最好不要这么做。应当改用 Model 部分的组件,因为这些组件才是真正处理数据的地方。把数据保存到数据库也应当是 Model 的功能之一。
当 Controller 处理好一个 HttpServletRequest,它把请求转发给 View。View 的唯一任务是表现数据,在 Struts 中,View 一般使用 JSP 技术。
在 Struts 中,Controller 和 View 之间的所有通信都通过 HttpServletRequest、HttpSession和 ServletContext 间接完成,对于这些操作来说,首选的技术莫过于 Servlet,Struts 直接把HttpServletRequest 传递给 Servlet——或者是 JSP,不过 Servlet 容器会自动把 JSP 转换成Servlet。
Struts 框架将其侧重点放在了 Controller 与 与 View 层。
View 由 JSP 定制标记库和 JSP 页面共同构造,其中 ActionForm 类是一种类似 JavaBean的 ValueObject 对象,带有 set 和 get 方法,用来保存客户的状态。按照 Struts 的 MVC 概念,
ActionForm 位于 View 和 Controller 之间的中间地带。Struts 提供了一组完备的专用标记,用来从 JSP 访问 ActionForm 里面的数据。
Controller 由 ActionServlet、ActionMapping 和各种 Action 类相互配合来完成。其中 Action类给开发人员自由发挥的空间比较大,因此,在开发过程中完整地遵从 MVC 的概念 Action类的使用方式是一个关键。
于 对于 Struts 的解剖。
图解说明:其中不同颜色代表 MVC 的不同部分:红色(控制器)、紫色(模型)和绿色(视图)
首先,控制器(ActionServlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的 Struts 模块初始化相应的 ModuleConfig 对象。比如配置文件中的 Action 映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig 集合和 MessageResourcesConfig 集合等。
控制器接收 HTTP 请求,并从 ActionConfig 中找出对应于该请求的 Action 子类,如果没有对应的 Action,控制器直接将请求转发给 JSP 或者静态页面。否则控制器将请求分发至具体 Action 类进行处理。
在控制器调用具体 Action 的 execute 方法之前,ActionForm 对象将利用 HTTP 请求中的参数来填充自己(可选步骤,需要在配置文件中指定)。具体的 ActionForm 对象应该是 ActionForm 的子类对象,它其实就是一个 JavaBean。此外,还可以在ActionForm 类中调用 validate 方法来检查请求参数的合法性,并且可以返回一个包含所有错误信息的 ActionErrors 对象。如果执行成功,ActionForm 自动将这些参数信息以 JavaBean(一般称之为 form bean)的方式保存在 Servlet Context 中,这样它们就可以被其它 Action 对象或者 JSP 调用。Struts 将这些 ActionForm 的配置信息都放在 FormBeanConfig 集合中,通过它们 Struts 能够知道针对某个客户请求是否需要创建相应的 ActionForm 实例。
Action 很简单,一般只包含一个 execute 方法,它负责执行相应的业务逻辑,如果需要,它也进行相应的数据检查。执行完成之后,返回一个 ActionForward 对象,控制器通过该 ActionForward 对象来进行转发工作。我们主张将获取数据和执行业务逻辑的功能放到具体的 JavaBean 当中,而 Action 只负责完成与控制有关的功能。遵循该原则,所以在上图中将 Action 对象归为控制器部分。
本图给出了客户端从发出请求到获得响应整个过程的图解说明。
以上我们从原理上剖析了 Struts,关于具体如何应用 Struts 框架框,请参看附录 A。
2 2 、e Hibernate 数据持久化技术
Hibernate 是一种 object/relational mapping (ORM) 的持久化技术。
曾经,包括现在也有许多 J2EE 项目在直接使用 SQL/JDBC 实现持久化。众所周知的 DAO模式让我们把复杂的 JDBC 编码和大量 SQL 隐藏到业务逻辑和领域模型之后,但这种方式实现的是有限的分离,最致命的是应用由一种数据库向另一种数据库迁移时可移植性非常差。另外它要求开发者对项目中使用的关系数据库管理系统非常熟悉,而且要精通 SQL。
当前可供选择的较为流行的数据持久化技术也同样有很多:EJB、Hibernate、JDO、OJB、Cayenne、SimpleORM、JAXOR 等等。
不选用 EJB 的理由
EJB 在 J2EE 应用里是一个重量级的组件,它由容器提供了分布、事务等多种企业级应用需要的特性。我们不选用它主要是因为:
兼容性问题。规范一模一样,实现各有不同,当从某一种 EJB 容器向另一种 EJB 容器移植时维护的成本会很高。
性能问题。
不支持动态 Query 的问题。Entity Bean 最终的执行代码是在部署编译时生成的,很难实现动态 Query。
如果一个应用对事务处理要求很高,访问量非常大需要实现分布式集群时 EJB 才是必须的。
用 选用 Hibernate 的理由
Hibernate 是当前最活跃,应用最广,更新最快,文档最完整,功能最齐备的一个数据持久化的开源项目。选用它的理由主要有:
Hibernate 并不直接反映数据库中的表和列,它通过一些持久化类(JavaBeans)来映射到数据库中的表上。这些持久化类与我们通常使用的 JavaBeans 没有任何不同,它们即可以由 Hibernate 来持久化,同样重要的是它们也可以完全与 Hibernate 无关地被使用。这是它与其它持久化模型(比如 EJB)的一个重要的区别即 Hibernate 的持久化类是纯 JavaBeans,它可以在任何地方被使用,而不需要容器。
Hibernate 提供了一种对象导向的查询语言(HQL)。几乎支持所有的 SQL 语法,传统数据库可以做的它就可以做。
Hibernate 提供了数据分段提取控制功能。
将 Hibernate 放在 SLSB 后,它同样可以实现分布式应用,同样可以利用容器提供的JAT 事务服务。
择 因此我们选择 Hibernate 。
Hibernate 概要结构图:
Hibernate 详细结构图:
Hibernate 使用概要 手工创建或使用工具自动生成 Hibernate 的持久化类; 文件示例:
package eg; import java.util.Set; import java.util.Date;
/**
* @hibernate.class
*
table="CATS"
*/ public class Cat {
private Long id; // identifier
private Date birthdate;
private Cat mate;
private Set kittens
private Color color;
private char sex;
private float weight;
/**
* @hibernate.id
*
generator-class="native"
*
column="CAT_ID"
*/
public Long getId() {
return id;
}
private void setId(Long id) {
this.id=id;
}
/**
* @hibernate.many-to-one
*
column="MATE_ID"
*/
public Cat getMate() {
return mate;
}
void setMate(Cat mate) {
this.mate = mate;
}
/**
* @hibernate.property
*
column="BIRTH_DATE"
*/
public Date getBirthdate() {
return birthdate;
}
void setBirthdate(Date date) {
birthdate = date;
}
/**
* @hibernate.property
*
column="WEIGHT"
*/
public float getWeight() {
return weight;
}
void setWeight(float weight) {
this.weight = weight;
}
/**
* @hibernate.property
*
column="COLOR"
*
not-null="true"
*/
public Color getColor() {
return color;
}
void setColor(Color color) {
this.color = color;
}
/**
* @hibernate.set
*
lazy="true"
*
order-by="BIRTH_DATE"
* @hibernate.collection-key
*
column="PARENT_ID"
* @hibernate.collection-one-to-many
*/
public Set getKittens() {
return kittens;
}
void setKittens(Set kittens) {
this.kittens = kittens;
}
// addKitten not needed by Hibernate
public void addKitten(Cat kitten) {
kittens.add(kitten);
}
/**
* @hibernate.property
*
column="SEX"
*
not-null="true"
*
update="false"
*/
public char getSex() {
return sex;
}
void setSex(char sex) {
this.sex=sex;
} }
手工创建或使用工具自动生成 Hibernate 的 xml 映射文件; 文件示例:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="eg.Cat" table="CATS" discriminator-value="C">
<id name="id" column="uid" type="long">
<generator class="hilo"/>
</id>
<discriminator column="subclass" type="character"/>
<property name="birthdate" type="date"/>
<property name="color" not-null="true"/>
<property name="sex" not-null="true" update="false"/>
<property name="weight"/>
<many-to-one name="mate" column="mate_id"/>
<set name="kittens">
<key column="mother_id"/>
<one-to-many class="eg.Cat"/>
</set>
<subclass name="eg.DomesticCat" discriminator-value="D">
<property name="name" type="string"/>
</subclass>
</class>
<class name="eg.Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping>
初始化 Configuration Configuration cfg = new Configuration()
.addFile("Cat.hbm.xml")
.addFile("DomesticCat.hbm.xml"); 或 Configuration cfg = new Configuration() .addClass( eg.Cat .class) .addClass( eg. DomesticCat .class)
获得 SessionFactory SessionFactory sessions = cfg.buildSessionFactory(); 进行数据存取等操作 Session sess = sessions.openSession(conn);
// start a new transaction (optional) Transaction tx = sess.beginTransaction(); DomesticCat pk = new DomesticCat(); pk.setColor(Color.TABBY); pk.setSex("F"); pk.setName("PK"); pk.setKittens( new HashSet() ); pk.addKitten(fritz); sess.save( pk, new Long(1234) ); sess.flush(); //force the SQL INSERT sess.refresh(cat); //re-read the state (after the trigger executes) tx.commit(); sess.close();
使用 HQL 语言查询 Query q = s.createQuery("from foo in class Foo where foo.name=:name and foo.size=:size"); q.setProperties(fooBean); // fooBean has getName() and getSize() List foos = q.list();
需要说明的是:
Hibernate 产生的所有 SQL 是运行时产生的,说的更准确一些是在你系统启动时产生。
所有我们需要的只是一个包含映射元数据的 xml 映射文件。
xml 映射文件可以你手工来维护,也可以通过植入源代码的注释来产生。
以上我们简要介绍了 Hibernate 的基本特点及使用方法,详细内容请参看附录 B。
3 3 、 动态 n bean 技术
使用动态 bean 技术的理由:
我们不只一次抱怨信息系统中数据项变化不定,无法设计和实现 Java Beans。
我们也不只一次作过这样的事情:数据项增加或减少了,我需要修改信息系统以求适应。
比如我们按照某个企业的要求设计出了 2000 个 Bean 来满足该企业对信息系统中业务数据模型的需要,过了一定时间后,他们的业务发生了一定的变化,要对数据模型扩充一部分数据项,可想而知会有多么辛苦。动态 beans 技术就是为解决此类问题而生,它为解决由于数据项变化带来的设计和实现的变更提供了技术基础。
态 动态 bean 技术主要概念:
一个 Bean 属性的定义完全取决于有无访问者方法:设置器(setXXX())和获取器(getXXX()),而与在类定义中有无显示说明字段毫无关系。
为了使 Beans 能确认一个属性,其设置器(setXXX())和获取器(getXXX())必须遵循下列命名规则:
一个属性名在访问方法中必须以大写字母开头;
在其它地方以小写字母开头。
扩展 javaBean 属性机制:
定义了五种属性访问策略,使得属性的访问代码像脚本一样在运行时决定,另外一个进步就是它支持 List 和 Map 属性的元素属性,也就是扩展 javaBean 属性机制它不把一个 Bean 的某个 List 和 Map 成员看成一个整体属性,而是动态地把这个 List 和 Map 成员的元素看成属性,这样无疑提供了一种无限扩展 Bean 属性的能力。
Common-beanutils 1.6 中的 propertyUtils 实用类使用 Java 语言的内省反射功能实现扩展属性的设置器和获取器。propertyUtils 定义了引用一个特定 Java bean 属性的五种格式:
简单属性,格式 beanName.propName。propName 标识了 JavaBean beanName 的一个属性,这个属性的获取器和设置器的方法是通过 JavaBean 的标准内省功能决定的。如果要改变简单属性的值,必须要有设置器操作,可以想象成类似调用 beanName.[getpropName()|setpropName(value)];
嵌套属性,格式 beanName.propName1.propName2.propName3。像简单属性一样,第一个 propName1 元素被用来选择一个属性获取器方法,在这个方法返回的对象上使用 propName2 的获取器方法返回下一个对象,最后这个对象的属性propName3 被访问或设置,可以想象成类似调用beanName.getpropName1().getpropName2().[getpropName3()|setpropName3(value)];
索引属性,格式 beanName.propName[index]。属性 propName1 可以是一个数组, java.util.List 或者 JavaBean beanName 有索引属性获取器和设置器操作。bean 只需 propName 的获取器方法,可以想象成类似调用 b eanName. [getpropName (index)|setpropName(index,value)];
映射属性,格式 beanName. propName(key)。propName 是一个 java.util.Map 实现。bean 只需 propName 的获取器方法,可以想象成类似调用 beanName. getpropName ().[get("key")|set("key",value);
组合属性,格式 beanName. propName1.propName2[index].propName3(key)。
动态 bean: 动态 bean 具有动态属性,也就是说可以由程序运行时构造 bean 的属性,而不是像标准的 javaBean 在编译时决定一个 bean 的属性。
定义和访问一个动态 bean 的步骤如下:
定义一个动态属性 Dynaproperty 数组,动态属性 Dynaproperty 定义了一个属性的名字和对象类型;
用定义好的动态属性数组实例化一个动态类;
由动态类返回一个动态 bean;
可以用 propertyUtils 访问和设置动态 bean 的属性。
下面是定义和访问动态 bean 的代码:
// TestDynaBean.java import org.apache.commons.beanutils.*; import java.util.*; public class TestDynaBean {
public static void main(String[] args) {
TestBean bean = new TestBean();
Object value = null;
try{
Dynaproperty[] px = {
new Dynaproperty("subordinate", bean.getClass()),
new Dynaproperty("firstName", Class.forName("java.lang.String")),
new Dynaproperty("lastName", Class.forName("java.lang.String"))
};
DynaClass dynaClass = new BasicDynaClass("employee",null,
px );
DynaBean employee = dynaClass.newInstance();
propertyUtils.setproperty(employee,"subordinate", bean);
propertyUtils.setproperty(employee,"subordinate.listIndexed[0]","dy bean set");
propertyUtils.setproperty(employee,"firstName", "Fred");
propertyUtils.setproperty(employee,"lastName", "Flintstone");
System.out.println("subordinate.listIndexed[0]:");
System.out.println(propertyUtils.getproperty(employee,"subordinate.listIndexed[0]"));
System.out.println("firstName:" + propertyUtils.getproperty(employee,
"firstName"));
System.out.println("lastName:" + propertyUtils.getproperty(employee,
"lastName"));
}catch (Exception e ){
System.out.println(e.toString());
}
} } 从配置文件配置动态bean的动态属性好处在于既能固定又能更改动态Bean的属性,这些属性是这个动态 Bean 对外界的宣布的"访问协议"。动态属性 Dynaproperty 的主要构造函数接受两个参数:第一个为属性名称,为字符串性,第二个为属性的类型,为 Class类型。从配置文件读取的资料普通为字符串型,我们可以用 ClassLoader 把配置文件中字符串型的属性类型转化成 Class 类型的属性类型。
下面struts 1.1 中struts-example.war的 formbeans.xml中的片断体现了如何在配置文件中定一个动态 bean 的动态属性:
<form-bean name="logonForm" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="username" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> </form-bean> 下面 RequestUtils 的代码片断体现了如何从字符串表示的属性类型转化成 Class 型的属性类型:
public static Class applicationClass(String className)
throws ClassNotFoundException {
// Look up the class loader to be used
ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = RequestUtils.class.getClassLoader();
}
// Attempt to load the specified class
return (classLoader.loadClass(className));
} 这就是关于动态 bean 的所有奥秘,RequestUtils 类代码片断 public static ActionForm createActionForm 就是这样创建动态 bean 的。
三、在 BONC- - JONE 平台上进行开发
1 1 、 BONC- - JONE 平台目录说明
注意:com.bonc.common、com.bonc.security 包属于开发平台基本支持包,其中的文件不允许开发人员改动。
2 2 、如何使用 BONC- - JONE 运行起来
将开发平台从 source safe 拉下来后,只需要将 src 目录下的 bonc_init.properties 文件中boncHome= 的 路 径 改 为 你 所 下 载 目 录 的 实 际 路 径 , 如 :boncHome=D:\\DevelopWork\\java\\boncCrm\\exampleroot\\WEB-INF,做了这样的设置后,系统启动时就会到这个目录下去找我们的项目配置文件 bonc_config.xml。
如果你使用的是 Jbuilder,还应该将 lib 目录下的所有包文件,加入到你工程的 Required Libraries 中。
做完以上工作 bonc-jone 应该就可以正常运行了。
3 3 、开发有 关规范性要求及典型步骤
应用的包的组织规则
客户关系项目中所有与应用模块相关的包均应在 com.bonc.crm 包下,如果开发的是其他项目则根据项目名称来定义这个包名称,可能是这样的:com.bonc.sample 等。
在 com.bonc.crm 包之下,以模块名称来分包,比如:模块名称是“留言模块”,就要定义一个与其对应的包 com.bonc.crm.module.leaveword。
在各模块包下再分为 bean 包(存放 Form bean 及其他本模块可能要用到的 bean)action 包(存放 Action 类)与 bussinessmanager 业务管理包(存放业务管理接口类),比如:com.bonc.crm. module.leaveword.action、com.bonc.crm. module.leaveword.bean 与 com.bonc.crm. module.leaveword.bussinessmanager 包。
在各模块的业务管理包下再定义业务管理实现类包(impl 包存放业务管理接口的实现类),比如:com.bonc.crm. module.leaveword.bussinessmanager.impl。
包定义的要求:全部小写字母定义。
应用开发中主要编写的类的作用 Form bean 类:建议开发中尽量使用动态 Form bean(即根据 struts 的配置文件生成的动态 bean),特殊情况下才写 Form bean 类。该类是一个 ValueObject 对象,主要的作用是包装客户端请求,将数据从 view 层传给 Action 类,由 Action类转给业务处理类进行处理;或者由 Action 类更改或填充其中的数据,然后将其传给 view 层来显示。
Action 类:Action 类主要完成三方面的功能,其一是做登陆及权限验证,其二是做数据校验,其三(也是最主要的)负责完成与控制有关的功能。需要注意的是尽可能不要此类中包含业务处理功能。
业务管理接口类:该类是对业务对象进行操作的抽象,是一个接口,对该业务对象的操作均应通过它来进行。
业务管理抽象类:这种类实现或部分实现业务管理接口中定义的方法,业务操作的大部分代码均应该写在这个类中。由于这个类是个抽象类,所以它不能够被实例化。
业务管理实现类:这种类是业务管理抽象类的继承类,通常情况下其中无实际代码。
应用开发中关键的配置文件的意义及功能 web.xml 文件:是 Web 应用最基本的 部署描述 配置文件。
部署 Web 应用首先要配置 web.xml 文件。开发人员需要在 Web.xml 部署描述文件中配置:
有效的部署描述文件必须包含 DTD 声明:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> web-app 标记是部署描述文件的根元素,它的子元素包括:
元素 描述 icon 此元素指定在 GUI 工具中表示此 Web 应用的大图标和小图标,包含一个 small-icon 和一个 large-icon 元素,可使用 GIF或 JPEG 格式的图像 display-name 此元素提供在 GUI 工具中此模块的短名字 description 此元素提供关于父元素的描述性文本 distributable 如果在 Web 应用部署描述中使用该元素,就表示该 Web 应用可以部署到分布式 Servlet 容器 context-param 此元素包含 Web 应用的 Servlet 环境的初始参数 servlet 包含一个 servlet 的声明性数据 servlet-mapping 在 servlet 和 url 模式间进行映射 session-config 声明此 Web 应用的 Session 参数 mime-mapping 定义扩展名和 mime type 间的映射 welcome-file-list 包含 welcome-file 子元素的顺序列表 error-page 包含一个错误代码或违例类型与 web 应用中资源的映射 taglib 用于描述一个 JSP 标记库 resource-ref 包含一个对外部资源的引用声明 security-constraint 用于为一个或多个 Web 资源集合指定相应的安全约束 login-config 用于配置身份鉴定的方法,此应用使用域名,以及通过表单登录机制则需要设置此属性 security-role 包含使用于 web 应用中<security-constriant>元素的安全角 色的声明 env-entry 包含应用环境变量的声明 ejb-ref 用于声明对 EJB 的引用 ServletContext 初始化参数:
context-param 标记的子元素包括:
param-name :参数名
param-value :参数值 description :参数的描述信息
例如:
<context-param>
<param-name>my_context_param_name</param-name>
<param-value>Context Param Value</param-value>
<description>param description</description>
</context-param> Session 配置
session-config 标记的子元素包括:
session-timeout :session 超时时间
例如:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config> Servlet/JSP 定义
servlet 标记的子元素包括:
icon :在 GUI 工具中的显示图标 servlet-name :servlet 名称
display-name :在 GUI 工具中的显示名称
description :描述信息 servlet-class | jsp-file :servlet 类名称;jsp 文件的完全路径
init-param :初始化参数列表
load-on-startup :web 应用启动时装载
security-role-ref:定义安全引用角色
servlet-mapping 标记的子元素包括:
servlet-name :servlet 名称
例如:
<servlet>
<icon>
<small-icon>small.gif</small-icon>
<large-icon>largel.gif</large-icon>
</icon>
<servlet-name>my_servlet</servlet-name>
<display-name>my_servlet</display-name>
<description>my_servlet</description>
<servlet-class>com.apusic.test.MyServlet</servlet-class>
<init-param> <param-name>my_init_param</param-name> <param-value>Init Param Value</param-value> <description>param descripton</description>
</init-param>
<load-on-startup>1</load-on-startup>
<security-role-ref>
<description>role description</description>
<role-name>my_security_role_name</role-name>
<role-link>Security Role Link</role-link>
</security-role-ref>
</servlet>
Servlet/JSP 映射
url-pattern :servlet 映射的 URL 模板
<servlet-mapping>
<servlet-name>my_servlet</servlet-name>
<url-pattern>/my_url_pattern</url-pattern> </servlet-mapping>
MIME 类型映射 mime-mapping 的子元素包括:
extension :扩展名
mime-type :
MIME 类型
例如:
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type> </mime-mapping>
欢迎文件列表
welcome-file-list 标记的子元素包括:
welcome-file :作为缺省的欢迎文件名
例如:
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file> </welcome-file-list> 错误页面
error-page 标记的子元素包括:
error-code | exception-type :HTTP 的错误代码;异常类型
location :资源在 Web 应用中的位置
例如:
<error-page>
<error-code>404</error-code>
<location>ErrorPage.jsp</location> </error-page>
<error-page>
<exception-type>Exception Type</exception-type>
<location>ErrorPage.jsp</location> </error-page>
安全 security-constraint 标记的子元素包括:
web-resource-collection :用于区分资源子集和 web 应用内使用安全约束的这类资源的 HTTP 方法。如 HTTP 方法未被指定,安全约束将适用于所有的 HTTP 方法。
auth-constraint :指定允许访问此资源集合的用户角色。在此处使用的角色必须在<security-role-ref>元素中进行定义
user-data-constraint :于指出客户端和容器间的数据交换的保护方式
login-config 标记的子元素包括:
auth-method :用于为 Web 应用配置身份鉴定机制。作为对使用身份鉴定约束保护的任何 Web 资源取得访问的先决条件,用户必须使用已配置的身份鉴定机制进行鉴定。此元素的合法值为“BASIC”、“DIGEST”、“FORM” 或 “CLENT-CERT”
realm-name :指定在 HTTP 基础授权中的域名 form-login-config :定义 Web 应用中使用的登陆页面可被找到的位置
security-role 标记的子元素包括:
description :描述信息 role-name :安全角色的名字
例如:
<security-constraint>
<web-resource-collection>
<web-resource-name>Name</web-resource-name>
<description>descript</description>
<url-pattern>/security/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>default</role-name>
</auth-constraint> </security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name> </login-config> <security-role>
<description>role desc</description>
<role-name>default</role-name> </security-role> 标签库配置:
Taglib 标记的子元素包括:
taglib-uri:统一资源标识符 (URI)参数,可以自由命名。
taglib-location:标签库描述文件的实际位置。
例如:
<taglib>
<taglib-uri>/WEB-INF/BoncTagLib.tld</taglib-uri>
<taglib-location>/WEB-INF/BoncTagLib.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib> </web-app> 看来 web.xml 的配置是很多的,但在开发中我们需要进行的配置并不多。在 bonc-jone 开发平台的 web.xml 中基本不需要开发人员变动已有的配置。唯一需要由开发人员进行的配置是增加各模块的 struts 配置文件路径,例如:
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.tiles.ActionComponentServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-yourmoduel.xml,/WEB-INF/struts-config-other.xml</param-value> </init-param>
„ </servlet>
„ </web-app> Struts 配置文件:是 Struts 框架的中心配置文件,通俗地说是 Struts 应用的地图。
以下是 Struts 配置文件的基本结构:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- Struts Config XML - Sample Struts App --> <!-- ===================================== --> <!-- AutoGenerated from : c:\dev\javaworld\app\sample.vsd --> <!-- AutoGenerated on
: 02-18-2003 23:05:47 --> <!-- AutoGenerated by
: Struts GUI v2.11
(c)2002 Alien-Factory --> <!--
: See "http://www.alien-factory.co.uk" for details --> <!-- GET YOUR STICKY FINGERS OFF! i.e. Do not edit. --> <!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> <struts-config>
<!-- ====================== Form Bean Definitions =================== -->
<form-beans> <form-bean name="testForm" type="org.apache.struts.action.DynaActionForm" dynamic="true"> <form-property name="testproperyt" type="java.lang.String"/>
</form-bean>
</form-beans>
<!-- ================= Global Forward Definitions =================== -->
<global-forwards>
</global-forwards>
<!-- ======================= Action Definitions ===================== -->
<action-mappings> <action
path="/Login"
type="com.agilquest.onboard.presentation.actions.LoginAction" name=‖ testForm‖
validate="true"
scope="request" >
<description>Authenticates and authorizes a user.</description> <forward name="success" path="tile.loginPage"/> </action>
</action-mappings> </struts-config> 开发人员进行开发时主要是配置 form-beans 中的 form-bean 及 action-mappings 中的action。
注意:在 bonc-jone 开发平台中,WEB-INF 目录下的 struts-config.xml 配置文件是不允许开发人员更改的。开发人员应该将自己开发的模块独立形成一个 struts 配置文件,按照 struts-config-模块名称.xml 的方式来命名,并将其加入 web.xml 的配置中,具体方法见 web.xml 的配置。
tiles-defs.xml 配置文件:是使用 tiles 框架及其标签库技术需要配置的文件。
以下是 tiles-defs.xml 配置文件的基本结构:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"> <!-- Definitions for Tiles
--> <!--
This file contains definitions common to all struts module.
In particular, it contains the main layout and the common menus.
There is also the main page as a portal. --> <tiles-definitions>
<!-- ===================================================
-->
<!-- Master definitions
-->
<!-- ==================================================
-->
<!-- Page layout used as root for all pages. -->
<definition name="rootLayout" path="/layouts/rootLayout.jsp">
<put n...
上一篇:企业内部审计基本流程
下一篇:软件开发设计文档范文