基础知识:Stucts、Hibernate和Spring

MVCStruts

   

Struts是一个MVC模式的框架,主要负责HTTP请求的接收和响应工作,Spring包含了一种轻量级的容器,把程序中的功能对象组织在一起,Hibernate负责数据的存取操作,

   

Java Web开发中的两种普遍开发模式

   

模式1,模式1使用JSP+JavaBean技术将页面显示和业务逻辑分开,由JSP来显示页面,由JavaBean对象来保存数据和实现业务逻辑

   

客户端直接向JSP发出请求,JSP做出响应的请求,并调用JavaBean对象,所有的数据都通过JavaBean来处理,然后返回给JSP,由JSP生成最后的结果返回。

   

在模式1中,JSP往往会嵌入控制请求流程的代码和部分逻辑代码,如果把这部分代码提取出来,由一个单独的角色来担当,该角色就是控制器,此时就构成了模式2

   

模式2,模式2中由Servlet担当控制器的角色,它接受请求,根据请求的信息不同而将它们发送给合适的JSP页面,由各JSP页面来完成对用户的响应。这其中Servlet需要实例化一个JavaBeanJSP就可以通过使用JavaBean的相关标签(<jsp:getProperty>)来得到JavaBean的数据

   

模式2JSP负责View部分,Servlet负责Control部分,JavaBean负责Model部分

   

struts框架如何体现MVC模式的

   

strutsController是由ActionServletAction、和struts-config.xml组成,ActionServletstruts的入口,所有的请求都会通过它来处理,然后由它来决定相应的Action,可以这么说,Action代表了一次动作,而ActionServlet相当于这些动作的头头,配置文件struts-config.xml是对整个struts的控制,其中配置了ActionServlet应该把哪些请求发给哪些ActionAction处理完之后又该由哪个JSP来做响应

   

   

struts的模型是由ActionForm来实现的,有一点类似JavaBean,包含若干个可读可写的属性,用于保存数据,也有数据验证的功能,一般来说一个Action应该对应一个ActionForm

   

struts的视图是由JSP来实现的,JSP显示的数据可以由ActionForm提供,也可以由Action保存在作用范围内(包括requestsessionApplication)的数据

   

每一次HTTP请求都是这三者协作完成的,JSP代表用户看到的东西,ActionForm代表的是数据,Action代表的是业务逻辑

   

一次典型的struts请求

   

首先由浏览器客户端发送请求,请求地址默认以.do结尾,然后ServletAction接收到请求后,会根据请求的路径和参数来判断由哪个Action来处理该次请求,等到Action处理完后,通常是execute方法调用完成后,struts会根据该方法返回的ActionForward来判断由哪个JSP作为最终的响应

   

struts的配置

   

web.xml中配置ActionServlet

   

   

struts-config.xml中配置Action

   

实现ActionForm

   

   

struts-config.xml中配置ActionForm

   

   

   

实现Controller

   

实现Controller也就是实现Action类,该类位于org.apache.struts.action.Action,主要是覆盖它的execute方法,当有请求指向该Action时,struts会实例化该Action,再调用它的execute方法,execute方法中包含四个参数

   

   

ActionMapping是指该Action之后会指向的资源或视图JSP,通常会调用findForward方法来转到该资源,该方法的参数即使下一个资源的名称,下一个资源的名称和路径是在struts-config.xml中通过<forward>来配置的

   

   

   

注意:actionpath要以/开头,代表的是本应用上下文为根目录

   

struts提供的四类Action

   

Action:最普通的一类,直接使用即可

DispatchAction:表单包含多个参数时使用,根据参数的值对应方法

LookupDispatchAction:表单包含多个提交按钮时使用,需要重载getKeyMethodMap方法,返回参数与方法名之间的对应关系

MappingDispatchAction:用的不多

   

什么是ORM对象关系映射模型

   

三种数据持久化的方式:1、文本保存;2、对象序列化;3、关系数据库

   

前两种如果数据量大的话,由于I/O的速度比内存操作慢很多,会造成很大的性能问题,而第三种使用JDBC来操作数据,会存在以下几种弊端

   

1、数据操作的代码量巨大,每个操作数据的方法中,都会有打开连接、创建会话、定义SQL、设置参数、执行SQL、装填结果、关闭连接等代码

   

2、重复的装填数据操作,在SQL操作之后,往往会使用一个while循环把结果集ResultSet中的数据先装填到数据对象Data Object中,再把这些数据对象放到一个链表或其他类型的集合中,这些代码总是类似,但却只能这样做,但是这些装填操作还容易装填错误,错误还不易发现,既降低了开发效率,又不利于后续的维护

   

3Java是面向对象的语言,面向对象有关联、组合、聚合、继承、多态等关系,而关系型数据库中的数据全是表格,表格之间通过外键达到一对一、一对多以及多对多的关系,那么一旦关系复杂了,那么SQL语句就很难写了,也就是开发难度比较高,就算写好了也会增加维护的成本,也就是维护成本比较高

   

Hibernate使用的基本思想

   

HibernateJDBC进行了轻量级的封装,使得开发者可以使用面向对象的思维来操纵数据库,在HibernateAPI中,有5个重要的接口:sessionsessionFactoryconfigurationtransaction以及query

   

session,负责增删查改操作,session是非线程安全的,一般来说,一个线程包含了一个session对象

   

sessionFactory,用来创建session,一般来说,一个sessionFactory代表一个数据源

   

configuration,用于创建sessionFactory

   

transaction,事务

   

query,负责查询操作

   

Hibernate中实体的生命周期

   

Hibernate中实体的生命周期一共存在3个状态:瞬时态,持久态,托管态

   

瞬时态,对象一旦用new创建出来就是瞬时态,一般此时并没有id

   

持久态,调用sessionsave方法,对象就转换到了持久态

   

托管态,调用sessionclose方法,对象就转换到了托管态

   

Hibernate sql

   

查询

String hql="from User user where user.age=20";

List list=session.CreateQuery(hql).list;

   

更新

Transaction transaction=session.beginTransaction();

String hql="update User user set user.age=20 where user.name='admin'"

Query query=session.createQuery(hql);

int ret=query.executeUpdate();

transaction.commit();

   

属性查询

String hql="select user.name,user.age from User user";

List list=session.createQuery(hql).list;

for(int i=0;i<list.size();i++){

User user=list.get[i];

System.out.println(user.getName());

System.out.println(user.getAge());

}

   

分页查询

   

get和load的区别

   

Hibernate对于load方法去加载数据默认为数据一定在数据库中存在,所以一般可以用延迟加载,如果在使用过程中出现了问题,就会抛异常,而get方法去加重数据的话,不会默认为数据一定存在,所以如果加载过程出现了问题,则会返回null

   

一对一、一对多、多对多的关系在Hibernate中如何体现

   

一对一例子:夫妻关系

   

表结构的建立,其中外键是在妻子一方:foreign key(id) references husband(id) on delete cascade

   

   

   

此时需要完成这两个实体与表之间的映射关系,并在使用外键的那个表,也就是妻子表中的主键生成策略选择外键生成策略

   

   

一对多例子:商品与类别

   

   

   

   

   

   

多对多例子:学生老师

   

   

   

   

   

   

什么是依赖注入

   

依赖注入,指的是组件之间的依赖关系由容器在运行时决定,控制权由对象本身转向容器,由容器根据配置文件去创建实例,并创建实例之间的依赖关系。

   

Spring中依赖注入的方式有哪些

   

依赖注入的方式有两种,一种是通过setter方法注入,一种是通过构造器方法注入

   

通过setter方法注入普通类型属性

   

   

通过setter方法注入list类型属性

   

   

通过setter方法注入引用类型属性

   

   

通过构造方法注入属性

   

   

Spring中的AOP编程

   

简单来说,AOP就是一种功能比较复杂的拦截器,能够解决一些横切的问题,比如在代码真正到达目标之前,提供一些通用的中间件服务,例如记录日志等。Spring的声明式事务也就是基于AOP实现的。

   

Spring的声明式事务为普通的Java类封装事务管理,底层是用动态代理技术实现的。动态代理的一个重要特征是针对接口,所以DAO层对象要通过动态代理让Spring接管事务,就必须在DAO层对象前面抽象出一个接口。

   

通常通过TransactionProxyFactoryBean设置Spring事务代理,目标对象包装在事务代理中。当定义TransactionProxyFactoryBean时,必须提供一个相关的TransactionManager的引用和事务属性。

   

   

在配置事务管理器Bean时,往往需要指定一个数据源,比如,对于Hibernate的事务管理器可以这样来配置

   

   

   

   

Spring、struts、Hibernate的整合

   

Spring在于Hibernate整合时,Spring提供了一个sessionFactory的实现类,只需要为它指定Hibernate的配置文件路径即可

   

   

struts在处理请求时,需要创建Action对象,这些Action对象往往需要引用业务层的对象,而这些业务层的对象往往又在Spring容器中,所以Action的创建也需要交给Spring来完成,开发者需要修改struts的默认控制器,将其指定为Spring提供的控制器,在struts-config.xml中修改struts的控制器

   

   

然后再在Spring配置文件中,创建和装配Action对象

   

   

这样整合在一起之后,需要在web应用启动的时候也启动Spring容器,这个是由Spring的监听器实现的,是专门用于在web应用程序中启动IOC容器的,所以需要在web.xml中配置Spring的监听器

   

   

总结一下,关于SSH的整合主要由以下六步完成

   

1、将SSH需要用到的包都放在WEB-INF/lib文件夹下

2、完成struts的配置,包括web.xml和struts-config.xml

3、完成Hibernate的配置Hibernate.cfg.xml

4、在web.xml中为Spring配置应用程序上下文监听器

5、用Spring提供的控制器代替struts本身的控制器,在struts-config.xml中配置

6、用Spring提供的sessionFactoryBean来读取Hibernate.cfg.xml,完成Spring与Hibernate的整合

   

   

posted @ 2015-05-16 20:44  keedor  阅读(474)  评论(0编辑  收藏  举报