package com.bjsxt.boot.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bjsxt.boot.dao.UserDao;
import com.bjsxt.boot.pojo.User;
/**
* 实现Restful风格开发的控制器。
* 在真实的项目开发中,很可能将业务处理控制方法,和页面跳转控制方法分离在不同的控制器类中。
* 在页面跳转的控制器中,使用@Controller注解描述类型。处理非Restful风格的请求。
* 在业务处理的控制器中,使用@RestController注解描述类型。可以省略每个控制方法上必须定义的@ResponseBody注解的定义。
*
* 在商业项目中,几乎没有使用绝对的Restful风格开发的代码。
* 因为Restful风格开发的代码,在处理响应的时候,不是绝对的对和错。是有很多不同的状态码实现响应通知的。
* 商业项目中,都是传统开发模式+Restful风格实现的。Restful向传统开发模式低头了。
*/
@Controller
public class UserController {
@Autowired
private UserDao userDao;
/**
* 使用Restful风格实现的。
* 返回结果,是不需要转换为JSON字符串的。
* @return
*/
@GetMapping("/toSavePage")
public String toSavePage(){
return "saveUser";
}
/**
* Restful
* 处理POST请求的,使用PostMapping注解即可。
* @param user
* @return
*/
@PostMapping("/saveUser")
public String save(User user){
this.userDao.save(user);
return "index";
}
@GetMapping("/toQueryPage")
public String toQueryPage(){
return "queryUser";
}
/**
* Restful
* 同步请求。未实现AJAX异步请求。
* 请求参数的传递,是使用Restful风格。
* @PathVariable 注解是必要的,需要识别路径地址中传递的请求参数,必须使用@PathVariable。
* 因为请求参数是请求路径URL的一部分,这一部分URL是使用变量定义的方式来描述的,语法是{变量名}
* 向识别URL中的变量信息,则必须使用@PathVariable注解。
* @return
*/
@GetMapping("/queryUser/{name}/{age}/{page}/{size}")
public String queryUser(
@PathVariable("name") final String name,
@PathVariable("age") final Integer age,
@PathVariable("page") int page,
@PathVariable("size") int size,
Model model){
Pageable pageable = new PageRequest(page-1, size);
Page<User> pages = null;
if((null != name && !"".equals(name.trim())) || age != 0){
pages = this.userDao.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<>();
if(null != name && !"".equals(name)){
list.add(cb.equal(root.get("name"), name));
}
if(age != 0){
list.add(cb.equal(root.get("age"), age));
}
Predicate[] ps = new Predicate[list.size()];
return cb.and(list.toArray(ps));
}
}, pageable);
}else{
pages = this.userDao.findAll(pageable);
}
model.addAttribute("pages", pages);
model.addAttribute("list", pages.getContent());
model.addAttribute("totalElements", pages.getTotalElements());
model.addAttribute("totalPages", pages.getTotalPages());
return "queryUser";
}
@GetMapping("/toModifyPage")
public String toModifyPage(Long id, Model model){
User user = this.userDao.findOne(id);
model.addAttribute("user", user);
return "modifyUser";
}
/**
* Restful风格
* PUT请求实现修改逻辑, PUT请求默认来说,不是所有的浏览器都支持的。
* 建议使用AJAX发起请求。否则很可能出现问题。<form method="PUT" /> 很可能无效。
* @param user
* @return
*/
@PutMapping("/modifyUser")
@ResponseBody
public Object modifyUser(User user){
this.userDao.save(user);
Map<String, Object> result = new HashMap<>();
result.put("status", 200);
return result;
}
/**
* Restful风格
* 处理delete请求的。使用ajax发起请求。
* delete请求处理成功后的返回结果中,返回的响应对象中,是不包含响应体的。
* 删除请求中,如果执行错误了。是直接抛出异常的。
* @param id
* @return
*/
@DeleteMapping("/delete/{id}")
public String delete(@PathVariable("id") Long id){
this.userDao.delete(id);
return "redirect:/queryUser";
}
@RequestMapping(value={"/", "/index", "/default"})
public String showIndex(){
return "index";
}
}
网友评论