WebUtils.java

/**
 * @ Copyright 2001 FA Software; All right reserved. No part of this program may be reproduced or transmitted
 * in any form or by any means, electronic or mechanical, including photocopying, recording, or by any
 * information storage or retrieval system without written permission from FA Software, except for inclusion
 * of brief quotations in a review.
 */
package com.mycim.webapp;

import com.fa.sesa.i18n.I18nUtils;
import com.mycim.framework.file.excel.ex.ExcelExport;
import com.mycim.framework.utils.freemarker.FreemarkerUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.msg.JsonUtils;
import com.mycim.valueobject.NamedSpaceList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.security.User;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.TemplateException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.struts.action.ActionForward;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
import java.util.*;


/**
 * WebUtils
 *
 * @author andy <br>
 * @version 1.1 $ 2012-2-6
 */
public final class WebUtils {

    public static final ActionForward NULLActionForward = null;

    public static final String REQ_CODE = "reqCode";

    // page
    public static final String MAX_PAGE = "maxPage";

    public static final String THIS_PAGE = "thisPage";

    public static final String PAGE_SIZE = "pageSize";

    public static final Integer DEFAULT_PAGE_SIZE = 20;

    protected static final Log log = LogFactory.getLog(WebUtils.class);

    private static final String PREFIX_SEARCH = "search_";

    private static final User user = new User("SYSTEM", NamedSpaceList.USER_KEY, ObjectList.USER_KEY);

    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
                                            'f'};

    public static User getSystemUser() {
        return user;
    }

    public static void writeJson(HttpServletResponse response, String jsonBody) {
        response.setContentType("application/json;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache");
        try {
            response.getWriter().write(jsonBody);
        } catch (IOException e) {
            log.error(e);
        }
    }

    public static void redirect(HttpServletResponse response, String go) {
        try {
            response.sendRedirect(go);
        } catch (IOException e) {
            log.error(e);
        }
    }

    public static void dispatch(HttpServletRequest request, HttpServletResponse response, String go) {
        try {
            request.getRequestDispatcher(go).forward(request, response);
        } catch (Exception e) {
            log.error(e);
        }
    }

    public static void writeJs(HttpServletResponse response, String jsBody) {
        writeHtml(response,
                  (new StringBuffer("<script type='text/javascript'>")).append(jsBody).append("</script>").toString());
    }

    public static void writeHtml(HttpServletResponse response, String htmlBody) {
        response.setContentType("text/html;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache");
        try {
            response.getWriter().write(htmlBody);
        } catch (IOException e) {
            log.error(e);
        }
    }

    public static void writeTextPlain(HttpServletResponse response, String textBody) {
        response.setContentType("text/plain;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache");
        try {
            response.getWriter().write(textBody);
        } catch (IOException e) {
            log.error(e);
        }
    }

    public static String getExportType(HttpServletRequest request) {
        return getParameter("exportType", request);
    }

    /**
     * 设置page 信息
     *
     * @param nowPage   当前页
     * @param totalPage 总页数/最大页数
     * @param pageSize  展示数量
     * @param request   request
     */
    public static void setPageInfo(Integer nowPage, Integer totalPage, Integer pageSize, HttpServletRequest request) {
        if (nowPage == null) {
            nowPage = 1;
        }

        if (totalPage == null) {
            totalPage = 1;
        }

        if (pageSize == null) {
            pageSize = DEFAULT_PAGE_SIZE;
        }

        request.setAttribute(THIS_PAGE, nowPage);
        request.setAttribute(MAX_PAGE, totalPage);
        request.setAttribute(PAGE_SIZE, pageSize);
    }

    public static Integer getPageSize(HttpServletRequest request) {
        Integer pageSize = getParameterInt(PAGE_SIZE, request);
        if (pageSize == null || pageSize.intValue() <= 0) {
            pageSize = DEFAULT_PAGE_SIZE;
        }
        return pageSize;
    }

    public static Integer getThisPage(HttpServletRequest request) {
        return getParameterInt(THIS_PAGE, request);
    }

    public static Integer getMaxPage(HttpServletRequest request) {
        return getParameterInt(MAX_PAGE, request);
    }

    /**
     * 设置默认page info
     *
     * @param request request
     */
    public static void setDefaultPageInfo(HttpServletRequest request) {
        setPageInfo(1, 1, 20, request);
    }

    /**
     * 获取导出 titles
     *
     * @param request request
     * @return title Map
     */
    public static Map<String, Object> getExportTitles(HttpServletRequest request) {
        return getExportDataByTag(request, "titles");
    }

    private static Map<String, Object> getExportDataByTag(HttpServletRequest request, String tag) {
        Map<String, Object> data = new HashMap<>(2);
        Enumeration names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement().toString();

            if (StringUtils.contains(name, tag)) {
                String key = StringUtils
                        .substring(name, StringUtils.indexOf(name, "{") + 1, StringUtils.indexOf(name, "}"));
                if (StringUtils.contains(name, "List")) {
                    data.put(key, Arrays.asList(request.getParameterValues(name)));
                } else {
                    data.put(key, WebUtils.getParameter(name, request));
                }
            }
        }
        return data;
    }

    /**
     * 获取导出 参数
     *
     * @param request request
     * @return params Map
     */
    public static Map<String, Object> getExportParams(HttpServletRequest request) {
        return getExportDataByTag(request, "params");
    }

    /**
     * 获取导出 数据
     *
     * @param request request
     * @return 页面数据集合
     */
    public static List getExportDatas(HttpServletRequest request) {
        return JsonUtils.toObject(getParameter("exportData", request), List.class);
    }

    public static void writeFtl(String templatePath, Object model, HttpServletRequest request,
                                HttpServletResponse response) throws IOException, TemplateException {
        ServletContext servletContext = request.getServletContext();
        WebappTemplateLoader templateLoader = new WebappTemplateLoader(servletContext, FreemarkerUtils.CLASS_BASE_DIR);
        response.setContentType("text/html;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache");
        FreemarkerUtils.processTemplate(templateLoader, templatePath, model, response.getWriter());
    }

    public static String getParameterUpperCase(String name, HttpServletRequest request) {
        return StringUtils.upperCase(StringUtils.trim(getParameterNoTrim(name, request)));
    }

    public static String getParameterNoTrim(String name, HttpServletRequest request) {
        return request.getParameter(name);
    }

    public static int getParameterInt(String name, HttpServletRequest request) {
        String value = getParameter(name, request);
        if (NumberUtils.isNumber(value)) {
            return Integer.parseInt(value);
        }
        return 0;
    }

    public static String getParameter(String name, HttpServletRequest request) {
        return StringUtils.trim(getParameterNoTrim(name, request));
    }

    public static long getParameterLong(String name, HttpServletRequest request) {
        String value = getParameter(name, request);
        if (NumberUtils.isNumber(value)) {
            return Long.parseLong(value);
        }
        return 0L;
    }

    public static double getParameterDouble(String name, HttpServletRequest request) {
        String value = getParameter(name, request);
        if (NumberUtils.isNumber(value)) {
            return Double.parseDouble(value);
        }
        return 0d;
    }

    public static boolean getParameterBoolean(String name, HttpServletRequest request) {
        String value = getParameter(name, request);
        return StringUtils.toBoolean(value);
    }

    public static void put(String name, Object value, HttpServletRequest request) {
        request.setAttribute(name, value);
    }

    public static Map parseCondtion(Map data) {
        Map condtionMap = new LinkedHashMap();
        Set<String> keys = data.keySet();
        for (String key : keys) {
            if (StringUtils.isNotEmpty(MapUtils.getString(data, key))) {
                condtionMap.put(key.substring(WebUtils.PREFIX_SEARCH.length()),
                                MapUtils.getString(data, key).toUpperCase());
            }
        }
        return condtionMap;
    }

    public static Map parseCondtionWithNoUpperCase(Map data) {
        Map condtionMap = new LinkedHashMap();
        Set<String> keys = data.keySet();
        for (String key : keys) {
            if (StringUtils.isNotEmpty(MapUtils.getString(data, key))) {
                condtionMap.put(key.substring(WebUtils.PREFIX_SEARCH.length()), MapUtils.getString(data, key));
            }
        }
        return condtionMap;
    }

    /**
     * 返回默认消息 操作成功
     *
     * @param request request
     */
    public static void setSuccessMsg(HttpServletRequest request) {
        setSuccessMsg(request, "system.operate_successfully", "Successful Operation!");
    }

    /**
     * 返回 自定义成功消息
     *
     * @param request    request
     * @param msgId      msgId
     * @param defaultMsg defaultMsg
     */
    public static void setSuccessMsg(HttpServletRequest request, String msgId, String defaultMsg) {
        request.setAttribute(Constants.MESSAGE_SUCCESS,
                             ResponseMsgBuilder.buildSuccessJsonMsg(msgId, defaultMsg, null));
    }

    public static List<Map> analyticalComboData(List<String> dataList) {
        List<Map> options = new ArrayList<>();

        Map optionEmpty = new HashMap(2);
        optionEmpty.put("value", " ");
        //        TODO :增加到csv
        optionEmpty.put("key", I18nUtils.getMessage("system.please_choose", "--Choice--"));
        options.add(optionEmpty);
        if (dataList != null && dataList.size() > 0) {
            for (String s : dataList) {
                Map option = new HashMap(2);
                option.put("key", s);
                option.put("value", s);
                options.add(option);
            }
        }
        return options;
    }

    /**
     * 通用导出excel-全部
     *
     * @param fileName 文件名
     * @param head     excel head 属性
     * @param data     excel data
     * @param template 模板路径
     * @param response response
     */
    public static void exportExcel(String fileName, Map<String, Object> head, List data, String template,
                                   HttpServletResponse response) throws Exception {
        exportExcel(fileName, head, data, template, data.size(), 1, response);
    }

    /**
     * 导出Excel
     *
     * @param excelExport 特殊处理的excelExport
     * @param fileName    文件名
     * @param response    response
     */
    public static void exportExcel(ExcelExport excelExport, String fileName,
                                   HttpServletResponse response) throws Exception {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        if (excelExport != null) {
            excelExport.export(os);
            ServletOutputStream out = response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            out.write(os.toByteArray());
            out.flush();
            out.close();
        }
    }

    /**
     * @param workbook (excel对象)
     * @param response
     * @param fileName (sheet的名称)
     * @throws IOException
     * @Title: exportExcel
     * @Description: 导出Excel的方法
     * @author: 袁长云 @2022/1/28
     */
    public static void exportExcel(Workbook workbook, HttpServletResponse response,
                                   String fileName) throws IOException {
        if (workbook != null) {
            ServletOutputStream out = response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            workbook.write(out);
            out.flush();
            out.close();
        }
    }

    /**
     * 通用导出excel-分页
     *
     * @param fileName 文件名
     * @param head     excel head 属性
     * @param data     excel data
     * @param template 模板路径
     * @param pageSize pageSize
     * @param pageNum  pageNum
     * @param response response
     */
    public static void exportExcel(String fileName, Map<String, Object> head, List data, String template, int pageSize,
                                   int pageNum, HttpServletResponse response) throws Exception {
        ExcelExport excelExport = new ExcelExport().head(head).data(data).page(pageNum, pageSize).template(
                WebUtils.class.getClassLoader().getResourceAsStream(template));
        exportExcel(excelExport, fileName, response);
    }

    public static Object getCacheString2Obj(String pageDataString) {
        if (pageDataString != null && !"".equals(pageDataString)) {
            String string = URLDecoder.decode(pageDataString);

            BufferedInputStream bff = new BufferedInputStream(new ByteArrayInputStream(toBytes(string)));
            ObjectInputStream objectInputStream;
            try {
                objectInputStream = new ObjectInputStream(bff);
                return objectInputStream.readObject();
            } catch (Exception e) {
                log.error(e);
                return null;
            }
        }

        return null;
    }

    /**
     * @param workbook
     * @param sheetNum   (sheet的位置,0表示第一个表格中的第一个sheet)
     * @param sheetTitle (sheet的名称)
     * @param headers    (表格的标题)
     * @param result     (表格的数据)
     * @Title: buildSheetsForExcel
     * @Description: 多sheet的Excel的方法
     * @author: 袁长云 @2022/1/28
     */
    public static void buildSheetsForWorkbook(Workbook workbook, int sheetNum, String sheetTitle, List<String> headers,
                                              List<List<String>> result,Boolean needBorder) {
        // 生成一个表格
        Sheet sheet = workbook.createSheet();
        workbook.setSheetName(sheetNum, sheetTitle);
        // 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth((short) 20);
        // 生成一个样式
        CellStyle cellStyle = workbook.createCellStyle();
        // 设置这些样式
        cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.PALE_BLUE.getIndex());
        // 生成一个字体
        Font font = workbook.createFont();

        font.setFontHeightInPoints((short) 12);
        // 把字体应用到当前的样式
        cellStyle.setFont(font);

        // 指定当单元格内容显示不下时自动换行
        cellStyle.setWrapText(true);
        //边框
        if (needBorder){
            cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
            cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
            cellStyle.setBorderTop(BorderStyle.THIN);//上边框
            cellStyle.setBorderRight(BorderStyle.THIN);//右边框
        }

        // 产生表格标题行
        Row row = sheet.createRow(0);
        for (int i = 0; i < headers.size(); i++) {
            Cell cell = row.createCell((short) i);
            // cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellStyle(cellStyle);
            HSSFRichTextString text = new HSSFRichTextString(headers.get(i));
            cell.setCellValue(text.toString());
        }
        // 遍历集合数据,产生数据行
        if (result != null) {
            int index = 1;
            for (List<String> m : result) {
                row = sheet.createRow(index);
                int cellIndex = 0;
                for (String str : m) {
                    Cell cell = row.createCell((short) cellIndex);
                    // cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                    cell.setCellStyle(cellStyle);
                    cell.setCellType(CellType.STRING);
                    cell.setCellValue(str);
                    cellIndex++;
                }
                index++;
            }
        }
    }

    public static byte[] toBytes(String str) {
        if (str == null || str.trim().equals("")) {
            return new byte[0];
        }

        byte[] bytes = new byte[str.length() / 2];
        for (int i = 0; i < str.length() / 2; i++) {
            String subStr = str.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }

        return bytes;
    }

    public static String getCacheObj2String(Object obj) {
        if (obj == null) {
            return "";
        }
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        ObjectOutputStream oo;
        try {
            oo = new ObjectOutputStream(byteStream);
            oo.writeObject(obj);
        } catch (IOException e) {
            log.error(e);
            return "";
        }
        String string = bytesToHexFun2(byteStream.toByteArray());
        return string;
    }

    public static String bytesToHexFun2(byte[] bytes) {
        char[] buf = new char[bytes.length * 2];
        int index = 0;
        for (byte b : bytes) { // 利用位运算进行转换,可以看作方法一的变种
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }

        return new String(buf);
    }

    public static String getContextPath() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(
                RequestAttributes.REFERENCE_REQUEST);
        String contextPath = request.getContextPath();
        return contextPath;
    }

    /**
     * 转换Ext 下拉框传送的数据
     * <p>
     * ext 下拉框,选择多条数据和一条数据时,后台类型不一致
     * </p>
     *
     * @param o
     * @return
     */
    public static List<String> covertExtSelect(Object o) {
        List<String> result = new ArrayList<>();
        if (o instanceof String) {
            if (StringUtils.isNotBlank(o.toString())) {
                result.add(o.toString());
            }
        } else if (o instanceof List) {
            List<String> list = (List<String>) o;
            // 若集合中只有一条数据, 并且传入为空串时表示未选择,返回空list
            if (CollectionUtils.size(list) == 1 && StringUtils.isBlank(list.get(0))) {
                return result;
            }
            result = list;
        }
        return result;
    }

}