java中的事件机制
3种角色:
1.event object:事件对象,作为参数,一般存在与listerner的方法之中. (超类:java.util.EventObject)
2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
3.event listener:事件监听类,当监听到event object产生的时候,它就调用相应的方法,进行处理。 (超接口:java.util.EventListener)
package com.atguigu.event.door;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* 事件源,在这里你可以把它想象成一个控制开门关门的遥控器
* 开门按钮:事件源 DoorButton
* 开门:事件 DoorEvent
* 监听开门: 监听器 DoorListener1
*/
public class DoorButton {
private Collection listeners;
/**
* 添加事件
* @param listener DoorListener
*/
public void addDoorListener(DoorListener listener) {
if (listeners == null) {
listeners = new HashSet();
}
listeners.add(listener);
}
/**
* 移除事件
* @param listener DoorListener
*/
public void removeDoorListener(DoorListener listener) {
if (listeners == null)
return;
listeners.remove(listener);
}
/**
* 触发开门事件
*/
protected void fireWorkspaceOpened() {
if (listeners == null)
return;
DoorEvent event = new DoorEvent(this, "open");
notifyListeners(event);
}
/**
* 触发关门事件
*/
protected void fireWorkspaceClosed() {
if (listeners == null)
return;
DoorEvent event = new DoorEvent(this, "close");
notifyListeners(event);
}
/**
* 通知所有的DoorListener
*/
private void notifyListeners(DoorEvent event) {
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
DoorListener listener = (DoorListener) iter.next();
listener.doorEvent(event);
}
}
}
package com.atguigu.event.door;
import java.util.EventObject;
/**
* 事件: 开/关门
*/
public class DoorEvent extends EventObject {
private String doorState = "";//表示门的状态,有“开”和“关”两种
public DoorEvent(Object source, String doorState) {
super(source);
this.doorState = doorState;
}
public void setDoorState(String doorState) {
this.doorState = doorState;
}
public String getDoorState() {
return this.doorState;
}
}
package com.atguigu.event.door;
import java.util.EventListener;
/**
* 定义事件监听接口
*/
public interface DoorListener extends EventListener {
void doorEvent(DoorEvent event);
}
package com.atguigu.event.door;
/**
* 监听器:监听事件 DoorEvent
*/
public class DoorListener1 implements DoorListener {
public void doorEvent(DoorEvent event) {
if(event.getDoorState()!=null&&event.getDoorState().equals("open")){
System.out.println("门1打开");
}else{
System.out.println("门1关闭");
}
}
}
package com.atguigu.event.door;
public class DoorListener2 implements DoorListener {
public void doorEvent(DoorEvent event) {
if(event.getDoorState()!=null&&event.getDoorState().equals("open"))
{
System.out.println("门2打开,同时打开走廊的灯");
}else{
System.out.println("门2关闭,同时关闭走廊的灯");
}
}
}
package com.atguigu.event.door;
/**
* https://www.iteye.com/blog/zmfkplj-629678
*/
public class DoorMain {
public static void main(String []args)
{
DoorButton doorButton = new DoorButton(); //事件:开/关门按钮
doorButton.addDoorListener(new DoorListener1());//给门1增加监听器
doorButton.addDoorListener(new DoorListener2());//给门2增加监听器
//开门
doorButton.fireWorkspaceOpened();
System.out.println("我已经进来了");
//关门
doorButton.fireWorkspaceClosed();
}
}
Excel基于事件模式导入
poi三种模式:
用户模式 : 导入/导出
事件模式 : 导入
SXSSF对象 : 导出
<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>
package com.atguigu.event.excel;
import lombok.Data;
@Data
public class ClientExcelImportReq {
String clientId;
String name;
}
package com.atguigu.event.excel;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;
/**
* 事件处理器
*/
public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
ClientExcelImportReq entity;
public void startRow(int rowIndex) {
if(rowIndex > 0)
entity = new ClientExcelImportReq();
}
public void endRow(int i) {
if(null != entity)
System.out.println(entity);
}
public void cell(String cellReference, String value, XSSFComment xssfComment) {
if(null != entity){
String sub = cellReference.substring(0, 1);
switch (sub){
case "A" :
entity.setClientId(value);
break;
case "B":
entity.setName(value);
break;
default:
break;
}
}
}
public void headerFooter(String s, boolean b, String s1) {
}
}
package com.atguigu.event.excel;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.InputStream;
import java.util.Iterator;
public class TestImportExcel {
public static void main(String[] args) throws Exception {
String path = "E:\\test.xlsx";
OPCPackage opcPackage = OPCPackage.open(path, PackageAccess.READ);
XSSFReader reader = new XSSFReader(opcPackage);
StylesTable stylesTable = reader.getStylesTable();
ReadOnlySharedStringsTable table = new ReadOnlySharedStringsTable(opcPackage);
//Sax的reader
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
//注册事件处理器
XSSFSheetXMLHandler xmlHandler = new XSSFSheetXMLHandler(stylesTable, table, new SheetHandler(), false);
xmlReader.setContentHandler(xmlHandler);
//逐行读取
Iterator<InputStream> sheetsData = reader.getSheetsData();
XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) sheetsData;
while (sheetIterator.hasNext()){
InputStream is = sheetIterator.next(); //每个sheet流数据
InputSource inputSource = new InputSource(is); //输入源
xmlReader.parse(inputSource);
}
}
}