Demo_One
这个demo是在此前EnterpriseJavaEE-Test1的基础上,利用Spring+SpringMVC+Hibernate框架重新完成相同的功能点。完成之后,可以感觉到使用了框架之后,项目的层次感更加明显,做到了高内聚、低耦合的要求。
实战需求:https://github.com/MarK-YANG/EnterpriseJavaEE-Test1/tree/master/BookStore
实战源码:https://github.com/MarK-YANG/EnterpriseJavaEE-Test1/tree/master/BooksWithSpringMVC
在开始第二个demo之前,先介绍几个必备的知识点,如果想快速的开始基于Spring+SpringMVC+Hibernate
框架的项目开发,以下的几点是一定要掌握的。
下面的几条关于此框架功能实现上的介绍,可以使你快速的了解开发过程,更快的上手。
传统的B/S架构的Web应用,我们一般可以把它分为表现层
、业务逻辑层
、数据链路层
三层。然后在MVC
的设计模式中,这三层又分别对应着View
、Controller
和Model
。而我们一般情况下建立的program都不会是像blog这种静态的网站,而是响应式
的网页。那么既然是响应式的网页,不同的层次之前如何传递数据就是我们最关注的点。
我们知道业务逻辑层与数据链路层之间,我们通过JDBC
和EJB(Enterprise Java Bean)
的方式来传递我们的数据。当然我们也可以用Hibernate
代替传统的JDBC
,在后面我们也会选重点介绍一个Hibernate。
那么,我们表现层与业务逻辑层之间又要通过什么样的方式来传递数据,我们知道标准的MVC模式里,我们是通过request对象来做数据交换的。但在SpringMVC中,框架为我们提供了基于request对象之上的方式来交换数据,当然你仍可以通过SpringMVC中获取request对象的方法来得到request对象之后,像以往那样传递数据。但SpringMVC提供了各式各样,用于不同情形的数据交换方式,为我们提供了更加方便的方法。现面我们逐一介绍,
1. 普通参数
我们知道,向Controller传值的方式一般有两种,URL
和Form
表单。那么我们就先从普通参数的方式开始介绍。
1.Form表单,POST方法,例如,
1 2 3 4 5 6 7 8 9 10 |
|
在这里我们不需要像普通的Servlet中,通过request.getParameter
的方法来逐一的获取form表单里的元素的值,我们只需要让函数参数的名称
与form表单里元素的name属性
相同,就可以直接得到form表单里元素的值,然后在controller的方法里使用。
2.Form表单 或 URL?username=xxxx 方式,例如,
1 2 3 4 5 6 7 8 9 10 |
|
这里RequestParam()
中的字符串应该与URL中传入的参数的名称或Form表单中对应元素的name属性的值相同,在此之后,字符串name就是我们得到的想要的参数的值。
但要注意的是运用此方式传值时,对应的参数的值不能为空,如果传入的URL中参数的值为空时,会报错。
2. 对象参数
对象参数的方式是通过页面直接提取对象数据,举一个简单的例子,我们对user这个对象进行提取,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
注意:我们页面里input元素中的name属性中的id,name…都是直接对应contorller add方法里@ModelAttribute
的参数user对象的属性字段
,必须一致,不可不同。
3. REST风格参数的传递
我们举例说明,如:http://localhost:8080/springmvc/user/mark , 在这个URL中我们需要把mark作为参数进行传递,我们使用REST风格的方式,使用value = “/{name}” ,并添加@PathVariable注释的方法来传递参数值。
1 2 3 4 5 6 7 |
|
4. contoller处理之后,该值要在页面中使用
我们就只介绍一个SpringMVC中提倡的一种方法,在函数参数中加入一个参数类型为Model
的参数,如下,
1 2 3 4 5 |
|
然后,我们在页在中通过${key}
(key为model里键的名称)就可以使用model里的值了。
我们就简单的介绍一下Hibernate中的CRUD操作,其他的更深层的东西,我们暂不介绍,而且在这里我们暂且认为以下的代码是在你已成功获得了SessionFactory的前提下进行的。
1. Create
最简单,最方便的方法就是sessionFactory.getSession().save(Entity
)的方式,我们只需要把实例化好的且设置好数据的Entity通过save()的方法就可以存入到数据库中,这里要注意的地方有,Entity必需是与Hibernate关联在一起的EJB的class的一个实例
,这个class其首先要与Hibernate关联在一起,然后其中每个属性都与数据库中该表各字段相同。
2. Retrieve
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Entity
.class);
return criteria.list();
注意的是,这里的Entity和上面的相同,都并必是与Hibernate关联,且属性与数据库该表各字段相同的EJB的class的名称
。
然后criteria.list()会返回一个用List封装好的,每项都为该EJB的一个实例的一个链表。
3. Update
Update与Save的方式相似,是用sessionFactory.getSession().update(Entity
)的方式,这里的Entity和上面的相同,都并必是与Hibernate关联,且属性与数据库该表各字段相同的EJB的class的一个实例
。
4. Delete
Delete的方法也是如此,是用sessionFactory.getSession().delete(Entity
)的方式,这里的Entity和上面的相同,都并必是与Hibernate关联,且属性与数据库该表各字段相同的EJB的class的一个实例
。
除此之外,我们再介绍一下Hibernate通过另外两种方式对数据库进行存取的操作,
1. HQL语句的方式
以查询为例,
1 2 3 4 5 |
|
2. 通配符的查询方法
仍以查询为例,
1 2 3 4 5 |
|
Demo2,敬请期待…