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;
}
}