SSM框架整合(基本CRUD+分页+Excel导入导出)

前言

之前学习了SSM(Spring+SpringMVC+Mybatis),一直想自己弄一个小项目自己来写一下,最近写了一个,该项目使用Maven进行依赖包管理,使用MySQL5.6数据库实现了一个管理系统的基础功能。

项目源代码GitHub地址:https://github.com/lonecloud/ssm-student

(如果喜欢,可以点一个Star又不会怀孕,大家有什么好的意见,可以pull request一下啦)

如果有什么问题,也欢迎加入QQ群一起交流啦:416052025


技术栈:

  • JDK 1.8
  • (SSM) -> Spring,SpringMVC,Mybatis
  • BootStrap,JQuery,Bootstrap-table
  • POI
  • Maven
  • SLF4J

已经实现的功能:

  • 用户登录注册
  • 学生信息的增删改查(CRUD)
  • 学生数据的Excel导入导出

后期添加功能:

  • 前后端分离
  • 邮件系统
  • 注册认证
  • 短信API接入
  • ……不仅仅局限于这些

项目结构

SSM框架整合(基本CRUD+分页+Excel导入导出)_第1张图片

目录结构

java

  • common:基础通用类
  • controller:控制层
  • cts:常量类
  • dao:DB仓库层
  • exception:自定义异常
  • filter:过滤器
  • pojo:实体对象
  • service:业务服务层
  • util:工具类层
  • vo:view-Objct:页面交互对象

resource

  • mapper:存放mybatis的xml映射文件
  • appliactionContext.xml:Spring总配置文件
  • appliactionContext-datasource.xml:数据配置文件
  • appliactionContext-mvc.xml:Spring mvc配置文件
  • datasource.properties 数据库配置文件
  • generatoorConfig.xml:生成mybatis的xml映射时候的配置文件
  • logback.xml:日志配置文件

webapp

  • assets:静态文件目录
  • WEB-INF
    • pages:页面文件
    • web.xml:tomcat的配置文件
  • index.jsp:引入的入口文件

pom.xml:Maven配置文件

基本代码演示

SSM框架整合(基本CRUD+分页+Excel导入导出)_第2张图片
登录代码:

    /**
     * 登录认证
     * @param username
     * @param password
     * @param session
     * @param attributes
     * @return
     */
    @PostMapping("doLogin")
    public String doLogin(String username, String password, HttpSession session, RedirectAttributes attributes){
        try {
            User user=userService.login(username,password);
            session.setAttribute(Constants.CURRENT_USER,user);
            return "redirect:/student/list";
        }catch (Exception e){
            if (e instanceof BusinessException){
                logger.debug(e.getMessage());
                attributes.addAttribute("msg",e.getMessage());
            }
            logger.error(e.getStackTrace().toString(),e.getMessage());
        }
        return "redirect:login";
    }

SSM框架整合(基本CRUD+分页+Excel导入导出)_第3张图片
注册:

    /**
     * 注册认证
     * @param user
     * @param attributes
     * @return
     */
    @PostMapping("/doRegister")
    public String doRegister(User user,RedirectAttributes attributes){
        try {
            User registerUser=userService.register(user);
        }catch (Exception e){
            if (e instanceof BusinessException){
                attributes.addAttribute("msg",e.getMessage());
                return "redirect:register";
            }
        }
        return "redirect:login";
    }

student页面
SSM框架整合(基本CRUD+分页+Excel导入导出)_第4张图片

添加页面
SSM框架整合(基本CRUD+分页+Excel导入导出)_第5张图片
导入页面
SSM框架整合(基本CRUD+分页+Excel导入导出)_第6张图片

    /**
     * 导入
     *
     * @param file
     * @return
     */
    @PostMapping("/import")
    //@ResponseBody
    public String importStudent(MultipartFile file) {
        //文件上传后处理文件
        R r = studentService.importStudentExcel(file);
        return "redirect:/student/list";
    }

导出页面
SSM框架整合(基本CRUD+分页+Excel导入导出)_第7张图片

    /**
     * 导出
     *
     * @param request
     * @return
     * @throws IOException
     */
    @GetMapping("/export")
    public ResponseEntity<byte[]> exportStudent(HttpServletRequest request) throws IOException {
        File file = studentService.exportStudent();
        HttpHeaders headers = new HttpHeaders();
        //下载显示的文件名,解决中文名称乱码问题
        String downloadFilelName = new String(file.getName().getBytes("UTF-8"), "iso-8859-1");
        //通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFilelName);
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                headers, HttpStatus.CREATED);
    }

excel解析工具类

package cn.lonecloud.student.util;

import com.google.common.collect.Lists;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @author lonecloud
 * @version v1.0
 * @date 2017/10/21
 */
public class ExcelUtils {

    private static final String XLS="xls";
    private static final String XLSX="xlsx";

    /**
     * 导出数据
     * @param file
     * @return
     */
    public static List readExcelContent(File  file) {
        List  content = Lists.newArrayList();
        String str = "";
        POIFSFileSystem fs=null;
        HSSFWorkbook wb=null;
        HSSFSheet sheet=null;
        HSSFRow row=null;
        try {
            fs = new POIFSFileSystem(new FileInputStream(file));
            wb = new HSSFWorkbook(fs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getPhysicalNumberOfRows();
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 0; i < rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            String[] rowContents=new String[colNum];
            while (row!=null&&j < colNum) {
                rowContents[j]=getCellFormatValue(row.getCell(j));
                j++;
            }
            content.add(rowContents);
        }
        return content;
    }

    /**
     * 获取cell值
     * @param cell
     * @return
     */
    private static String getCellFormatValue(HSSFCell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
                // 如果当前Cell的Type为NUMERIC
                case HSSFCell.CELL_TYPE_NUMERIC:
                case HSSFCell.CELL_TYPE_FORMULA: {
                    // 判断当前的cell是否为Date
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // 如果是Date类型则,转化为Data格式

                        //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                        //cellvalue = cell.getDateCellValue().toLocaleString();

                        //方法2:这样子的data格式是不带带时分秒的:2011-10-12
                        Date date = cell.getDateCellValue();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        cellvalue = sdf.format(date);

                    }
                    // 如果是纯数字
                    else {
                        // 取得当前Cell的数值
                        cellvalue = String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                }
                // 如果当前Cell的Type为STRING
                case HSSFCell.CELL_TYPE_STRING:
                    // 取得当前的Cell字符串
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
                // 默认的Cell值
                default:
                    cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }

    /**
     * 导出Excel
     * @param dataList 数据
     * @param filePath 文件路径
     * @param columnNames 列名字
     * @param excludeFiledName 排除的数据值名
     * @return
     * @throws IOException
     * @throws IllegalAccessException
     */
    public static File exportExcel(List dataList, String filePath,String[] columnNames,
                                   String... excludeFiledName) throws IOException, IllegalAccessException {
        File file=new File(filePath);
        if (!file.exists()){
            file.createNewFile();
        }
        // 第一步,创建一个webbook,对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet();
        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
        HSSFRow row = sheet.createRow(0);
        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
        //设置标题信息
        for (int i = 0; i < columnNames.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(columnNames[i]);
            cell.setCellStyle(style);
        }
        for (int i = 0; i < dataList.size(); i++)
        {
            row = sheet.createRow((int) i + 1);
            Object obj = dataList.get(i);
            if (obj!=null){
                Class clazz = obj.getClass();
                Field[] declaredFields = clazz.getDeclaredFields();
                int j=0;
                for (Field field:declaredFields) {
                    if (Arrays.asList(excludeFiledName).stream().equals(field.getName())){
                        continue;
                    }
                    field.setAccessible(true);
                    Object value = field.get(obj);
                    row.createCell(j++).setCellValue(value!=null?value.toString():"-");
                }
            }
        }
        FileOutputStream fos = new FileOutputStream(file);
        wb.write(fos);
        fos.close();
        return file;
    }
}

执行

  1. 下载代码
git clone https://github.com/lonecloud/ssm-student
  1. 升级数据库运行student.sql
  2. 运行maven脚本
mvn compile
mvn tomcat7:run

访问地址:http://localhost:8080/student

你可能感兴趣的:(ssm框架整合)