controller

controller是一个真正处理请求,调用service层的组件
它的特点是在类前有@Controller注解,在方法前有@RequestMapping(url)注解指示若前端请求路径与该方法相同,则该请求就交给该方法处理。

因为controller层调用service层,因此在controller类中必须有对应service类对象这个属性,我们要通过@Autowired将其注入,而且要使用@Qualifier指定是哪个bean,这个bean在spring的配置文件中找,如:

//controller调用service层
    @Autowired
    @Qualifier("bookServiceImpl")
    private BookService bookService;

在本项目中,BookController如下定义:

package com.controller;

import com.service.BookService;
import com.service.BookServiceImpl;
import com.vo.Books;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {


    //controller调用service层
    @Autowired
    @Qualifier("bookServiceImpl")
    private BookService bookService;

    public void setBookService(BookService bookService) {
        this.bookService = bookService;
    }

    @RequestMapping("/test1")
    @ResponseBody
    public  String test1(){
        return "test BookController";
    }


    //查询所有书籍,并且将结果展示在allBook页面
    @RequestMapping("/allBook")
    public String queryAllBook(Model model){
        List<Books> list = bookService.queryAllBooks();
        model.addAttribute("list",list);
        return "allBook";
    }

    ///增加书籍,跳转到增加书籍页面
    @RequestMapping("toaddBook")
    public String toAddBook(){
        return "addBook";
    }
    //处理增加书籍的请求
    @RequestMapping("/addBook")
    public String addBook(Books books){
        bookService.addBook(books);
        return "redirect:/book/allBook";

    }

    //更新书籍,跳转到更新书籍的页面,这上一个页面来自于allBook.jsp
    @RequestMapping(value = "/updateBookPage",method= RequestMethod.GET)
    public String toUpdateBook(int id,Model model){
        //id用于接收传过来的书籍ID
        Books book = bookService.queryBookById(id);
        model.addAttribute("Book",book);

        return "updatePage";

    }
    //处理更新书籍的请求
    @RequestMapping("updateBook")
    public String updateBook(Books book){
        bookService.updateBook(book);
        return "redirect:/book/allBook";

    }

    //删除一本书,采用rest ful风格
    @RequestMapping("deleteBook/{bookID}")
    public String deleteBook(@PathVariable("bookID") int id){
        bookService.deleteBookById(id);
        return "redirect:/book/allBook";
    }

    //根据书名查询书籍
    @RequestMapping("queryBookByName")
    public String queryBookByName(String queryBookName,Model model){
        List<Books> list = bookService.queryBookByName(queryBookName);
        model.addAttribute("list",list);
        //return "queryBook";
        return "allBook";

    }

}

controller的一些技术总结

1.rest ful风格

  • 可以使用Rest Ful风格设计controller,这个风格市是指使用GET方式请求时,不会把参数名展示出来,而是通过其相对位置判断参数。比如一个前端请求url=localhost:8080/request/12/hrn,controller中的requestMapping("/request/{id}/{name}).那就是说明跟在请求之后的第一个参数名是id.x
  • 相比于传统的GET请求url=localhost:8080/request?id=12&name=hrn, 更加安全和高效一些。
  • 并且可在方法的参数列表中使用@PathVariable(url中的参数名)将url中的值指定给方法的特定参数,可以实现url中的参数名和方法中参数列表的参数名不一致。
  • 一个Rest Ful风格的方法如下:
@RequestMapping("deleteBook/{bookID}")
    public String deleteBook(@PathVariable("bookID") int id){
        bookService.deleteBookById(id);
        return "redirect:/book/allBook";
    }

2.接收参数

  • 后端接收前端参数有两种,一种是使用HttpServletRequest类的对象,该对象有一个方法:getParameter(name),可获取前端组件中name属性的值。
  • 另一种方法,也是最常用的方法是采用方法的参数列表名和前端组件的name属性同名的方式获取。也就是说如果前端有一个组件其name属性的值和方法的某一个参数的名一样,那就把这个前端组件的值给到这个方法。
  • 比如:
# 前端组件
<input type=’text' name='sex'/>

#后端的方法
public String getSex(String sex){}

当该前端提交给到该方法时,前端的<input>组件的name属性为'sex'和
后端的方法的参数String sex 值一样,
那么前端的<input>标签中的值就给到这个 String sex.
  • 如果后端方法中的参数是一个对象,那么也要保证对象中的属性名和前端组件的name属性相同。

3.传递参数和页面给视图解析器

  • controller是做数据处理的,它还要把处理好的数据和视图交给视图解析器进行渲染,才能返回给前端。
  • controller传递数据采用Model类的对象,指定页面采用返回页面的名字来实现
  • 如下面就是一个例子;
@RequestMapping("queryBookByName")
    public String queryBookByName(String queryBookName,Model model){
        List<Books> list = bookService.queryBookByName(queryBookName);
        model.addAttribute("list",list);
        //return "queryBook";
        return "allBook";
    }
   /**
   在参数列表中加上一个Model类对象,使用model.addAttribute('name',value)
   来将一个值放入模型中,前端页面就能根据其'name'来使用它。
   return "allBook";通过返回页面名字的方式指定页面,其经过视图解析器之后,就能知道这个页面的完整路径和名字。
   */

4.重定向

  • 重定向发生在当前页面处理不了,需要转到另一个页面进行处理
  • 比如网站首页的跳转 登录,或者跳转注册。
  • 重定向一般不传送数据,只是调转到其他页面或者请求之中,一个典型的例子如下:
@RequestMapping("/addBook")
    public String addBook(Books books){
        bookService.addBook(books);
        return "redirect:/book/allBook";
    }
    /**
    在返回中,加上  redirect:   ,使其跳转到新的请求--/book/allBook中
    */