第三方
6、HttpClient
·1055 字·3 分钟·
loading
·
loading
Java
常用API
第三方
HttpClient # HttpClient是客户端的http通信实现库,这个类库的作用是接收和发送http报文,使用这个类库,它相比传统的 HttpURLConnection,增加了易用性和灵活性,我们对于http的操作会变得简单一些。
8、验证码
·1268 字·3 分钟·
loading
·
loading
Java
常用API
第三方
SpringBoot集成kaptcha实现数字计算验证码和字母验证码功能 # 1、Maven依赖 # <dependency> <groupId>pro.fessional</groupId> <artifactId>kaptcha</artifactId> <version>2.3.3</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency> 2、配置类 # package top.ygang.framework.config; import java.util.Random; import com.google.code.kaptcha.text.impl.DefaultTextCreator; /** * 验证码文本生成器 * @Author: yanggang * @Date: */ public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override public String getText() { Integer result = 0; Random random = new Random(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); int randomoperands = random.nextInt(3); if (randomoperands == 0) { result = x * y; suChinese.append(CNUMBERS[x]); suChinese.append("*"); suChinese.append(CNUMBERS[y]); } else if (randomoperands == 1) { if ((x != 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); suChinese.append("/"); suChinese.append(CNUMBERS[x]); } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } } else { if (x >= y) { result = x - y; suChinese.append(CNUMBERS[x]); suChinese.append("-"); suChinese.append(CNUMBERS[y]); } else { result = y - x; suChinese.append(CNUMBERS[y]); suChinese.append("-"); suChinese.append(CNUMBERS[x]); } } suChinese.append("=?@" + result); return suChinese.toString(); } } package top.ygang.huijifindresource.utils.captcha; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; import static com.google.code.kaptcha.Constants.*; /** * @Description: 验证码配置 * @Author: yanggang * @Date: */ @Configuration public class CaptchaConfig { /** * 字符验证码生成器 * @return */ @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } /** * 数学验证码生成器 * @return */ @Bean(name = "captchaProducerMath") public DefaultKaptcha getKaptchaBeanMath() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 边框颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); // 验证码文本生成器 // !!注意,这里需要手动修改为上面的KaptchaTextCreator的全类名 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "top.ygang.framework.config.KaptchaTextCreator"); // 验证码文本字符间距 默认为2 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 验证码噪点颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); // 干扰实现类 properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } 3、工具类 # package top.ygang.huijifindresource.utils.captcha; import com.google.code.kaptcha.Producer; import lombok.Data; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.stereotype.Component; import org.springframework.util.FastByteArrayOutputStream; import javax.annotation.Resource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; /** * @Description: 验证码生成工具类 * @Author: yanggang * @Date: */ @Component public class CaptchaGenerateUtil { @Resource(name = "captchaProducer") private Producer captchaProducer; @Resource(name = "captchaProducerMath") private Producer captchaProducerMath; private static final String BASE64_IMG_PREFIX = "data:image/gif;base64,"; @Data public static class CodeEntity { public CodeEntity(String code,String img){ this.code = code; this.img = img; } //生成的验证码,存入缓存中,用于后续校验 private String code; //生成的图片Base64编码,用于前端展示 private String img; } /** * 生成字符验证码 * @return * @throws IOException */ public CodeEntity generateCode() throws IOException { String capStr = captchaProducer.createText(); String code = capStr; BufferedImage image = captchaProducer.createImage(capStr); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); ImageIO.write(image, "jpg", os); return new CodeEntity(code, BASE64_IMG_PREFIX + Base64.encodeBase64String(os.toByteArray())); } /** * 生成数学验证码 * @return * @throws IOException */ public CodeEntity generateCodeMath() throws IOException { String capText = captchaProducerMath.createText(); String capStr = capText.substring(0, capText.lastIndexOf("@")); String code = capText.substring(capText.lastIndexOf("@") + 1); BufferedImage image = captchaProducerMath.createImage(capStr); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); ImageIO.write(image, "jpg", os); return new CodeEntity(code, BASE64_IMG_PREFIX + Base64.encodeBase64String(os.toByteArray())); } }
5、日志系统
·6660 字·14 分钟·
loading
·
loading
Java
常用API
第三方
日志系统 # 日志文件 # 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。 在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件。 许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网工程任务组(IETF)RFC5424中定义的syslog。 syslog标准使专用的标准化子系统能够生成,过滤,记录和分析日志消息 调试日志 # 软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所以我们需要专业的日志技术。java中寻找bug会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更方便的去重现问题。
7、FreeMarker
·2019 字·5 分钟·
loading
·
loading
Java
常用API
第三方
FreeMarker # FreeMarker 是一款免费的模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件,也可以通过模板来生成Word、pdf、Excel
4、Lombok
·818 字·2 分钟·
loading
·
loading
Java
常用API
第三方
Lombok # Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more. Lombok简单理解就是一个Java类库,通过注解的形式帮助开发减少一些结构化代码的开发工作,提高开发效率,比如通过@Data注解,class在编译的时候会自动生成get,set,equals,hash,toString等方法,避免写大量的代码,减少了代码量,也使代码看起来更加简洁。尤其是一些对象属性需要改动的时候,每次改动都需要重新生成get,set,equals,hash,toString等方法,而使用注解则可以避免此问题。
3、POI
·700 字·2 分钟·
loading
·
loading
Java
常用API
第三方
用于在java程序中,解析读取excel文档
依赖 # <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.14</version> </dependency> 工具类 # public class POIUtil { //读取数据 public static List<List<String>> read(String excelPath,int sheetNum){ //根据文件后缀,创建不同的电子表格对象 Workbook workbook = null; File file = new File(excelPath); InputStream input; try { input = new FileInputStream(file); if(excelPath.endsWith("xlsx")){ //创建 Excel 2007 电子表格对象 workbook = new XSSFWorkbook(input); }else{ //创建 Excel 2003 工作簿对象 workbook = new HSSFWorkbook(input); } } catch (Exception e) { e.printStackTrace(); } return parse(workbook,sheetNum); } private static List<List<String>> parse(Workbook workbook,int sheetNum){ //获取当前的工作簿 Sheet sheet = workbook.getSheetAt(sheetNum); List<List<String>> excelList = new ArrayList<>(); //遍历表格所有行 for(int i = 0;i <= sheet.getLastRowNum();i++){ //获取行对象 Row row = sheet.getRow(i); //如果当前行为空,则开始下一行循环 if(row == null){ continue; } List<String> rowList = new ArrayList<>(); //遍历行中的所有列 for(int j = 0;j < row.getLastCellNum();j++){ //获取列对象 Cell cell = row.getCell(j); String cellStr = ""; //判断当前列数据类型 if(cell == null){ cellStr = ""; }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){ //布尔类型 cellStr = String.valueOf(cell.getBooleanCellValue()); }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ //数值类型 cellStr = (int)cell.getNumericCellValue() + ""; }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){ //公式类型 cellStr = cell.getCellFormula(); }else{ //其余按字符串处理 cellStr = cell.getStringCellValue(); } rowList.add(cellStr); } excelList.add(rowList); } return excelList; } //写入到excel public static String write(String[] title, String sheetName, List<List<String>> data,String excelPath){ //创建Excel 2007 电子表格对象 Workbook wb = new XSSFWorkbook(); //设置sheet名称,并创建新的sheet对象 Sheet sheet = wb.createSheet(sheetName); //获取表头行 Row titleRow = sheet.createRow(0); //创建单元格,设置style居中,字体,单元格大小等 CellStyle style = wb.createCellStyle(); Cell cell = null; //把已经写好的标题行写入excel文件中 for (int i = 0; i < title.length; i++) { cell = titleRow.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //将数据写入excel Row row = null; for (int i = 0;i < data.size();i++){ row = sheet.createRow(i + 1); List<String> dataList = data.get(i); for (int j = 0;j < dataList.size();j++){ row.createCell(j).setCellValue(dataList.get(j)); } } //设置单元格宽度自适应,在此基础上把宽度调至1.5倍 for (int i = 0; i < title.length; i++) { sheet.autoSizeColumn(i, true); //注意单个单元格的最大列宽是255个字符 //sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 15 / 10); } //创建上传文件目录 File folder = new File(excelPath); //如果文件夹不存在创建对应的文件夹 if (!folder.exists()) { folder.mkdirs(); } //设置文件名 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss"); String format = dateFormat.format(date); String fileName = format + sheetName + ".xlsx"; String savePath = folder + File.separator + fileName; // System.out.println(savePath); try { OutputStream fileOut = new FileOutputStream(savePath); wb.write(fileOut); fileOut.close(); } catch (Exception e) { e.printStackTrace(); } //返回文件保存全路径 return savePath; } }
2、定时器
·10604 字·22 分钟·
loading
·
loading
Java
常用API
第三方
Java实现定时器的方式 # 1、Timer:这是Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行,一般使用比较少
1、JNA
·584 字·2 分钟·
loading
·
loading
Java
常用API
第三方
JNI和JNA # Java原生自带的JNI,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。