springboot+restful+jpa示例

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 pages = null;
        if((null != name && !"".equals(name.trim())) || age != 0){
            pages = this.userDao.findAll(new Specification() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
                    List 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发起请求。否则很可能出现问题。
很可能无效。 * @param user * @return */ @PutMapping("/modifyUser") @ResponseBody public Object modifyUser(User user){ this.userDao.save(user); Map 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"; } }

你可能感兴趣的:(springboot+restful+jpa示例)