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中
*/