搭建SSM开拓框架,重新认知java

作者:云顶最新线路检测

自家的简书:

JDK

以此大家自行去官方网址下载,安装,安装到位后,配置意况变量

JAVA_HOME D:AndroidJavajdk1.8.0_25CLASSPATH .;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;PATH ;%JAVA_HOME%bin;%JAVA_HOME%jrebin;

有些人讲,不引入应用枚举。有一些人讲,枚举很好用。究竟怎么使用,怎样运用,众说纷纷各执一词。显而易见,先学会再说~

 public void set { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap;//当前线程为入参,获取当前线程的threadLocals变量 if (map != null) //入参为this,也就是说key为ThreadLocal对象 map.set(this, value); else createMap; } public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap;//当前线程为入参,获取当前线程的threadLocals if (map != null) { //入参为this,也就是说key为ThreadLocal ThreadLocalMap.Entry e = map.getEntry; if (e != null) { @SuppressWarnings("unchecked") T result = e.value; return result; } } return setInitialValue(); } ThreadLocalMap getMap { return t.threadLocals;//threadLocals为线程的变量 } private Entry getEntry(ThreadLocal<?> key) { int i = key.threadLocalHashCode & (table.length - 1); Entry e = table[i]; if (e != null && e.get return e; else return getEntryAfterMiss(key, i, e);//避免内存泄漏,下文有提。 }

当然,main方法会打字与印刷pancake

序言:

  • 那二日在弄三个证券数量剖判,而Choice中程导弹出的数量是Excel的表格,数据多完成百上千个,即使要手动的去操作的话,操作量极大,所以就想着怎么用代码去达成,首要需要是:读取100七个同样格式的excel文件然后进行统一。翻译下正是Excel文件的读写。由此本篇就讲Excel读取和Excel的导出,一些广泛的格式设置,扩大单元格的边框,设置单元格的字体等,都以特别轻便的施用,更详实的请参阅官方文书档案

中间富含了三个POI操作的jar包,用于操作excel,帮助二零零零、二零零五版本,有poi-3.14、poi-ooxml-3.14、poi-ooxml-schemas-3.14、poi-scratchpad-3.8、xmlbeans-2.6.0,由于CSDN最低分的限量,所以须求简单积分,未有积分的同校能够在文末留下您的邮箱,有空小编会发给你

  • 2001-二〇〇六 版本的 工作簿,文件的后缀名称叫xls的文书能够单独行使 HSSFWorkbook workbook = new HSSFWorkbook()
  • 二零零六 以上版本的 专门的工作簿,文件的后缀名称叫Xlsx的文书能够独自使用 XSSFWorkbook workbook=new XSSFWorkbook();
  • 下面临应的类拉长对应的前缀HSSF或XSSF,而尚未前缀的能够通用xls和xlsx的文件, 需求加前缀的类如:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell、HSSFFont、HSSFCellStyle、HSSFDataFormat、
 /** * 导出Excel * @param sheetName 表名 * @param sheetHeads 表头 * @param listContent 数据集合 * @param os 输出流,可输出到文件、网络 */ public static void writeExcel(String sheetName, String[] sheetHeads, List<Student> listContent, OutputStream os) { try { /** * 2003-2007 版本的 工作簿,文件的后缀名为xls的文件可以单独使用 HSSFWorkbook workbook = new HSSFWorkbook() * 2007 以上版本的 工作簿,文件的后缀名为Xlsx的文件可以单独使用 XSSFWorkbook workbook=new XSSFWorkbook(); * 下面对应的类加上对应的前缀HSSF或XSSF,而没有前缀的可以通用xls和xlsx的文件, 需要加前缀的类如:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell、HSSFFont、HSSFCellStyle、HSSFDataFormat、 * 读写流程:Workbook——>Sheet——>Row——>Cell */ Workbook workbook= new HSSFWorkbook();// 创建一个2007以上版本的工作簿,创建需要指定具体的版本,读取可以不用 Sheet sheet = workbook.createSheet(sheetName);// 创建一个工作表 sheet.setDefaultRowHeight ;// 设置默认行高,表示1个字符的高度 Font font = workbook.createFont();// 创建一个字体对象, font.setBold;// 是否加粗 font.setFontName;// 设置字体 font.setFontHeightInPoints 16);// 设置字体大小 CellStyle cellStyle = workbook.createCellStyle();// 创建一个单元格的样式 cellStyle.setAlignment(CellStyle.ALIGN_CENTER);// 居中对齐 cellStyle.setWrapText;// 设置自动换行 cellStyle.setFont;// 将字体设置到样式中 cellStyle.setFillForegroundColor(HSSFColor.RED.index);// 设置背景色 int rowCount=0;//用于计数已有多少行的数据,其真实有的数据为rowCount条,访问时下标需要减1 // 填充表头数据 Cell cell = null; String head; Row headRow = sheet.createRow(rowCount++);// 创建第一行,下标从0 开始 for (int i = 0; i < sheetHeads.length; i++) { head = sheetHeads[i]; sheet.setColumnWidth(i, (head.length * 256);// 设置第i列的列宽,第一个参数代表列下标,第2个参数代表宽度值需要乘256表示多少个字符宽度 cell = headRow.createCell;// 创建一个单元格 cell.setCellValue;// 为单元格设置一个值 cell.setCellStyle(cellStyle);// 设置单元格的样式 } // 填充内容数据 cellStyle.setFillForegroundColor(HSSFColor.WHITE.index);// 设置背景色 Student student = null; Row row = null; // 为日期单独设置单元格的格式 DataFormat dataFormat = workbook.createDataFormat(); CellStyle cellStyleData = workbook.createCellStyle(); cellStyleData.setDataFormat(dataFormat.getFormat("yyyy年MM月dd日 hh:mm")); for (int i = 0; i < listContent.size { student = listContent.get; row = sheet.createRow(rowCount++);// 创建第i+1行d cell = row.createCell;// 创建第i+1行是第1个单元格 cell.setCellStyle(cellStyle); cell.setCellValue(student.getId; cell = row.createCell;// 创建第i+1行是第2个单元格 cell.setCellStyle(cellStyle); cell.setCellValue(student.getName; cell = row.createCell;// 创建第i+1行是第3个单元格 cell.setCellStyle(cellStyle); cell.setCellValue(student.isSex; cell = row.createCell;// 创建第i+1行是第4个单元格 cell.setCellStyle(cellStyle); cell.setCellValue(student.getAge; cell = row.createCell;// 创建第i+1行是第5个单元格 cell.setCellStyle(cellStyle); cell.setCellValue(student.getScore; cell = row.createCell;// 创建第i+1行是第6个单元格 /** * 读取出来就是一个字符串 * 读取代码:formatSS.parse(cell.getStringCellValue */ //cell.setCellValue(formatSS.format(student.getDate; /** * 读取出来的是一个double类型的数据,读取代码: * if (DateUtil.isCellDateFormatted||cell.getCellStyle().getDataFormat { * System.out.println(formatSS.format(cell.getDateCellValue;} * */ cell.setCellValue(student.getDate; cell.setCellStyle(cellStyleData); } //为单个的单元格增加边框 row = sheet.createRow(rowCount++); cell=row.createCell; cell.setCellValue("为该单元格加上边框"); CellStyle borderCellStyle = workbook.createCellStyle(); borderCellStyle.setAlignment(CellStyle.ALIGN_CENTER); borderCellStyle.setBorderBottom(CellStyle.BORDER_THIN); borderCellStyle.setBorderTop(CellStyle.BORDER_THIN); borderCellStyle.setBorderLeft(CellStyle.BORDER_THIN); borderCellStyle.setBorderRight(CellStyle.BORDER_THIN); cell.setCellStyle(borderCellStyle); //增加最后一行数据 row = sheet.createRow(rowCount++); row.createCell.setCellValue("@版权归LJP所有,该文件仅供学习参考使用"); // 合并单元格 CellRangeAddress rangeAddress =new CellRangeAddress(rowCount-1, rowCount-1, 0, 3); // 起始行, 终止行, 起始列, 终止列 sheet.addMergedRegion(rangeAddress); // 使用RegionUtil类为合并后的单元格添加边框 RegionUtil.setBorderBottom(1, rangeAddress, sheet, workbook); // 下边框 RegionUtil.setBorderLeft(1, rangeAddress, sheet, workbook); // 左边框 RegionUtil.setBorderRight(1, rangeAddress, sheet, workbook); // 有边框 RegionUtil.setBorderTop(1, rangeAddress, sheet, workbook); // 上边框 workbook.write; os.close(); } catch (Exception e) { e.printStackTrace(); } }

云顶游戏网站 1写入的Excel文件

 public static void readExcel2(File excelFile) { try { Workbook workbook=WorkbookFactory.create(excelFile); Sheet sheet = workbook.getSheetAt;//或者根据表名称读取:sheet=workbook.getSheet; /** * 遍历数据时可以使用迭代器Iterator,forEach,也可以使用for循环, * sheet.getFirstRowNum();//获取第一行的行号下标 * sheet.getLastRowNum();//获取最后一行的行号下标,遍历时需要加1 * row.getFirstCellNum();//获取某行的第一个单元格的下标 * row.getLastCellNum();//获取某行的最后一个单元格数量 */// for(int i=sheet.getFirstRowNum();i<sheet.getLastRowNum{// Row row = sheet.getRow;// for(int j=row.getFirstCellNum();j<row.getLastCellNum{// Cell cell = row.getCell;// }// } Iterator<Row> iterator = sheet.iterator(); while (iterator.hasNext {//遍历每一行的数据 Row row = iterator.next(); System.out.println("FirstRow="+sheet.getFirstRowNum() +",LastRow="+sheet.getLastRowNum() +",FirstCell="+row.getFirstCellNum() +",LastCell="+row.getLastCellNum() +",RowNum="+row.getRowNum; Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext {//遍历某行的所有单元格 Cell cell = cellIterator.next(); switch (cell.getCellType { case Cell.CELL_TYPE_STRING://String类型 System.out.println("String:"+cell.getStringCellValue; try { System.out.println(formatSS.parse(cell.getStringCellValue;//读取字符串格式的日期 } catch (Exception e) { } break; case Cell.CELL_TYPE_BOOLEAN://Booble类型 System.out.println("Boolean:"+cell.getBooleanCellValue; break; case Cell.CELL_TYPE_NUMERIC://Double类型 if (DateUtil.isCellDateFormatted||cell.getCellStyle().getDataFormat {//读取Double类型的日期 System.out.println("Data:————————》"+formatSS.format(cell.getDateCellValue; } else { System.out.println("Double:"+cell.getNumericCellValue; } break; case Cell.CELL_TYPE_FORMULA: System.out.println("formula:"+formatSS.format(cell.getDateCellValue; break; case Cell.CELL_TYPE_BLANK://空白的单元格 System.out.println; break; default: break; } } } }catch (Exception e) { e.printStackTrace(); } }

 public static List<Student> readExcel(File excelFile) { List<Student>list=new ArrayList<>(); try { Workbook workbook=WorkbookFactory.create(excelFile); Sheet sheet = workbook.getSheetAt; for (int i = 0; i < sheet.getLastRowNum {//遍历所有的行 Row row = sheet.getRow; if (row==null||i==0||i>sheet.getLastRowNum {//舍弃表头和末尾 continue; } Cell cell = row.getCell; String id = null; if (cell!=null) { id=cell.getStringCellValue(); } cell=row.getCell; String name = null; if (cell!=null) { name=cell.getStringCellValue(); } cell=row.getCell; boolean sex = false; if (cell!=null) { sex=cell.getBooleanCellValue(); } int age = 0; cell=row.getCell; if (cell!=null) { age= cell.getNumericCellValue(); } double score = 0; cell=row.getCell; if (cell!=null) { score=cell.getNumericCellValue(); } Date date = null; cell=row.getCell; if (cell!=null&&(DateUtil.isCellDateFormatted||cell.getCellStyle().getDataFormat) {//读取Double类型的日期 date=cell.getDateCellValue(); } Student student=new Student(id, name, sex, age, score, date); list.add; } } catch (Exception e) { e.printStackTrace(); } return list; }

读取结果

Student [id=0000000, name=name0, sex=true, age=10, score=750.0, date=Thu Jan 25 14:25:07 CST 2018] ...Student [id=00000029, name=name29, sex=false, age=39, score=721.0, date=Thu Jan 25 14:25:07 CST 2018]

Student类非常的粗略字段有

 private String id; private String name; private boolean sex;// true = 男, private int age; private double score; private Date date;

 String sheetName="表1"; String []sheetHeads={"学号","姓名","性别","年龄","成绩","日期"}; List<Student> listContent=new ArrayList<Student>(); for (int i = 0; i < 30; i++) { listContent.add(new Student("000000"+i, "name"+i, i%2==0?true:false, i+10, 750-i,new Date; } FileOutputStream fos = null; try { fos = new FileOutputStream(new File("C:\Users\yuxue\Desktop","student.xls")); } catch (FileNotFoundException e) { e.printStackTrace(); } Excel.writeExcel(sheetName, sheetHeads, listContent, fos); List<Student> list = Excel.readExcel(new File("C:\Users\yuxue\Desktop","student.xls")); for (Student student : list) { System.out.println; }

我的CSDN博客:

配置spring-web.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置springMVC --> <!--1:开始springMVC注解模式 --> <!--简化配置: ①自动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter ②提供一系列:数据绑定,数字和日期的format,@NumberFormat,@DataTimeFormat,xml,json默认读写支持 --> <mvc:annotation-driven /> <!--2:静态资源默认servlet配置 ①加入对静态资源的处理:js,css,gif,png ②允许使用"/"做整体映射 --> <mvc:default-servlet-handler /> <!--3:配置JSP 显示ViewResolver --> <bean > <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!--4:扫描web相关的bean --> <context:component-scan base-package="com.school.web" /> <!--5:拦截器 --> <!--6:利用mvc注解进行上传 --> <bean p:defaultEncoding="utf-8" /> <!-- --></beans>

最简单易行的采用

最简便易行的枚举类就像是我们地方第叁个概念的枚举类同样:

public enum Weekday { SUN,MON,TUS,WED,THU,FRI,SAT}

何以运用它呢?

先来看看它有何样措施:

云顶游戏网站 2Weekday方法

那是Weekday能够调用的点子和参数。开采它有八个章程:value()和valueOf()。还应该有大家恰好定义的四个变量。

云顶游戏网站 3枚举变量的措施

这么些事枚举变量的方式。我们接下去会身体力行多少个比较首要的:

public enum Weekday { SUN,MON,TUS,WED,THU,FRI,SAT}class Test3{ public static void main(String[] args) { System.out.println(Weekday.valueOf("mon".toUpperCase; //MON for (Weekday w : Weekday.values{ System.out.println(w + ".ordinal() ====>" +w.ordinal; } //SUN.ordinal() ====>0 //MON.ordinal() ====>1 //TUS.ordinal() ====>2 //WED.ordinal() ====>3 //THU.ordinal() ====>4 //FRI.ordinal() ====>5 //SAT.ordinal() ====>6 System.out.println("Weekday.MON.compareTo(Weekday.FRI) ===> " + Weekday.MON.compareTo(Weekday.FRI)); System.out.println("Weekday.MON.compareTo(Weekday.MON) ===> " + Weekday.MON.compareTo(Weekday.MON)); System.out.println("Weekday.MON.compareTo(Weekday.SUM) ===> " + Weekday.MON.compareTo(Weekday.SUN)); //Weekday.MON.compareTo(Weekday.FRI) ===> -4 //Weekday.MON.compareTo(Weekday.MON) ===> 0 //Weekday.MON.compareTo(Weekday.SUM) ===> 1 System.out.println("Weekday.MON.name() ====> " + Weekday.MON.name; //Weekday.MON.name() ====> MON }}

这段代码,大家演示了几个常用的点子和功用:

  1. Weekday.valueOf() 方法:

    它的功能是传播多个字符串,然后将它生成为对应的枚举变量。前提是你传的字符串和定义枚举变量的字符串一抹一样,区分轻重缓急写。若是您传了三个一纸空文的字符串,那么会抛出拾壹分。

  2. Weekday.values()方法。

以此方法会重返包含富有枚举变量的数组。在该例中,再次来到的就是包罗了多个星期的Weekday[]。能够便宜的用来做巡回。

  1. 枚举变量的toString()方法。

    该格局直接回到枚举定义枚举变量的字符串,譬如MON就回来。

  2. 枚举变量的.ordinal()方法。

私下认可请款下,枚举类会给全数的枚举变量三个暗中同意的前后相继,该次序从0起头,类似于数组的下标。而.ordinal()方法正是获得那几个程序

  1. 枚举变量的compareTo()方法。

该方式用来比很多个枚举变量的"大小",实际上相比的是八个枚举变量的程序,重回三个次序相减后的结果,如若为负数,就认证变量1"小于"变量2 (变量1.compareTo,重回【变量1.ordinal() - 变量2.ordinal

云顶游戏网站 4compareTo源码

这是compareTo的源码,会先剖断是或不是同一个枚举类的变量,然后再重返差值。

  1. 枚举类的name()方法。

它和toString()方法的重返值同样,事实上,那四个主意自然正是均等的:

云顶游戏网站 5name方法

云顶游戏网站 6toString方法

那四个形式的暗中认可完成是同一的,独一的界别是,你能够重写toString方法。name变量正是枚举变量的字符串方式。

还恐怕有局地别的的方法自己就权且不介绍了,感兴趣的话能够团结去探望文书档案大概源码,都挺轻巧的。

要点:

  • 应用的是enum关键字并不是class。
  • 多个枚举变量直接用逗号隔开分离。
  • 枚举变量最棒大写,八个单词之间利用"_"隔开(比如:INT_SUM)。
  • 概念完全体的变量后,以分行甘休,假诺只有枚举变量,而尚未自定义变量,分号能够大概(比如地点的代码就大要了子集团)。
  • 在别的类中利用enum变量的时候,只需求就足以了,和选拔静态变量一样。

搭建SSM开拓框架,重新认知java。不过这种简易的选取分明不可能反映出枚举的有力,我们来学习一下眼花缭乱的使用:

ThreadLocalMap结构如下:

近日假诺在Utensil.java的源文件中并且定义了Utensil云顶游戏网站,和Dessert

创办布局文件目录结构

  • mapper存放数据库映射文件
  • spring贮存spring配置文件
  • jdbc.properties是数据库消息的安排
  • logback为日志文件,使用的是slf4j+logback
  • mybatis-config.xml是mybatis配置文件

思路:配置web.xml,设置转载器和过滤器,然后是spring配置包扫描、申明等以及将mybatis整合进spring中

云顶游戏网站 7

静态变量来赞助

通过一番考虑,你说了算接纳多个静态变量来表示星期几,今后借使援引和静态变量就足以了,而不用本身输入012....你这么写:

public class Weekday { public final static int SUN = 0; public final static int MON = 1; public final static int TUE = 2; public final static int WED = 3; public final static int THU = 4; public final static int FRI = 5; public final static int SAT = 6; }

乖巧如你,这一年,只要Weekday.SUN就足以了,不用操心到底应该填写0照旧填写1。

可是这一年的您,亦不是当下黄口小儿的小青少年了,很醒目,那样写已经不可能满意你了。你还想让这几个类做更多的事,举个例子,你想理解下一天是星期几,还想把前日是星期几打字与印刷出来。一番反复思索后,你改成了这么:

public class Weekday { private Weekday(){} public final static Weekday SUN = new Weekday(); public final static Weekday MON = new Weekday(); public final static Weekday TUE = new Weekday(); public final static Weekday WED = new Weekday(); public final static Weekday THU = new Weekday(); public final static Weekday FRI = new Weekday(); public final static Weekday SAT = new Weekday(); public static Weekday getNextDay(Weekday nowDay){ if(nowDay == SUN) { return MON; }else if(nowDay == MON) { return TUE; }else if(nowDay == TUE) { return WED; }else if(nowDay == WED) { return THU; }else if(nowDay == THU) { return FRI; }else if(nowDay == FRI) { return SAT; }else { return SUN; } } public static void printNowDay(Weekday nowDay){ if(nowDay == SUN) System.out.println; else if(nowDay == MON) System.out.println; else if(nowDay == TUE) System.out.println("tuesday"); else if(nowDay == WED) System.out.println("wednesday"); else if(nowDay == THU) System.out.println("thursday"); else if(nowDay == FRI) System.out.println; else System.out.println("saturday"); }}class Test1{ public static void main(String[] args) { Weekday nowday = Weekday.SUN; Weekday.printNowDay; Weekday nextDay = Weekday.getNextDay; System.out.print("nextday ====> "); Weekday.printNowDay; }}//测试结果://sunday//nextday ====> monday

咦,不错。思索的很详细。况兼私有构造方法后,外界就不可能创造该类的目标了,那样就防止了星期八星期九的面世,全部Weekday的靶子都在此类内部创设。

畸形,好像缺了点什么,作者要的是int!笔者的int呢?!。所以,你还亟需三个这样的办法:

 public static int toInt(Weekday nowDay){ if(nowDay == SUN) return 0; else if(nowDay == MON) return 1; else if(nowDay == TUE) return 2; else if(nowDay == WED) return 3; else if(nowDay == THU) return 4; else if(nowDay == FRI) return 5; else return 6; }

当您须要三个整形数据的时候,只须要Weekday.toInt(Weekday.SUN);,看起来你就好像达成了您的职务。

可是,你有未有觉察,那样写,好费劲啊。假设想要扩张一下职能,大批量的ifelse会令人目不暇接。

有未有更加好的章程吧?你差不离已经理解了,没有错,大家必要枚举类!

咱们先来会见枚举类是哪些。

当使用set()方法时:

今后如果你十分大心创立了另贰个名称叫Dessert.java的源文件,它定义了一样的四个类:

焚薮而田或许的错误

  • 诚如创立实现后得以会唤醒bulid_path中一向不server,此时亟待右键项目->bulid path->confiure build path

    云顶游戏网站 8

  • 提示Maven update此时只需求右键项目->MAVEN->UPDATE PROJECT就可以

  • el表明式失效在web.xml中暗许的扬言版本是2.3,会造成el表达式失效,在创立完结后决然要修改web.xml。将web.xml中的内容替换为
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <!-- 修改servlet版本为3.1 --></web-app>

switch语句中选择

enum Signal { GREEN, YELLOW, RED}public class TrafficLight { Signal color = Signal.RED; public void change() { switch  { case RED: color = Signal.GREEN; break; case YELLOW: color = Signal.RED; break; case GREEN: color = Signal.YELLOW; break; } }}

ThreadLocal对象被回收时,未有艺术得到到value,而线程又不会被回收时则value一向占用空间导致内部存款和储蓄器泄漏。线程不会被回收的科学普及现象是线程池。

云顶游戏网站 9Effective Java, Third Edition

本文由云顶最新线路检测发布,转载请注明来源

关键词: