web编程技术.docx
- 文档编号:30569064
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:21
- 大小:183.78KB
web编程技术.docx
《web编程技术.docx》由会员分享,可在线阅读,更多相关《web编程技术.docx(21页珍藏版)》请在冰豆网上搜索。
web编程技术
1、通配符问题
(1)使用通配符可以优化action的配置。
(2)约定优于配置。
约定的如果好,可以使action配置非常的简洁。
(3)寻找action的路径匹配顺序。
2、动态方法调用DMI
如果Action中存在多个方法时,我们可以使用!
+方法名调用指定方法。
如下:
publicclassHelloWorldAction{
privateStringmessage;
....
publicStringexecute()throwsException{
this.message="我的第一个struts2应用";
return"success";
}
publicStringother()throwsException{
this.message="第二个方法";
return"success";
}
}
要访问action的other()方法,可以这样调用:
../helloworld!
other
通常不建议大家使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。
3、包含模块配置文件
在大部分应用里,随着应用规模的增加,系统中Action数量也大量增加,导致struts.xml配置文件变得非常臃肿。
为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。
4、默认action
用于解决地址链接错误问题
/ok.jsp
5、路径问题
在struts2中超级链接通常都采用绝对路径,而不使用相对路径,这样便于链接的实现。
6、结果类型
struts2中提供了多种结果类型,如:
dispatcher(默认值内部转发/服务器跳转)、redirect(浏览器跳转)、chain、redirectAction、freeMarker等。
7、全局结果集
当许多action都有共同的结果时,如果每个package都存在一个相同结果,会使得struts.xml比较臃肿,所以使用全局的结果集。
一个包内的全局结果集可以通过包的继承而被其它包使用。
这样做的好处是:
通用的结果集不用多次配置,减少struts.xml的配置量。
…..
8、动态参数传递
参数结果集(向结果集传参数):
用在redirect的时候
一次request只有一个valueStack。
9、用域模型接受参数
1、当向action中传递参数时,struts会自动的new一个对象。
因此在action中不用new对象。
2、Struts2中的MVC
M-模型:
一些对象的模型
V-试图:
用来显示的页面
C-控制:
编写的action
10、动态结果集
${}用在配置文件struts.xml里从值栈中取数据。
11、AOP简介
●AOP(Aspect-OrientedProgramming,面向切面编程):
是一种新的方法论,是对传统OOP(Object-OrientedProgramming,面向对象编程)的补充.
●AOP的主要编程对象是切面(aspect)[æspɛkt],横切关注点抽象(模块化)即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。
●在应用AOP编程特点:
仍然需要在定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类.这样一来横切关注点就被模块化到特殊的对象(切面)里.
●为什么用AOP:
•每个事物逻辑位于一个位置,代码不分散,便于维护和升级
•业务模块更简洁,只包含核心业务代码.
•AOP的目的是实现与业务逻辑无关的业务编写一个切面类。
12、action接收用户参数
用于解决地址链接错误问题
全局action的
-
-
-
-
-
Hibernate运行机制
13、HQL基础
HQL查询依赖于Query类,每个Query实例对应一个查询对象。
使用HQL查询可按如下步骤进行:
(1)获取HibernateSession对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果。
14、ORM简介
₪对象/关系映射ORM(Object-RelationMapping)
■对象与对象之间的关系对应到数据库表与表之间的关系的一种模式。
■简单地说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。
■对象和关系数据是业务实现的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。
内存中的对象之间存在着关联和继承关系。
而在数据库中,关系数据无法直接表达多对多关联和继承关系。
因此,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
■一般的ORM包括四个部分:
■对持久类对象进行CRUD操作的API(CRUD操作API)
■用来规定类和类属性相关查询的语言或API(查询语言或API)
■规定mappingmetadata的工具(映射机制)
■让ORM实现同事务对象一起进行脏数据检查(dirtychecking)、延迟关联抓取(lazyassociationfetching)和其他优化操作的技术(实现技术)
15、Query接口
Queryquery=session.createQuery(“fromKcbwherekch=100”);
例如以下语句:
Queryquery=session.createQuery("fromKcbwherekch=?
");
在后面设置其值:
query.setString(0,"要设置的值");
上面的方法是通过“?
”来设置参数,还可以用“:
”后跟变量的方法来设置参数,如上例可以改为:
Queryquery=session.createQuery("fromKcbwherekch=:
kchValue");
query.setString("kchValue","要设置的课程号值");
或者:
query.setParameter(0,"要设置的值");
Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。
例如:
Queryquery=session.createQuery("fromKcbwherekch=198");
Listlist=query.list();
16、实体对象生命周期
实体对象的生命周期有以下3种状态。
1.transient(瞬时态)
瞬时态,即实体对象在内存中的存在,与数据库中的记录无关。
如下面的代码:
2.persisent(持久态)
在这种状态下,实体对象的引用被纳入Hibernate实体容器中加以管理。
处于持久状态的对象,其变更将由Hibernate固化到数据库中。
例如下面的代码:
Studentstu=newStudent();
Studentstu1=newStudent();
stu.setSnumber("081101");
stu.setSname("李方方");
stu.setSage(21);
stu1.setSnumber("081102");
stu1.setSname("程明");
stu1.setSage(22);//到此为止,stu和stu1均处于瞬时态
Transactiontx=session.beginTransaction();
//通过save()方法,stu对象转换为持久态,由Hibernate纳入实体管理容器,而stu1仍然处于瞬时态
session.save(stu);
//事务提交之后,数据库表中插入一条学生的记录,对于stu1则无任何操作
mit();
Transactiontx2=session.beginTransaction();
stu.setSname("李方");
stu1.setSname("程明明");
mit();
虽然这个事务中没有显示调用session.save()方法保存stu对象,但是由于stu为持久态,将自动被固化到数据库,因此数据库的学号为“081101”学生记录的姓名已被更改为“李方”,此时stu1仍然是一个普通Java对象,对数据库未产生任何影响。
处于瞬时态的对象,可以通过Session的save()方法转换成持久状态。
同样,如果一个实体对象由Hibernate加载,那么,它也处于持久状态。
例如下面的代码:
//由Hibernate返回的持久对象
Studentstu=(Student)session.load(Student.class,newInteger
(1));
3.Detached(脱管状态)
处于持久态的对象,其对应的Session实例关闭之后,此对象就处于脱管状态。
Session实例可以看做是持久对象的宿主,一旦此宿主失效,其从属的持久对象进入脱管状态。
如下面的代码:
//stu处于瞬时态
Studentstu=newStudent();
Studentstu1=newStudent();
₪stu.setSnumber("081101");
₪stu.setSname("李方方");
₪stu.setSage(21);
₪stu1.setSnumber("081102");
₪stu1.setSname("程明");
₪stu1.setSage(22);
₪Transactiontx=session.beginTransaction();
₪//stu对象由Hibernate纳入管理容器,处于持久状态
₪session.save(stu);
₪mit();
₪//stu对象状态为脱管态,因为与其关联的session已经关闭
₪session.close();
17、Hibernate事务管理
₪1.基于JDBC的事务管理
₪Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力。
在事务管理层,Hibernate将其委托给底层的JDBC或JTA,以实现事务管理和调度功能。
₪在JDBC的数据库操作中,一项事务是由一条或多条表达式组成的不可分割的工作单元,通过提交commit()或回滚rollback()来结束事务的操作。
₪将事务管理委托给JDBC进行处理是最简单的实现方式,Hibernate对于JDBC事务的封装也比较简单。
如下面的代码:
₪Sessionsession=sessionFactory.openSession();
₪Transactiontx=session.beginTransaction();
₪session.save(room);
₪mit();
₪从JDBC层面而言,上面的代码实际上对应着:
₪Connectioncn=getConnection;
₪cn.setAutoCommit(false);
₪//JDBC调用相关的SQL语句
₪mit();
₪下面的代码不会对数据库产生任何效果:
₪sessionsession=session.Factory.openSession();
₪session.save(room);
₪session.close();
₪如果要使代码真正作用到数据库,必须显示地调用Transaction指令:
₪Sessionsession=sessionFactory.openSession();
₪Transactiontx=sessio.beginTransaction();
₪session.save(room);
₪mit();
₪session.close();
₪2.基于JTA的事务管理概念
₪JTA(JavaTransactionAPI)是由JavaEETransactionManager去管理的事务。
其最大的特点是调用UserTransaction接口的begin、commit和rollback方法来完成事务范围的界定、事务的提交和回滚。
JTA可以实现统一事务对应不同的数据库。
₪JTA主要用于分布式的多个数据源的两阶段提交的事务,而JDBC的Connection提供单个数据源的事务。
后者因为只涉及一个数据源,所以其事务可以由数据库自己单独实现。
而JTA事务因为其分布式和多数据源的特性,不可能由任何一个数据源实现事务。
因此,JTA中的事务是由“事务管理器”实现的。
它会在多个数据源之间统筹事务,具体使用的技术就是所谓的“两阶段提交”。
₪3.锁
₪业务逻辑的实现过程中,往往需要保证数据访问的排他性。
如在金融系统的日终结算处理中,希望对某个结算时间点的数据进行处理,而不希望在结算过程中(可能是几秒,也可能是几个小时),数据再发生变化。
此时,需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制就是所谓的“锁”,即给选定的目标数据上锁,使其无法被其他程序修改。
₪Hibernate支持两种锁机制,悲观锁(PessimisticLocking)和乐观锁(OptimisticLocking)。
₪18DAO模式
₪DAO是DataAccessObject数据访问接口,既然是对数据的访问,顾名思义就是与数据库打交道。
₪为了建立一个健壮的JavaEE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。
用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。
在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储,这就是DAO模式。
Struts2自定义拦截器
•截拦器是Struts2中最重要的概念之一,Struts中有80%的功能都通过截拦器实现
•截拦器意义:
–提供更高层次的解耦,无须侵入框架本身便可以添加新的功能.
•截拦器是AOP的一种实现,底层通过动态代理模式完成
•将一些功能放到截拦器,可以降低Action的复杂性,提高重用性.
–截拦器的典型使用
•封装请求参数
•文件上传
•异常处理
•......
•拦截器是Action的截拦器是拦截Action动作的!
!
!
•如果没有为Action指定截拦器,则使用defaultStack作为默认截拦器
–下面的功能由默认截拦器提供
•请求参数封装
•文件上传
•类型转换异常处理
•一旦为Action指定了截拦器,则默认截拦器不再起作用,必须显示指定默认截拦器.
•截拦器是一个继承自AbstractInterceptor抽象类或实现Interceptor接口的类,可以重写的方法:
–publicvoidinit():
执行初始化动作
–publicvoiddestroy():
执行销毁动作
–Stringintercept(ActionInvocationinvocation):
执行截拦动作
•参数invocation:
包含了Action的引用,invocation.invoke()方法用于将控制权转给下一个截拦器或者调用Action的execute()方法.
•返回值为逻辑视图
AbstractInterceptor为init和destroy方法提供了默认实现.
要自定义拦截器需要实现
com.opensymphony.xwork2.interceptor.Interceptor接口:
publicclassMyInterceptorimplementsInterceptor{
publicvoiddestroy(){
}
publicvoidinit(){
}
publicStringintercept(ActionInvocationinvocation)throwsException{
System.out.println("进入拦截器");
if(session里存在用户){
Stringresult=invocation.invoke();
}else{
return“logon”;
}
//System.out.println("返回值:
"+result);
//returnresult;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- web 编程 技术