MarK’s Blog

Rules for happiness: something to do, someone to love, something to hope for.

SpringMVC实战

| Comments


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的设计模式中,这三层又分别对应着ViewControllerModel。而我们一般情况下建立的program都不会是像blog这种静态的网站,而是响应式的网页。那么既然是响应式的网页,不同的层次之前如何传递数据就是我们最关注的点。

我们知道业务逻辑层与数据链路层之间,我们通过JDBCEJB(Enterprise Java Bean)的方式来传递我们的数据。当然我们也可以用Hibernate代替传统的JDBC,在后面我们也会选重点介绍一个Hibernate。

那么,我们表现层与业务逻辑层之间又要通过什么样的方式来传递数据,我们知道标准的MVC模式里,我们是通过request对象来做数据交换的。但在SpringMVC中,框架为我们提供了基于request对象之上的方式来交换数据,当然你仍可以通过SpringMVC中获取request对象的方法来得到request对象之后,像以往那样传递数据。但SpringMVC提供了各式各样,用于不同情形的数据交换方式,为我们提供了更加方便的方法。现面我们逐一介绍,

1. 普通参数

我们知道,向Controller传值的方式一般有两种,URLForm表单。那么我们就先从普通参数的方式开始介绍。

1.Form表单,POST方法,例如,

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value="/login",method=RequestMethod.POST)

public String login(String username,String password){

   /*
    * to do
    */
    
   return "user";
}

在这里我们不需要像普通的Servlet中,通过request.getParameter的方法来逐一的获取form表单里的元素的值,我们只需要让函数参数的名称与form表单里元素的name属性相同,就可以直接得到form表单里元素的值,然后在controller的方法里使用。

2.Form表单 或 URL?username=xxxx 方式,例如,

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/test")

public String login(@RequestParam("username") String name){

   /*
    * to do
    */
         
   return "user";
}

这里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
//页面元素
<form action="add" method="POST">
   <input name="id"><br/>
   <input name="name"><br/>
   <input name="password"><br/>
   <input name="nickname"><br/>
   <input name="email"><br/>
   <input type="submit" value="添加">
</form>


//controller中函数

@RequestMapping(value="/add",method= RequestMethod.POST)
public String add(@ModelAttribute("user") User user){
    /*
     *  to do
     */
    return "redirect:/user/users";
}

注意:我们页面里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
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public String show(@PathVariable String name, Model model) {
      /*
     * to do
     */
     return "show";
}

4. contoller处理之后,该值要在页面中使用

我们就只介绍一个SpringMVC中提倡的一种方法,在函数参数中加入一个参数类型为Model的参数,如下,

1
2
3
4
5
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String list(Model model) {
   model.addAttribute("users", users);
   return "list";
}

然后,我们在页在中通过${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
String _publisher = "mark";
String hql = "from Books where publisher_name = ?";
Query q = sessionFactory.getCurrentSession().createQuery(hql);
q.setString(0, _publisher);
return q.list();

2. 通配符的查询方法

仍以查询为例,

1
2
3
4
5
String _publisher = "mark";
String hql = "from Books where publisher_name = :m";
Query q = sessionFactory.getCurrentSession().createQuery(hql);
q.setString("m", _publisher);
return q.list();

Demo2,敬请期待…

Comments

返回顶部