业务类设计
- 问题: 为什么不直接使用 Dao 类而是还要在上面封装一层 Service 层呢?
- 回答:
基于责任分离的原则,Dao 层就应该专注于对数据库的操作,而在 Service 层我们可以增加一些非 CRUD 的方法去更好的完成本身抽离出来的 service 服务(业务处理)。
在【com.ray.service】包下创建【StudentService】接口:
/**
* @author Ray
* @date 2018/6/23 0023
*/
public interface StudentService {
/**
* 查询所有学生信息
*/
List<Student> selectByStudent();
/**
* 根据编号查询学生信息
*/
Student selectByKey(@Param("id") int id);
/**
* 根据学号查询学生信息
*/
Student selectByStuId(@Param("stu_id") int stu_id);
/**
* 新增学生信息
*/
void insert(Student student);
/**
* 修改学生信息
*/
void update(Student student);
/**
* 删除学生信息
*/
void delete(@Param("id") int id);
/**
* 获取学生数量
*/
int getStudentNum();
/**
* 根据学生数量分页
*/
List<Student> getPageStudent(int pageNum, int pageSize);
/**
* 导出学生信息
*/
InputStream getInputStream() throws Exception;
}
在【com.ray.service】包下创建【UserService】接口:
/**
* @author Ray
* @date 2018/6/23 0023
*/
public interface UserService {
/**
* 根据用户名查询用户信息
*/
User selectByName(String username);
/**
* 新增用户信息
*/
void insert(User user);
/**
* 验证用户信息
*/
User checkLogin(String username, String password);
}
在【com.ray.service.impl】包下创建【StudentServiceImpl】:
/**
* @author Ray
* @date 2018/6/23 0023
*/
@Service("StudentService")
public class StudentServiceImpl implements StudentService {
@Resource
private StudentDao studentDao;
@Override
public List<Student> selectByStudent() {
List<Student> students = studentDao.selectByStudent();
return students;
}
@Override
public Student selectByKey(int id) {
Student student = studentDao.selectByKey(id);
return student;
}
@Override
public Student selectByStuId(int stu_id) {
Student student = studentDao.selectByStuId(stu_id);
return student;
}
@Override
public void insert(Student student) {
studentDao.insert(student);
}
@Override
public void update(Student student) {
studentDao.update(student);
}
@Override
public void delete(int id) {
studentDao.delete(id);
}
@Override
public int getStudentNum() {
List<Student> studentList = studentDao.selectByStudent();
return studentList.size();
}
@Override
public List<Student> getPageStudent(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize); // 分页核心代码
List<Student> studentList = studentDao.selectByStudent();
return studentList;
}
@Override
public InputStream getInputStream() throws Exception {
// 导出表的列名
String[] title = new String[]{"编号", "学号", "姓名", "年龄", "科目"};
// 获取所有学生信息
List<Student> list = studentDao.selectByStudent();
// 每行作为一个Object对象
List<Object[]> dataList = new ArrayList<Object[]>();
for(int i = 0; i < list.size(); i++){
Object[] objects = new Object[5];
objects[0] = list.get(i).getId();
objects[1] = list.get(i).getStu_id();
objects[2] = list.get(i).getStu_name();
objects[3] = list.get(i).getStu_age();
objects[4] = list.get(i).getStu_major();
dataList.add(objects);
}
WriteExcel ex = new WriteExcel(title, dataList);
InputStream in;
// 导出数据
in = ex.export();
return in;
}
}
在【com.ray.service.impl】包下创建【UserServiceImpl】:
/**
* @author Ray
* @date 2018/6/23 0023
*/
@Service("UserService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public User selectByName(String username) {
User user = userDao.selectByName(username);
return user;
}
@Override
public void insert(User user) {
userDao.insert(user);
}
@Override
public User checkLogin(String username, String password) {
User user = userDao.selectByName(username);
if(user != null && user.getPassword().equals(password)){
return user;
}
return null;
}
}
功能开发
在【com.ray.controller】包下创建【StudentController】控制器:
/**
* @author Ray
* @date 2018/6/23 0023
*/
@Controller
@RequestMapping("/stu")
public class StudentController {
@Resource
private StudentService studentService;
/**
* 显示学生信息列表页面
*/
@RequestMapping(value = "/student/stuList" , method = RequestMethod.GET)
public String stuList(HttpServletRequest request){
HttpSession session = request.getSession();
if(session.getAttribute("username") != null){
return "/student/studentList";
}
return "redirect:/user/login";
}
/**
* 显示所有学生信息列表 + 分页
*/
@RequestMapping(value = "/stuList", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public StudentGrid getStuList(@RequestParam("current") int current, @RequestParam("rowCount") int rowCount){
// 获取学生数量
int total = studentService.getStudentNum();
// 包含学生信息 + 分页
List<Student> studentList = studentService.getPageStudent(current, rowCount);
StudentGrid studentGrid = new StudentGrid();
// 当前页面号
studentGrid.setCurrent(current);
// 每页行数
studentGrid.setRowCount(rowCount);
// 学生信息
studentGrid.setRows(studentList);
//总行数
studentGrid.setTotal(total);
return studentGrid;
}
/**
* 根据 id 获取学生信息
*/
@RequestMapping(value = "/getStuInfo", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public Student getStuById(@RequestParam("id") int id){
Student student = studentService.selectByKey(id);
return student;
}
/**
* 修改学生信息(使用构造器)
*/
@RequestMapping(value = "/updateStu", method = RequestMethod.POST)
public String update(@RequestParam("id") int id,
@RequestParam("stu_id") int stu_id,
@RequestParam("stu_name") String stu_name,
@RequestParam("stu_age") int stu_age,
@RequestParam("stu_major") String stu_major){
Student student = new Student(id, stu_id, stu_name, stu_age, stu_major);
studentService.update(student);
return "redirect:student/stuList";
}
/**
* 删除学生信息(id)
*/
@RequestMapping(value = "/delStu", method = RequestMethod.POST)
public String delete(@RequestParam("id") int id){
System.out.println("del_id: " + id);
studentService.delete(id);
return "redirect:student/stuList";
}
/**
* 新增学生信息
*/
@RequestMapping(value = "/addStu", method = RequestMethod.POST)
public String add(@RequestParam("stu_id") int stu_id,
@RequestParam("stu_name") String stu_name,
@RequestParam("stu_age") int stu_age,
@RequestParam("stu_major") String stu_major,
HttpServletRequest request){
if(studentService.selectByStuId(stu_id) == null) {
Student student = new Student(stu_id, stu_name, stu_age, stu_major);
studentService.insert(student);
HttpSession session = request.getSession();
System.out.println("新增学生成功");
return "redirect:student/stuList";
}
System.out.println("新增学生失败");
return "redirect:student/stuList";
}
/**
* 导出学生信息 Excel
*/
@RequestMapping("/exportStu")
public void export(HttpServletResponse response) throws Exception {
InputStream is = studentService.getInputStream();
// 使客户端浏览器 区分不同种类的数据, 并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
// Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。
response.setHeader("Content-Disposition", "attachment;filename=AllStudents.xls");
ServletOutputStream output = response.getOutputStream();
IOUtils.copy(is, output);
}
}
在【com.ray.controller】包下创建【UserController】控制器:
/**
* @author Ray
* @date 2018/6/23 0023
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String login(){
return "user/login";
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String register(){
return "user/register";
}
@RequestMapping(value = "/loginValidate" ,method = RequestMethod.POST)
public String loginValidate(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session){
if(username == null || password == null){
return "user/login";
}else{
User user = userService.selectByName(username);
// System.out.println("login_user:" + user);
System.out.println("session_username: " + session.getAttribute("username"));
if(user != null && user.getPassword().equals(password)){
session.setAttribute("username", username);
return "redirect:/stu/student/stuList";
}else{
return "user/login";
}
}
}
@RequestMapping(value = "logout")
public String logout(HttpSession session){
session.removeAttribute("username");
return "redirect:/user/login";
}
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@RequestParam("username")String username,
@RequestParam("password")String password){
// 检测用户是否存在
User user = userService.selectByName(username);
if(user == null){
user = new User(username, password);
userService.insert(user);
System.out.println("注册成功");
return "redirect:/user/login";
}
System.out.println("注册失败,用户已存在");
return "redirect:/user/register";
}
}
分页功能
- 首先在 Packge【com.ray.entity】包下创建一个 StudentGrid 工具类:
/**
* @author Ray
* @date 2018/6/23 0023
* 当使用 @XmlRootElement 注释对顶层类或枚举类型进行注释时,类型值被表示为 XML 文档中的 XML 元素
*/
@XmlRootElement
public class StudentGrid {
private int current; // 当前页面号
private int rowCount; // 每页行数
private int total; //总行数
private List<Student> rows; //学生信息
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
this.current = current;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<Student> getRows() {
return rows;
}
public void setRows(List<Student> rows) {
this.rows = rows;
}
}
导出Excel功能
- 首先在 Packge【com.ray.util】包下创建一个 WriteExcel 工具类:
/**
* @author Ray
* @date 2018/6/24 0024
*/
public class WriteExcel {
// 导出表的列名
private String[] rowName;
// 每行作为一个Object对象
private List<Object[]> dataList = new ArrayList<Object[]>();
// 构造方法, 传入要导出的数据
public WriteExcel(String[] rowName, List<Object[]> dataList) {
this.dataList = dataList;
this.rowName = rowName;
}
/**
* 导出数据
*/
public InputStream export() throws Exception {
// 创建工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建工作表
HSSFSheet sheet = workbook.createSheet("sheet1");
//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象
HSSFCellStyle style = this.getStyle(workbook); //单元格样式对象
// 定义所需列数
int columnNum = rowName.length;
// 在索引2的位置创建行(最顶端的行开始的第二行)
HSSFRow rowRowName = sheet.createRow(0);
// 将列头设置到sheet的单元格中
for (int n = 0; n < columnNum; n++) {
//创建列头对应个数的单元格
HSSFCell cellRowName = rowRowName.createCell(n);
//设置列头单元格的数据类型
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
//设置列头单元格的值
cellRowName.setCellValue(text);
//设置列头单元格样式
cellRowName.setCellStyle(columnTopStyle);
}
//将查询出的数据设置到sheet对应的单元格中
for (int i = 0; i < dataList.size(); i++) {
//遍历每个对象
Object[] obj = dataList.get(i);
//创建所需的行数
HSSFRow row = sheet.createRow(i + 1);
for (int j = 0; j < obj.length; j++) {
//设置单元格的数据类型
HSSFCell cell = null;
cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
if (!"".equals(obj[j]) && obj[j] != null) {
//设置单元格的值
cell.setCellValue(obj[j].toString());
}
//设置单元格样式
cell.setCellStyle(style);
}
}
//让列宽随着导出的列长自动适应
for (int colNum = 0; colNum < columnNum; colNum++) {
int columnWidth = sheet.getColumnWidth(colNum) / 256;
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
HSSFRow currentRow;
//当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(colNum) != null) {
HSSFCell currentCell = currentRow.getCell(colNum);
if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) {
columnWidth = length;
}
}
}
}
if (colNum == 0) {
sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
} else {
sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
}
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
workbook.write(os);
} catch (IOException e) {
e.printStackTrace();
}
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
return is;
}
/**
* 列头单元格样式
*/
public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short) 11);
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列数据信息单元格样式
*/
public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)10);
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
}