山交2020《数据库管理》复习

1 游标

2 视图

3 表空间

4 表查询、进阶查询、子查询

5 约束条件

6 存储过程、函数、触发器

7 PLSQL语言编程

8 其他版本1

9 其他版本2

1 游标

游标就是把查询到结果集进行分行显示;

1 打开游标

Open +游标名;

2 读取游标

Fetch +游标名 into +局部变量(字段的别名);

3 关闭游标

Close + 游标名;

2 视图

视图就是表进行关联,是一张虚拟表,但它不存储数据,真实数据再表中。

1 创建视图

cerate  [OR REPLACE(重置)]  [FORCE/ONFORCE(基表是否创建)]  view 视图名
as subquery(一般都是selece+from+where条件)  [with read only](只读)

2 创建连接视图

CREATE OR REPLACE FORCE EDITIONABLE VIEW EMP_VIEW_UNION ("DNAME", "LOC", "EMPNO", "ENAME")
AS  SELECT d.dname,d.loc,e.empno,e.ename
FROM emp e,dept d  WHERE  e.deptno = d.deptno AND d.deptno = 20;

3 查询视图

Select * from 视图名;

4 删除视图

Drop 视图名;

5 更新视图

Insert into 视图名(7000,‘东方’,20);                 插入数据
Update 视图名 ename=’西方’ where empno=’7000’;        修改数据
Delete from 视图名 where empno=’7000’;                 删除数据

3 表空间

1 创建表空间

Conn sys/Ming as sysdba;                      先登录sys用户再创表空间

Create  tablespace  表空间名 datafile ’地址值+数据文件名.dbf’  size 50m 
extent management local autoallocate;        创建本地管理

2 建立大文件表空间

Create  bigfile tablespace  表空间名 datafile ’地址值+数据文件名.dbf’  size 2g;

3 删除表空间

Drop tablespace 表空间名字 including contens and datafiles;

4 创建用户

Create user   scott   indentified by   tiger;

5 给用户权限

Grant  create session/unlimited/create table  to 用户;    登录/表空间/建表

6 撤销权限

Revoke 权限 from 用户;

7 给用户角色

Grant   connect/dba/resource  to 用户;(登录/管理员/有建表权限)

8 删除用户

Drop user 用户名  [cascade]建表用户

9 向表空间添加/删除数据文件

Alter tablespace 表空间名 add/drop  datafile’地址\数据文件名.dbf’  size 100m ;

4 表查询、进阶查询、子查询

Dept表

Emp表

表结构:列名,数据类型,是否空,默认值,说明,含义

1 创建表

Create table 表名{字段名[数据类型]}

2 表查询

Select from 表名;

3 进阶查询

  1. Select from 表名 Where +条件;

  2. In(目标值,目标值,目标值=相当于or not in(目标值,目标值,目标值)=not

​ (查出员工编号事7369,7788,7566的任意一个的员工信息)

  1. And(与) or(或) not(非)

  2. Like ‘-%’(匹配字符)

    (查询以字母s开头员工信息)

    Select * from emp where ename Like “s%”;

  3. 字段值 is Null ;字段值 is not null 判断字段是否为空

  4. 分组查询:group by + 列名;

    (显示每个部门每种职位的平均工资和最高工资)

    Select deptno , job ,AVG(sal), MAX(sal) from emp

    GROUP BY deptno, job;

  5. 排序查询order by ASC/DESC(升序/降序)

    (按照工资由高到低排序)

    Select * from emp order by sal DESC;

    8.Between and 在什么之间;

    (列出所以不领奖金,同时工资大于2000的全部员工信息)

    Select * from emp where comm is null and sal>2000;

  6. Having和where区别:where不能用于聚集函数

    (计算每个部门平均工资大于2000的记录)

    Select deptno , AVG(sal) from emp

    GROUP BY deptno

    Having avg(sal)>2000;

  7. 聚集函数:AVG SUM MAX COUNT:各组行数

4 子查询

In ALL ANY 可以和><一起用

<>相当于不等于

子查询必须括号括起来


查询部门名称为research的员工信息

Select empno,ename,job from emp where deptno=(select deptno from dept where dname=’ research’);

查询工资大于10号部门的任意一个员工工资的其他部门的员工信息

Select deptno ,ename,sal from emp where sal>ANY(select sal from emp where deptno=10)  AND deptno <>10;

5 插数据

Insert into(字段名……) values(对应字段数据)

6 改数据

update…set

7 删除数据

delete from emp where job=’salesman’;

8 删除表

Drop table 表名;

5 约束条件

1 非空约束:Not NULL

直接在字段后加not null就行

2 唯一性约束:UNIQUE

QQ varchar(20) constraint QQ_UK UNIQUE;  constraint给约束起个名字,以后容易删除
Alter table 表名 add constraint QQ_UK UNIQUE(QQ); 建表时候没有加约束条件
Alter table 表名 drop constraint QQ_UK;删除约束

3 外键约束:foreign key(外键属于子表)

Alter table 子表 add constraint 外键名 foreign key 子表字段名 references 父表字段

级联删除:+on delete cascade

父表删除,子表也删除

级联设置:+on delete set null

父表删除,子表为null不会直接删除

删除外键:

Alter table 子表 drop constraint 外键名;

4 主键约束:primary key

主键约束=唯一性+非空

5 禁用约束:disable

用在自定义约束中,就是你自己定义的约束不会生效。

创建:Alter table 表名 drop constraint 键名;

激活:alter table 表名 enable constraint键名;

删除:Alter table 子表 drop constraint 外键名;

6 存储过程、函数、触发器

In:数值传递

Out:空传带值出

In out:地址传递

1 语法格式 创建调用存储过程

2 in

3 存储过程删除

Drop procedure 名字;

4 函数

函数格式计算平均工资

函数调用:

5 触发器:创建一张表

创建触发器

对dept表操作就会记录到dept_log表中自动的无需调用

7 PLSQL 语言编程

1 输出 num

2 输出a+b的值

3 eno变量名,对应emp表中的empno字段 %TYPE相同类型

4 %ROWTYPE

5 if 语句

6 case语句

7 循环语句

8 其他版本1

1 范式

\1. 无重复的列

\2. 属性完全依赖与主键

\3. 属性不依赖于其他非主属性

2 数据表完整性约束(重点)

准确性和唯一性

2.1 主键约束

primary key

非空 唯一

2.2 追加关联条件

利用 关键字on 指定行为类型

• on delete cascade 父表删除时 子表也被删除

• set null父表删除 子表设置为null

• no cation 父表执行删除 子表有数据时禁止删除

创建表

列名 类型 primary key
——–或者——–
constraint 约束名 primary key(列名)

修改表

alter table 表名 add constraint 约束名 primary key(列名)
alter table 表名 drop constraint 约束名

2.3 外键约束

foreign key

创建表

列名 类型 constraint 约束名 unique

修改表

alter table 表名 add constraint 约束名 unique(列名)
alter table 表名 drop constraint 约束名

案例

–创建一个新表 emp_temp1 并将部门编号为30的员工记录插入
create table emp_temp1
as select * from emp
where deptno=30;

–创建一个新表dept_temp1
create table dept_temp1
as select * from dept;

–添加主键约束
alter table dept_temp1
add constraint pk_2
primary key(deptno);

–为emp_temp1 添加外键dept_temp1(deptno)
alter table emp_temp1 add constraint emp_dept_fk2
foreign key(deptno) references dept_temp1(deptno);

2.4 唯一约束

unique

创建表

列名 类型 constraint 约束名 unique

修改表

alter table 表名 add constraint 约束名 unique(列名)
alter table 表名 drop constraint 约束名

2.5 非空约束

not null

创建表

列名 类型 not null

修改表

alter table 表名 modify 列名 not null

alter table 表名 modify 列名 null

2.6 检测约束

check

创建一个学习信息表(Student) 并年龄设置约束

create table stuinfo
(
stu_id varchar2(4) primary key,
stu_name varchar2(10) not null,
age int constraint ag_ck check(age>0 and age<120)
)

2.10禁用/激活/删除约束

3 函数

创建

create or replace function get_avg_pay (num_deptno number) return number is
begin
select avg(sal) into num_avg_pay from emp where deptno=num_deptno;
return(round(num_avg_play,2));
exception
where no_data_fount then
dbms_output_put_line(‘该部门编号不存在’);
return(0);
end;
/

调用

set serveroutput on
declare
avg_pay number;
begin
avg_pay:=get_avg_pay(10);
dbms_output_put_line(‘平均工资时’||avg_pay);
end;
/

删除

drop function fun_name;

4 视图

创建视图

create view emp_view as
select * from emp where deptno=20;
–可选[只读]
with read only;

查询视图

select * from emp_view;

删除视图

drop view 视图名

5 游标

set serveroutput on
declare cursor cur_emp(var_job in varchar2:=’SALESMAN’)
is select empno,ename,sal
from emp
where job=var_job;
type record_emp is record –创建一个数据类型
(
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type);
emp_row record_emp;
begin
open cur_emp(‘MANAGER’); –打开游标
fetch cur_emp into emp_row; –指向第一行
while cur_emp%found loop –循环遍历
dbms_output.put_line(emp_row.var_ename||’的编号是’||emp_row.var_empno||’, 工资是’||emp_row.var_sal);
fetch cur_emp into emp_row; –指向下一行
end loop;
close cur_emp; –关闭游标
end;
/

6 SQL语句查询(重点)

描述 语句
查询工资大于1500的员工信息 select * from emp where sal>1500
查询销售员工资大于1500的员工信息 select * from emp where job=‘SALESMAN’ and sal>1500
查询以字母S开头的员工信息 select * from emp where ename like ‘S%’
查询职务是SALESMAN的员工信息 select * from emp where job=‘SALESMAN’
查询出员工编号是7369 7788 7566的任意一个员工信息 select * from emp where empno in(7669)
查询工资在2000到3500之间的员工信息 select * from emp where sal between 2000 and 3500
列出所有不领取奖金,同时工资大于2000元的全部员工信息 select * from emp where comm is null null and sal>2000
计算平均工资,所有工资和总和,以及最高工资和各组的行数 select job,avg(sal),sum(sal),max(sal),count(job) from emp group by job
显示每个部门每种职务的平均工资和最高工资 select deptno,job avg(sal),max(sal) from emp group by deptno,job
统计出每个部门的平均工资大于2000的记录信息 select deptno,avg(sal) from emp group by deptno having avg(sal)>2000
按照工资由高到低的排序显示员工信息 select * from emp order by sal desc
按照工资由高到底排序,如果工资相等则按照入职时间由早到晚进行排序 select * from emp order by sal desc,hiredate asc;
查询经理所在部门名称 select e.empno as 员工编号,e.ename as 员工名称,d.dname as 部门 from emp e,dept d where e.deptno=d.deptno and e.job=‘MANAGER’;
通过deptno字段内连接emp表和dept表 select e.empno as 员工编号,e.ename as 员工名称,d.dname as 部门 from emp e innner join dept d on e.deptno=d.deptno
对员工表和部门表进行左外连接 select * from emp left join dept on emp.deptno=dept.deptno
对员工表和部门表进行右外连接 select * from emp right join dept on emp.deptno=dept.deptno;
对员工表和部门表进行完全外连接 select * from emp full join dept on emp.deptno=dept.deptno;
在emp表中检索工资大于2000的记录,并实现emp表与dept表的自然连接 select empno,ename,job,dname from emp natural join dept where sal>2000;
查询所有管理者所管理的下属员工信息 select em1.empno 员工编号,em1.ename 员工姓名,em2.empno 领导编号,em2.ename 领导姓名 from emp em1 left join emp em2 on em1.mgr=em2.empno;
通过交叉连接dept表和emp表,计算出查询结果的行数 select count(*) from dept cross join emp;

14 存储过程(重点)

创建存储过程

set serveroutput on
create or replace procedure 过程名 is
begin
insert into 表名 value(xxx);
dbms_output.put_line(‘插入新纪录成功’);
end;
/

create or replace procedure select_dept
(num_deptno in number,
var_dname out dept.dname%type,
var_loc out dept.loc%type
) is
begin
select dname,loc
into var_dname,var_loc
form dept
where deptno=num_deptno
exception
where on_data_fount then
dbms_output.put_line(‘该部门编号不存在’)
end;
/

调用存储过程

set serveroutput on
declare
var_dname dept.dname%type
var_loc dept.loc%type
begin
select_dept(10,var_dname,var_loc);
dbms_output.put_line(var_dname||’位于’||var_loc);
end;
/

删除存储过程

drop procedure 过程名;

7 PL/SQL

根据员工编号得到对应的员工姓名

set serveroutput on
declare
eno emp.empno%type;
ena emp.ename%type;
begin
eno:=&empno;
select ename into ena from emp where empno=eno;
dbms_output.put_line(‘编号: ‘||eno||’ena’);
end;
/

使用record记录类型变量, 查询员工编号为7369的员工信息

set serveroutput on
declare
type emp_type is record
(
var_name varchar2(20),
var_job varchar2(20),
var_sal number
);
empinfo emp_type;
begin
select ename,job,sal
into empinfo
from emp
where empno=7369;
dbms_output.put_line(‘员工’||empinfo.var_ename||’的职务是’||empinfo.var_job||’,工资是’||empinfo.var_sal);
end;
/

8 流程控制语句

if…then…elsif…语句

set serveroutput on
declare
month int;
begin
month:=&inputmonth;
if month >=1 and month <=3 then
dbms_output.put_line(‘这是春季’);
elsif month >=4 and month <=6 then
dbms_output.put_line(‘这是夏季’);
elsif month >=7 and month <=9 then
dbms_output.put_line(‘这是秋季’);
elsif month >=10 and month <=12 then
dbms_output.put_line(‘这是冬季’);
else
dbms_output.put_line(‘对不起,月份不合法’);
end if;
end;
/

case语句

set serveroutput on
declare
season int:=&inputseason;
aboutinfo varchar2(50);
begin
case season
when 1 then
aboutinfo:=season||’季度包括1,2,3月份’;
when 2 then
aboutinfo:=season||’季度包括4,5,6月份’;
when 3 then
aboutinfo:=season||’季度包括7,8,9月份’;
when 4 then
aboutinfo:=season||’季度包括10,11,12月份’;
else
aboutinfo:=season||’季度不合法’;
end case;
DBMS_OUTPUT.put_line(aboutinfo);
end;
/

goto语句

set serveroutput on
declare
x number;
begin
x:=9;
<>
x:=x-1;
dbms_output.put_line(x);
if x>0 then
goto repeat_loop;
end if;
end;
/

loop语句(重点)

set serveroutput on
declare
sum_i int:=0;
i int:=0;
begin
loop
i:=i+1;
sum_i:=sum_i+i;
exit when i=100;
end loop;
dbms_output.put_line(‘前100个自然数的和是:’||sum_i);
end;
/

for语句

set serveroutput on
declare
sum_i int:=0;
begin
for i in reverse 1..100 loop
if mod(i,2)=0 then
sum_i:=sum_i+i;
end if;
end loop;
dbms_output.put_line(‘前100个自然数中偶像之和是:’||sum_i);
end;
/

9 其他版本2

查询工资大于1500的员工信息

SELECT empno,ename,sal FROM emp WHERE sal>1500;

查询销售员工资大于1500的员工信息

SELECT * FROM emp WHERE sal>1500 AND job=’SALESMAN’;

查询以字母S开头的员工名称

SELECT empno,ename,job FROM emp WHERE ename LIKE ‘S%’ ;

查询不是以字母S开头的员工名称

SELECT empno,ename,job FROM emp WHERE ename NOT LIKE ‘S%’ ;

查询职务是salesman的员工名称 但不记得salesman的拼写

SELECT empno,ename,job FROM emp WHERE job LIKE ‘S_L_S%’ ;

查询员工编号是7369 7788 7566的任意员工的信息

SELECT * FROM emp WHERE empno IN (7369,7788,7566) ;

查询员工编号不是7369 7788 7566的员工的信息

SELECT * FROM emp WHERE empno NOT IN (7369,7788,7566) ;

查询工资在2000到3500之间的员工信息

SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 2000 AND 3500 ;

列出所有不领取奖金,同时工资大于2000的员工信息

SELECT * FROM emp WHERE sal>2000 AND comm IS NULL ;

计算平均工资、所有工资总和、以及最高工资和各组的行数

SELECT job,avg(sal),sum(sal),max(sal),count(job)

FROM emp

GROUP BY job;

显示每个部门,每种职位的平均工资和最高工资

SELECT deptno,avg(sal),max(sal)

FROM emp

GROUP BY deptno,job;

统计出每个部门的平均工资大于2000的记录信息

SELECT deptno AS 部门编号,avg(sal) AS 平均工资

FROM emp

GROUP BY deptno

HAVING AVG(sal)>2000;

按照工资由高到低的排序显示员工信息

SELECT *

FROM emp

ORDER BY sal DESC;

按照工资由高到低排序,如果工资相同按照入职日期由早到晚排序

SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;

查询经理所在部门

SELECT e.empno AS 员工编号,e.ename AS 员工名称,d.dname AS 部门

FROM emp e,dept d

WHERE e.deptno=d.deptno

AND e.job=’MANAGER’;

通过deptno字段内连接emp表和dept表

SELECT e.empno AS 员工编号,e.ename AS 员工名称,d.dname AS 部门

FROM emp e inner join dept d

ON e.deptno=d.deptno;

对员工表和部门表进行左外连接

INSERT INTO emp(empno,ename,job) VALUES(9527,’EAST’,’SALESMAN’);

SELECT e.empno,e.ename,e.job,d.deptno,d.dname

FROM emp e LEFT join dept d

ON e.deptno=d.deptno;

对员工表和部门表进行右外连接

SELECT e.empno,e.ename,e.job,d.deptno,d.dname

FROM emp e right join dept d

ON e.deptno=d.deptno;

对员工表和部门表进行完全外连接

SELECT e.empno,e.ename,e.job,d.deptno,d.dname

FROM emp e FULL join dept d

ON e.deptno=d.deptno;

在emp表中检索工资大于2000的记录并实现emp表与dept表的自然连接

SELECT empno,ename,job,dname

FROM emp NATURAL join dept

WHERE sal >2000;

查询所有管理者所管理的下属员工信息

SELECT em1.empno 员工编号,em1.ename 员工姓名,em2.empno 领导编号,em2.ename 领导姓名

FROM emp em1 LEFT JOIN emp em2

ON em1.mgr=em2.empno;

通过交叉连接dept表和emp表并计算结果行数

SELECT COUNT(*)

FROM dept CROSS JOIN emp;

交叉连接

SELECT *

FROM dept CROSS JOIN emp;

查询部门名称位RESEARCH的员工信息

SELECT empno,ename,job from emp where deptno=(

SELECT deptno from dept WHERE dname=’RESEARCH’

);

查询既不是最高工资也不是最低工资的员工信息

SELECT empno,ename,sal from emp

where sal>(SELECT MIN(sal) from emp)

AND sal<(SELECT MAX(sal) from emp)

ORDER BY sal;

查询不是销售部门的员工信息

SELECT empno,ename,job

from emp

where deptno IN (SELECT deptno from dept

WHERE dname<>’SALES’);

查询工资大于十号部门任意一个员工工资的其他部门员工的信息

SELECT deptno,ename,sal

from emp

where sal> ANY (SELECT sal from emp

WHERE deptno=10)

AND deptno <> 10;

查询工资大于部门编号为30的所有员工工资的员工信息

SELECT deptno,ename,sal

from emp

where sal> ALL (SELECT sal from emp

WHERE deptno=30);

向部门表中插入一条数据

INSERT INTO dept(deptno,dname,loc)

VALUES(88,’design’,’beijing’);

select * from dept;

INSERT INTO dept(deptno,loc)

VALUES(89,’beijing’);

Emp表中工资大于2000的员工信息添加到新表 emp_temp中

CREATE TABLE emp_temp(

empno number(4) primary key,

ename varchar2(10),

job varchar2(9),

mgr number(4),

hiredate date,

sal number(7,2),

comm number(7,2),

deptno number(2)

);

INSERT INTO emp_temp(empno,ename,job,mgr,hiredate,sal,comm,deptno)

select * from emp where sal>2000;

select * from emp_temp;

将销售员的工资上调20%

UPDATE emp

SET sal=sal*1.2

WHERE job=’SALESMAN’;

select * from emp;

修改员工号为7788的入职时间

UPDATE emp

SET hiredate=TO_DATE(‘1985/01/01’,’YYYY/MM/DD’)

WHERE empno=7782;

select * from emp where empno=7782;

将工资低于2000的员工工资调整为经理的平均工资水平

UPDATE emp

SET sal=(select AVG(sal)

FROM emp

WHERE job=’MANAGER’)

where sal<2000;

删除销售员的记录

DELETE FROM emp WHERE job=’SALESMAN’;

6.1软件测试准则

为了能设计出有效的测试方案,必须深入理解并正确运用指导软件测试的基本准则。下面讲述主要的测试准则。所有测试都应该能追溯到客户需求。从客户的角度看,最严重的错误是导致程序不能满足客户需求的那些错误。应该远在测试开始之前就制定出测试计划。把Pareto原理应用到软件测试中。Pareto原理说明,测试发现的错误中的80%很可能是由程序中20%的模块造成的。当然,问题是怎样找出这些可疑的模块并彻底地测试它们。应该从“小规模”测试开始,并逐步进行“大规模”测试。通常,首先重点测试单个程序模块,然后把测试重点转向在集成的模块族中寻找错误,最后在整个系统中寻找错误。不可能穷举测试依据前面所说的测试对象,我们把测试划分为几个方面来进行测试.

6.2界面测试

一种测试过程比较简单直观的测试方法是界面测试,只需细心地按界面要求核对就行了。这块很容易被忽视和遗漏。也是经常出Bug 的地方。界面测试中常出现的几种Bug如下:

(1)错别字,即界面中的文本内容或者标题中出现了错别字。这种 Bug 如果不细心,很容易被遗漏,可能会出现在提示信息或界面中。

(2)内容紊乱,通常出现在程序的提示信息和一些较长的文本中,因为页面的简单陈述是通过变量拼组起来的,用程序将文字—地输出来。通常是因为没有对程序进行认真的自测或程序中的控制错误,才导致这种Bug的出现。

(3)类似页面的内容中,字体,字号明显的不同,使界面的整体风格看上去不-致,这种情说

只出现在已经定义的CSS,开发人员在开发过程中没有调用或是没有CSS定义的情况下。

(4) 相近标题的程序及模块,标题被弄混。这种情况通常是因为相似的业务定义名称和业务实体,导致在开发过程中开发名称和模块被忽略了,只单独地实现其功能。

6.3功能测试

功能测试主要是测试需求分析中所要求的功能是否实现。功能测试中要注意:

(1)查询功能,查询方式有按单一 查询条件和按多个查询条件,- - 定要注意多个查询条件间的

关系,和一些常识性的问题。值得注意的是按条件模糊查询时,需要注意模糊匹配中传入的变量值。

(2)添加功能,很多时候录入功能无法实现是由于前台设置的数值长度大于后台数值长度,以

及前台与后台的数据结构不相符。还有必须录入的字段的设置不能有误。在我看来,逻辑清楚是最

重要,因为在插入数据时会有数据约束条件,数据库表字段之间冲突,所以就需要考虑到插入顺序

等问题。

(3)在测试删除功能时需注意单击”删除”按钮后,一般会提示是否确定删除。一般,我们会单击”确认”按钮,再查看信息是否被删除,而忽略了单击“取消”按钮后程序的反应。这也许会出现单击“取消”按钮,数据被删除的错误。另外,在同时删除多条记录时,需要再次按查询条件查看记录是否真的被删除了。有的时候只是在数据库中设了一个标志位,而不是真正的物理删除。所以被确认删除的记录可能还会在下一-次查询中被查询出来,这因为在查询条件中没有考虑将标志位。

(4)修改功能测试,主要是查看记录中的信息是否是修改提交并确认后的信息,需要注意检测是本不应该修改的数据否能被修改成功。.

6.4需求测试

测试中比较重要的一个部分是需求测试。因为需求是在软件设计,开发乃至软件测试中重要的依据。要针对需求测试,首先就要对项目的需求和业务有一-定的了解。这些需求很多时候是在实现增、删、查、改这些基本功能之.上,针对项目和相关业务所作的一些逻辑上的控制。这就要求程序员在设计和编码的时候要去充分理解考虑需求。还有,其实好的系统并不是你实现了你应该实现的功能就算完了,而是更重要的去为客户考虑,为使用方便,操作简单做出贡献,这样才有价值。

6.5性能测试

性能测试在软件的质量保证中起着重要的作用。通常我们把性能指标全部归结到硬件,操作系统和开发环境上,而忽略了代码本身性能上的考虑。性能需求指标中,稳定性、并访支撑能力以及

安全性都很重要。作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。在这方面,压力测试可以解诀一些问题,但是由于条件不足,这里不做测试。

3.3系统设计模式及开发框架

3.3.1 MVC 设计模式

MVC通过在模型和视图之间建立查询通告协议来协调显示和数据,MVC包

括3种类型,Model (模型)是应用对象,View (视图)是界面对象,Controller

(控制器)是用户界面对用户输入的响应”。如图所示。

模型:模型表示应用的数据及操作这些数据的逻辑方法。任何和整个应用有

关的持久性数据都应该放在模型中。模型所提供的API不能只针对某-一个专门的

视图或控制器,应该更一般化以适应不同客户的需求。

视图:视图将的模型当前状态展示给客户,具体的显示方法由视图负责,因此一

个模型可以适用多个不同的视图。在模型状态改变后,通过模型和视图之间的协议,

视图得知改变并修改自己的显示。对于用户的输入,视图将它们交给控制器处理。

控制器:控制器负责交互和将用户输入的数据导入模型,它还利用用户的输

入将应用转向其他视图。-些非持久的临时数据也应该在视图中存取。

因为MVC本身就是- -个非常复杂的系统,所以采用它来实现Web应用时,最好选一个现成的框架周,Struts 就是一一个不错的MVC应用框架。

3.3.2 Struts 框架

Struts框架是对MVC设计模式的一种实现。通俗地说,框架是- - -组用于解决

特定软件问题的类和接口的集合.组成框架的类和组件,一般都提供对一些概念、

方法的抽象;框架定义抽象直接的关系和交互,用以解决特定问题;框架的组件

是可重用的。Struts 是基于MVC框架的、制作大型Web应用的框架[9110].

1、Struts框架工作原理

Struts框架工作原理如图3-4所示,其中视图、控制器与模型的交互步骤是:

(1)所有浏览器请求都被提交给Struts Action Servlet处理。

(2) Struts Action Servlet根据Stuts-Config.xml文件中预先配置好的设置,选

择应该将请求转到哪个StrutsAction 子类。

(3)将请求数据传递到适当的Action请求处理器。

(4)当用户提交表单时,-个适当类型或配置好的Struts ActionForm子类将

被创建,并被填入表单中相应的数据。

(5) Struts Action子类可以从ActionForm子类中获取数据,用以调用业务逻

辑代码。Struts Action子类调用业务逻辑组件,完成业务功能。

2、Struts 框架结构

(1) Action和Action Servlet

Struts框架提供的Action Servlet 的类型为org.apache.struts.action. Action

Servlet,它实际上充当控制器的角色,负责处理所有的浏览器请求,但并不进行任

何的具体操作,具体的操作是在Stuts的Action (org,apache.struts.action. Action)

子类完成的。

(2) ActionForm Bean

浏览器请求可带参数,当用户提交HTML表单后,Struts框架就把参数放在一

个org.apache.struts.action. ActionFormBean 中,如果用户在表单中输入了不正确的

值,ActionForm可以进行校验。

(3) Exceptionhandler

在Action 的execute 或preform 函数中,有可能抛出异常,改异常将在

org,apache.struts. action.ExceptionHandler子类中处理。

(4)定制的标签集

Struts框架提供了丰富的标签库,用于支持ActionForm.

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

客官,赏一瓶怡宝吧。

支付宝
微信