人要有梦想

为梦想努力

常用链接

统计

j2ee

最新评论

2006年6月7日 #

架构之web framework- struts

[] 

Martin.guo

 

J2ee 架构中一般都要考虑 Web Framework 的选择。很多人选择比较流行的 Struts 。项目组中遇到过这样的情况,有些人不熟悉 Struts ,而有些人又对 Struts 青睐有加。有没有一个折中的办法来满足所有的人呢?

 

我是这样设计的:

通过拦截提交到 ActionServlet 上的 http 请求,经过 Http Parse 来收集请求参数,以 Name-Value 的形式存放为请求值对象,并且放在请求线程相关的上下文中。这个时候你就可以在 Action 执行结束前的任何地方拿到这些请求数据了。

 

在这个基础上,我们保留了 Struts Action ,并且规定 Action execute 方法里不能出现任何跟业务相关的代码 , 仅仅是负责页面的流转。

 

那么业务怎么办呢?我们定义了一个接口 Command, 它也只有一个方法 , 我们也取名字为 execute, 并且没有任何参数和返回数值。该方法的职责就是执行业务逻辑。这个时候你就要问了。 Action 里抽离业务逻辑,怎么调用 Command 呢?请求提交的数据怎么给 Command ?Command 执行完后的业务数据怎么返回?

 

我们设计了一个业务执行器,它的功能就是执行 Command 的业务逻辑实现 . 而把执行器的执行写到了 Action 里面。这样就隔离了页面流转和业务执行。 Action 的代码显的很简练和模板化。

 

由于请求数据是放在请求线程相关的上下文中,所以可以很方便的拿到。同时 Command 执行完毕的返回数据也是通过这个上下文返回给 Action 或者其他跟此请求线程相关的组件,说白一点就是此线程能够跑到的任何代码处都可以去跟上下文交互,存取线程相关的数据和服务。

 

设计到此为止,已经可以回答开头的问题了。

 

对于熟悉 Struts 的人呢,可以积极放心的使用 Struts 标签,使用 Formbean, 但有一点就是自己要把 FormBean 放到线程相关的上下文中,这样你就可以在 Command 里面去拿出来工作了,同时 Command 执行完毕后,你就可以顺手把返回数据填充到这个 FormBean 里面去了。跟你平时使用没有太大区别。

 

而对于不熟悉的人呢,你可能不喜欢写 Struts 标签,也可能不喜欢死板的 Formbean, 那么 OK ,你完全不用关心这些,你只要直接在 Command 里面去写逻辑代码就可以了。但有一点就是要,你要手工把返回的数据集合放到 request 里面去,然后到流转的 JSP 里面取出来展示。

 

OK ,皆大欢喜。

 

 

msn:gdq123@hotmail.com

posted @ 2006-06-07 19:29 人要有梦想 阅读(1154) | 评论 (3)编辑 收藏

2006年6月1日 #

软件架构师之架构过程概要

软件架构是软件系统一个高层次的结构体现,显示了系统分解后组件的布局和组件之间的关系。好的架构描述应该包含架构的多个视角,组件的设计和扩展描述,以及为满足功能性需求和非功能性需求的设计原则。
一般说,软件架构分为5个步骤,
1.建立架构的任务并且形成架构团队。
2.建立并且文档化架构需求。
3.设计架构
4.验证架构是否达到需求
5.发布架构到开发团队

然后我们细说这五步骤
第一,架构是需要有目标的,一般是为了满足长期的业务需求。然后去制定任务并且明确里程碑。让架构组的每个人都明确架构的目标以及任务的进行和任务之间的关系。总体架构设想这个时候需要出来了。关键组件设想也应该有了。
第二,这个时候就需要按照目标去分开整理架构的需求了。开始可能是很多的需求索引,每个索引就是一两句话的表达。对于索引要给出简单的描述。索引评审之后需要细化需求,是一个更为详细的需求整理,除了文字描述,还可以配置图形等。然后要做的就是建立use case去覆盖这些需求。
第三,设计架构可以分为概要设计和详细设计阶段。概要设计需要给出一个比较轮廓性的设计说明,能够比较简要的通过这些设计元素去阐述use case,在总体上把故事讲完整。然后评审,进入详细设计阶段,细化的设计更为完整和贴近实现。同样需要一个说故事的过程,把use case通过详细设计的元素说的更为生动和形象。然后去实现和整合。
第四,验证的过程是测试的一个过程,在需求阶段会确立很多测试计划和用例。对需求进行一个扫荡,看实现是否到达了承诺。
第五,不断测试并且反馈修改之后,稳定版本就可以发布到开发团队了。


个人观点,请大家多讨论。


架构的设计部分
1。更应该侧重组建的分解以及组件之间的接口关系。比一般的软件设计过程,更突出组件的接口特性和使用描述。组件的功能列表,生命周期,并发情况说明,通讯消息格式等。
2。架构中的组件是有统一的架构思想和原则。组件是要被约束的。
3。组件需要提供事例代码,典型应用场景,异常以及测试说明。
4。组件有时候是要映射到物理视图中的进程。
5。侧重架构系统的动态特性,组件之间的协作关系。



msn:gdq123@hotmail.com

posted @ 2006-06-01 11:34 人要有梦想 阅读(2682) | 评论 (5)编辑 收藏

2006年5月30日 #

软件架构师

软件架构师是什么?需要什么样的知识体系?如何成为优秀的软件架构师呢?

第一个问题:
软件架构师一词应该是对应系统架构师,都是架构师,但侧重不同。在4+1视图中,我觉得如果把架构师分为这两种的话,软件架构师应该是站在逻辑视图和开发视图的角度,而系统架构师则更多的是过程视图和物理视图。当然,这两个角色就象是人的两个眼睛,缺少一个都会定位不准确,容易是系统目标偏离。

当然了,现实世界中,一般这两中角色集中在一个人身上体现出来,或者一个小组。很多公司都不设置此类职位;有的公司则分工很细。

第二个问题:
知识体系不好说,只说重点的吧。
软件架构师的职责是把需求转换为软件世界的模型。4+1视图中以use case作为核心,其中功能性需求以及部分非功能性需求会被软件架构师通过分析和设计,映射为各种软件设计模型。从OOA/OOD角度说,use case 在这个过程中是要转换为各种UML,其中类图,序列图,状态图是最常用到的。这个转换过程是需要智慧的,use case是目的,各种OO的原则是指导,设计模式是经验,灵活运用是能力。里面蕴涵了设计的美感,我觉得这个过程是衡量一个软件架构师的最重要的指标。

当然这个过程是迭代和反馈的,我觉得概要设计和详细设计只是思考同一个问题的粒度不同而已。

另外就是我们要熟悉语言,详细设计是要转换为代码的,而且跟语言是有关系的。语言比如java/c++等,详细设计的模型是有很多不同的。就需要软件架构师有过这个过程,并且是非常良好的映射。

除了语言就是要熟悉某个技术领域,比如J2EE/DOTnet.从J2ee来说,可能需要了解比如jsp/servlet/ejb/jndi/jta/jdbc等。还需要了解各种web framework,o/rmapping,ioc/aop容器等等。还有的就是一些技术组件和业务组件,不如workflow,rules engine等等。另外比如各种database.熟悉这些东西的目的,是把这些软件和组件合理并且有机的组织起来成为一个开发的架构。这个过程是需要创造力和想象力的。可能很多人认为这个地方正是软件架构师体现能力的地方。

第三个问题:
我不是很清楚,但我认为意志和想象力能够使每个有目标的人达到彼岸。




msn:gdq123@hotmail.com

posted @ 2006-05-30 13:31 人要有梦想 阅读(5617) | 评论 (1)编辑 收藏

2006年5月23日 #

SQL 例子 转载

-1、查找员工的编号、姓名、部门和出生日期,如果出生日期为空值,
--显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd。
select emp_no ,emp_name ,dept ,
isnull(convert(char(10),birthday,120),'日期不详') birthday
from employee
order by dept
--2、查找与喻自强在同一个单位的员工姓名、性别、部门和职称
select emp_no,emp_name,dept,title
from employee
where emp_name<>'喻自强' and dept in
(select dept from employee
where emp_name='喻自强')

--3、按部门进行汇总,统计每个部门的总工资
select dept,sum(salary)
from employee
group by dept

--4、查找商品名称为14寸显示器商品的销售情况,
--显示该商品的编号、销售数量、单价和金额
select a.prod_id,qty,unit_price,unit_price*qty totprice
from sale_item a,product b
where a.prod_id=b.prod_id and prod_name='14寸显示器'

--5、在销售明细表中按产品编号进行汇总,统计每种产品的销售数量和金额
select prod_id,sum(qty) totqty,sum(qty*unit_price) totprice
from sale_item
group by prod_id

--6、使用convert函数按客户编号统计每个客户1996年的订单总金额
select cust_id,sum(tot_amt) totprice
from sales
where convert(char(4),order_date,120)='1996'
group by cust_id

--7、查找有销售记录的客户编号、名称和订单总额
select a.cust_id,cust_name,sum(tot_amt) totprice
from customer a,sales b
where a.cust_id=b.cust_id
group by a.cust_id,cust_name

--8、查找在1997年中有销售记录的客户编号、名称和订单总额
select a.cust_id,cust_name,sum(tot_amt) totprice
from customer a,sales b
where a.cust_id=b.cust_id and convert(char(4),order_date,120)='1997'
group by a.cust_id,cust_name

--9、查找一次销售最大的销售记录
select order_no,cust_id,sale_id,tot_amt
from sales
where tot_amt=
(select max(tot_amt)
from sales)

--10、查找至少有3次销售的业务员名单和销售日期
select emp_name,order_date
from employee a,sales b
where emp_no=sale_id and a.emp_no in
(select sale_id
from sales
group by sale_id
having count(*)>=3)
order by emp_name

--11、用存在量词查找没有订货记录的客户名称
select cust_name
from customer a
where not exists
(select *
from sales b
where a.cust_id=b.cust_id)

--12、使用左外连接查找每个客户的客户编号、名称、订货日期、订单金额
--订货日期不要显示时间,日期格式为yyyy-mm-dd
--按客户编号排序,同一客户再按订单降序排序输出
select a.cust_id,cust_name,convert(char(10),order_date,120),tot_amt
from customer a left outer join sales b on a.cust_id=b.cust_id
order by a.cust_id,tot_amt desc

--13、查找16M DRAM的销售情况,要求显示相应的销售员的姓名、
--性别,销售日期、销售数量和金额,其中性别用男、女表示
select emp_name 姓名, 性别= case a.sex when 'm' then '男'
when 'f' then '女'
else '未'
end,
销售日期= isnull(convert(char(10),c.order_date,120),'日期不详'),
qty 数量, qty*unit_price as 金额
from employee a, sales b, sale_item c,product d
where d.prod_name='16M DRAM' and d.prod_id=c.prod_id and
a.emp_no=b.sale_id and b.order_no=c.order_no

--14、查找每个人的销售记录,要求显示销售员的编号、姓名、性别、
--产品名称、数量、单价、金额和销售日期
select emp_no 编号,emp_name 姓名, 性别= case a.sex when 'm' then '男'
when 'f' then '女'
else '未'
end,
prod_name 产品名称,销售日期= isnull(convert(char(10),c.order_date,120),'日期不详'),
qty 数量, qty*unit_price as 金额
from employee a left outer join sales b on a.emp_no=b.sale_id , sale_item c,product d
where d.prod_id=c.prod_id and b.order_no=c.order_no

--15、查找销售金额最大的客户名称和总货款
select cust_name,d.cust_sum
from customer a,
(select cust_id,cust_sum
from (select cust_id, sum(tot_amt) as cust_sum
from sales
group by cust_id ) b
where b.cust_sum =
( select max(cust_sum)
from (select cust_id, sum(tot_amt) as cust_sum
from sales
group by cust_id ) c )
) d
where a.cust_id=d.cust_id

--16、查找销售总额少于1000元的销售员编号、姓名和销售额
select emp_no,emp_name,d.sale_sum
from employee a,
(select sale_id,sale_sum
from (select sale_id, sum(tot_amt) as sale_sum
from sales
group by sale_id ) b
where b.sale_sum <1000
) d
where a.emp_no=d.sale_id

--17、查找至少销售了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额
select a.cust_id,cust_name,b.prod_id,prod_name,d.qty,d.qty*d.unit_price
from customer a, product b, sales c, sale_item d
where a.cust_id=c.cust_id and d.prod_id=b.prod_id and
c.order_no=d.order_no and a.cust_id in (
select cust_id
from (select cust_id,count(distinct prod_id) prodid
from (select cust_id,prod_id
from sales e,sale_item f
where e.order_no=f.order_no) g
group by cust_id
having count(distinct prod_id)>=3) h )

--18、查找至少与世界技术开发公司销售相同的客户编号、名称和商品编号、商品名称、数量和金额
select a.cust_id,cust_name,d.prod_id,prod_name,qty,qty*unit_price
from customer a, product b, sales c, sale_item d
where a.cust_id=c.cust_id and d.prod_id=b.prod_id and
c.order_no=d.order_no and not exists
(select f.*
from customer x ,sales e, sale_item f
where cust_name='世界技术开发公司' and x.cust_id=e.cust_id and
e.order_no=f.order_no and not exists
( select g.*
from sale_item g, sales h
where g.prod_id = f.prod_id and g.order_no=h.order_no and
h.cust_id=a.cust_id)
)

19、查找表中所有姓刘的职工的工号,部门,薪水
select emp_no,emp_name,dept,salary
from employee
where emp_name like '刘%'

20、查找所有定单金额高于2000的所有客户编号
select cust_id
from sales
where tot_amt>2000

21、统计表中员工的薪水在4000-6000之间的人数
select count(*)as 人数
from employee
where salary between 4000 and 6000

22、查询表中的同一部门的职工的平均工资,但只查询"住址"是"上海市"的员工
select avg(salary) avg_sal,dept
from employee
where addr like '上海市%'
group by dept

23、将表中住址为"上海市"的员工住址改为"北京市"
update employee
set addr like '北京市'
where addr like '上海市'

24、查找业务部或会计部的女员工的基本信息。
select emp_no,emp_name,dept
from employee
where sex='F'and dept in ('业务','会计')

25、显示每种产品的销售金额总和,并依销售金额由大到小输出。
select prod_id ,sum(qty*unit_price)
from sale_item
group by prod_id
order by sum(qty*unit_price) desc

26、选取编号界于'C0001'和'C0004'的客户编号、客户名称、客户地址。
select CUST_ID,cust_name,addr
from customer
where cust_id between 'C0001' AND 'C0004'

27、计算出一共销售了几种产品。
select count(distinct prod_id) as '共销售产品数'
from sale_item

28、将业务部员工的薪水上调3%。
update employee
set salary=salary*1.03
where dept='业务'

29、由employee表中查找出薪水最低的员工信息。
select *
from employee
where salary=
(select min(salary )
from employee )

30、使用join查询客户姓名为"客户丙"所购货物的"客户名称","定单金额","定货日期","电话号码"
select a.cust_id,b.tot_amt,b.order_date,a.tel_no
from customer a join sales b
on a.cust_id=b.cust_id and cust_name like '客户丙'

31、由sales表中查找出订单金额大于"E0013业务员在1996/10/15这天所接每一张订单的金额"的所有订单。
select *
from sales
where tot_amt>all
(select tot_amt
from sales
where sale_id='E0013'and order_date='1996/10/15')
order by tot_amt

32、计算'P0001'产品的平均销售单价
select avg(unit_price)
from sale_item
where prod_id='P0001'

33、找出公司女员工所接的定单
select sale_id,tot_amt
from sales
where sale_id in
(select sale_id from employee
where sex='F')

34、找出同一天进入公司服务的员工
select a.emp_no,a.emp_name,a.date_hired
from employee a
join employee b
on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
order by a.date_hired

35、找出目前业绩超过232000元的员工编号和姓名。
select emp_no,emp_name
from employee
where emp_no in
(select sale_id
from sales
group by sale_id
having sum(tot_amt)<232000)

36、查询出employee表中所有女职工的平均工资和住址在"上海市"的所有女职工的平均工资
select avg(salary)
from employee
where sex like 'f'
union
select avg(salary)
from employee
where sex like 'f' and addr like '上海市%'

37、在employee表中查询薪水超过员工平均薪水的员工信息。
Select *
from employee
where salary>( select avg(salary)
from employee)

38、 找出目前销售业绩超过10000元的业务员编号及销售业绩,并按销售业绩从大到小排序。
Select sale_id ,sum(tot_amt)
from sales
group by sale_id
having sum(tot_amt)>10000
order by sum(tot_amt) desc

39、 找出公司男业务员所接且订单金额超过2000元的订单号及订单金额。
Select order_no,tot_amt
From sales ,employee
Where sale_id=emp_no and sex='M' and tot_amt>2000

40、 查询sales表中订单金额最高的订单号及订单金额。
Select order_no,tot_amt from sales
where tot_amt=(select max(tot_amt) from sales)

41、 查询在每张订单中订购金额超过4000元的客户名及其地址。
Select cust_name,addr from customer a,sales b
where a.cust_id=b.cust_id and tot_amt>4000

42、 求出每位客户的总订购金额,显示出客户号及总订购金额,并按总订购金额降序排列。
Select cust_id,sum(tot_amt) from sales
Group by cust_id
Order by sum(tot_amt) desc

43、 求每位客户订购的每种产品的总数量及平均单价,并按客户号,产品号从小到大排列。
Select cust_id,prod_id,sum(qty),sum(qty*unit_price)/sum(qty)
From sales a, sale_item b
Where a.order_no=b.order_no
Group by cust_id,prod_id
Order by cust_id,prod_id

44、 查询订购了三种以上产品的订单号。
Select order_no
from sale_item
Group by order_no
Having count(*)>3

45、 查询订购的产品至少包含了订单3号中所订购产品的订单。
Select distinct order_no
From sale_item a
Where order_no<>'3'and not exists (
Select * from sale_item b where order_no ='3' and not exists
(select * from sale_item c where c.order_no=a.order_no and c.prod_id=b.prod_id))

46、 在sales表中查找出订单金额大于"E0013业务员在1996/11/10这天所接每一张订单的金额"的所有订单,并显示承接这些订单的业务员和该订单的金额。
Select sale_id,tot_amt from sales
where tot_amt>all(select tot_amt
from sales
where sale_id='E0013' and order_date='1996-11-10')

47、 查询末承接业务的员工的信息。
Select *
From employee a
Where not exists
(select * from sales b where a.emp_no=b.sale_id)

48、 查询来自上海市的客户的姓名,电话、订单号及订单金额。
Select cust_name,tel_no,order_no,tot_amt
From customer a ,sales b
Where a.cust_id=b.cust_id and addr='上海市'

49、 查询每位业务员各个月的业绩,并按业务员编号、月份降序排序。
Select sale_id,month(order_date), sum(tot_amt)
from sales
group by sale_id,month(order_date)
order by sale_id,month(order_date) desc

50、 求每种产品的总销售数量及总销售金额,要求显示出产品编号、产品名称,总数量及总金额,并按产品号从小到大排列。
Select a.prod_id,prod_name,sum(qty),sum(qty*unit_price)
From sale_item a,product b
Where a.prod_id=b.prod_id
Group by a.prod_id,prod_name
Order by a.prod_id
51、 查询总订购金额超过'C0002'客户的总订购金额的客户号,客户名及其住址。
Select cust_id, cust_name,addr
From customer
Where cust_id in (select cust_id from sales
Group by cust_id
Having sum(tot_amt)>
(Select sum(tot_amt) from sales where cust_id='C0002'))

52、 查询业绩最好的的业务员号、业务员名及其总销售金额。
select emp_no,emp_name,sum(tot_amt)
from employee a,sales b
where a.emp_no=b.sale_id
group by emp_no,emp_name
having sum(tot_amt)=
(select max(totamt)
from (select sale_id,sum(tot_amt) totamt
from sales
group by sale_id) c)

53、 查询每位客户所订购的每种产品的详细清单,要求显示出客户号,客户名,产品号,产品名,数量及单价。
select a.cust_id, cust_name,c.prod_id,prod_name,qty, unit_price
from customer a,sales b, sale_item c ,product d
where a.cust_id=b.cust_id and b.order_no=c.order_no and c.prod_id=d.prod_id

54、 求各部门的平均薪水,要求按平均薪水从小到大排序。
select dept,avg(salary)
from employee
group by dept
order by avg(salary)

posted @ 2006-05-23 15:10 人要有梦想 阅读(1707) | 评论 (2)编辑 收藏

仅列出标题