diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e3930e44..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 07a840b1..00000000 --- a/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -# IntelliJ project files -.idea -*.iml -out -gen - - -### Java template -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - diff --git a/README.md b/README.md deleted file mode 100644 index a58fb0a4..00000000 --- a/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# 项目简介 -这是我Java学习过程中一些demo案例的汇总 - -现主要有Java的IO、Netty入门demo、设计模式的demo、MyBatis、MyBatis-Plus、Spring、Spring MVC、Spring Boot等 - -如: -- BIO、NIO、AIO实现聊天室;----> main分支 -- Netty的入门上手demo;----> main分支 -- 设计模式的基本原则和23种常用设计模式等;----> main分支 -- mybatis的使用,mybatis-plus的使用,自定义持久层框架 ----> mybatis分支 -- spring的使用,自定义IOC和AOP -----> spring分支 -- springMVC的使用,自定义MVC框架 -----> springmvc分支 -- springboot的使用,springboot-Starter的自定义 ----> springboot分支 -- 自定义Tomcat -----> tomcat分支 -- \ No newline at end of file diff --git a/mvc/pom.xml b/mvc/pom.xml new file mode 100644 index 00000000..23293e7d --- /dev/null +++ b/mvc/pom.xml @@ -0,0 +1,80 @@ + + + + 4.0.0 + + com.lemon + mvc + 1.0-SNAPSHOT + war + + mvc Maven Webapp + + http://www.example.com + + + UTF-8 + 8 + 8 + + + + + junit + junit + 4.12 + test + + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.apache.commons + commons-lang3 + 3.9 + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 8 + 8 + utf-8 + + + -parameters + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 8080 + / + + + + + diff --git a/mvc/src/main/java/com/lemon/demo/controller/DemoController.java b/mvc/src/main/java/com/lemon/demo/controller/DemoController.java new file mode 100644 index 00000000..7fea64d4 --- /dev/null +++ b/mvc/src/main/java/com/lemon/demo/controller/DemoController.java @@ -0,0 +1,33 @@ +package com.lemon.demo.controller; + + + +import com.lemon.demo.service.IDemoService; +import com.lemon.mvcframework.annotations.LagouAutowired; +import com.lemon.mvcframework.annotations.LagouController; +import com.lemon.mvcframework.annotations.LagouRequestMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@LagouController +@LagouRequestMapping("/demo") +public class DemoController { + + + @LagouAutowired + private IDemoService demoService; + + + /** + * URL: /demo/query?name=lisi + * @param request + * @param response + * @param name + * @return + */ + @LagouRequestMapping("/query") + public String query(HttpServletRequest request, HttpServletResponse response, String name) { + return demoService.get(name); + } +} diff --git a/mvc/src/main/java/com/lemon/demo/service/IDemoService.java b/mvc/src/main/java/com/lemon/demo/service/IDemoService.java new file mode 100644 index 00000000..f6f1766b --- /dev/null +++ b/mvc/src/main/java/com/lemon/demo/service/IDemoService.java @@ -0,0 +1,6 @@ +package com.lemon.demo.service; + +public interface IDemoService { + + String get(String name); +} diff --git a/mvc/src/main/java/com/lemon/demo/service/impl/DemoServiceImpl.java b/mvc/src/main/java/com/lemon/demo/service/impl/DemoServiceImpl.java new file mode 100644 index 00000000..9ed448ad --- /dev/null +++ b/mvc/src/main/java/com/lemon/demo/service/impl/DemoServiceImpl.java @@ -0,0 +1,14 @@ +package com.lemon.demo.service.impl; + + +import com.lemon.demo.service.IDemoService; +import com.lemon.mvcframework.annotations.LagouService; + +@LagouService("demoService") +public class DemoServiceImpl implements IDemoService { + @Override + public String get(String name) { + System.out.println("service 实现类中的name参数:" + name) ; + return name; + } +} diff --git a/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouAutowired.java b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouAutowired.java new file mode 100644 index 00000000..010840c8 --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouAutowired.java @@ -0,0 +1,10 @@ +package com.lemon.mvcframework.annotations; + +import java.lang.annotation.*; + +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface LagouAutowired { + String value() default ""; +} diff --git a/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouController.java b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouController.java new file mode 100644 index 00000000..329b6b2f --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouController.java @@ -0,0 +1,12 @@ +package com.lemon.mvcframework.annotations; + +import java.lang.annotation.*; + +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface LagouController { + + String value() default ""; + +} diff --git a/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouRequestMapping.java b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouRequestMapping.java new file mode 100644 index 00000000..16028edb --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouRequestMapping.java @@ -0,0 +1,10 @@ +package com.lemon.mvcframework.annotations; + +import java.lang.annotation.*; + +@Documented +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface LagouRequestMapping { + String value() default ""; +} diff --git a/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouService.java b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouService.java new file mode 100644 index 00000000..1d14a156 --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouService.java @@ -0,0 +1,10 @@ +package com.lemon.mvcframework.annotations; + +import java.lang.annotation.*; + +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface LagouService { + String value() default ""; +} \ No newline at end of file diff --git a/mvc/src/main/java/com/lemon/mvcframework/pojo/Handler.java b/mvc/src/main/java/com/lemon/mvcframework/pojo/Handler.java new file mode 100644 index 00000000..41965ced --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/pojo/Handler.java @@ -0,0 +1,61 @@ +package com.lemon.mvcframework.pojo; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; + + +/** + * 封装handler方法相关的信息 + */ +public class Handler { + + private Object controller; // method.invoke(obj,) + + private Method method; + + private Pattern pattern; // spring中url是支持正则的 + + private Map paramIndexMapping; // 参数顺序,是为了进行参数绑定,key是参数名,value代表是第几个参数 + + + public Handler(Object controller, Method method, Pattern pattern) { + this.controller = controller; + this.method = method; + this.pattern = pattern; + this.paramIndexMapping = new HashMap<>(); + } + + public Object getController() { + return controller; + } + + public void setController(Object controller) { + this.controller = controller; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public Pattern getPattern() { + return pattern; + } + + public void setPattern(Pattern pattern) { + this.pattern = pattern; + } + + public Map getParamIndexMapping() { + return paramIndexMapping; + } + + public void setParamIndexMapping(Map paramIndexMapping) { + this.paramIndexMapping = paramIndexMapping; + } +} diff --git a/mvc/src/main/java/com/lemon/mvcframework/servlet/LgDispatcherServlet.java b/mvc/src/main/java/com/lemon/mvcframework/servlet/LgDispatcherServlet.java new file mode 100644 index 00000000..5b27f47e --- /dev/null +++ b/mvc/src/main/java/com/lemon/mvcframework/servlet/LgDispatcherServlet.java @@ -0,0 +1,364 @@ +package com.lemon.mvcframework.servlet; + +import com.lemon.mvcframework.annotations.LagouAutowired; +import com.lemon.mvcframework.annotations.LagouController; +import com.lemon.mvcframework.annotations.LagouRequestMapping; +import com.lemon.mvcframework.annotations.LagouService; +import com.lemon.mvcframework.pojo.Handler; +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Description: TODO + * @Author : Lemon-CS + * @Date : 2022年02月22日 7:10 下午 + */ +public class LgDispatcherServlet extends HttpServlet { + + private Properties properties = new Properties(); + + private List classNames = new ArrayList<>(); // 缓存扫描到的类的全限定类名 + + // ioc容器 + private Map ioc = new HashMap(); + + // handlerMapping + //private Map handlerMapping = now HashMap<>(); // 存储url和Method之间的映射关系 + private List handlerMapping = new ArrayList<>(); + + @Override + public void init(ServletConfig config) throws ServletException { + // 1 加载配置文件 springmvc.properties + String contextConfigLocation = config.getInitParameter("contextConfigLocation"); + doLoadConfig(contextConfigLocation); + + // 2 扫描相关的类,扫描注解 + doScan(properties.getProperty("scanPackage")); + + // 3 初始化bean对象(实现ioc容器,基于注解) + doInstance(); + + // 4 实现依赖注入 + doAutoWired(); + + // 5 构造一个HandlerMapping处理器映射器,将配置好的url和Method建立映射关系 + initHandlerMapping(); + + System.out.println("lagou mvc 初始化完成...."); + // 等待请求进入,处理请求 + } + + /* + 构造一个HandlerMapping处理器映射器 + 最关键的环节 + 目的:将url和method建立关联 + */ + private void initHandlerMapping() { + + if (ioc.isEmpty()) { + return; + } + + for (Map.Entry entry : ioc.entrySet()) { + // 获取ioc中当前遍历的对象的class类型 + Class clazz = entry.getValue().getClass(); + + if (!clazz.isAnnotationPresent(LagouController.class)) { + continue; + } + + String baseUrl = ""; + if (clazz.isAnnotationPresent(LagouRequestMapping.class)) { + LagouRequestMapping annotation = clazz.getAnnotation(LagouRequestMapping.class); + baseUrl = annotation.value(); // 等同于/demo + } + + // 获取方法 + Method[] methods = clazz.getMethods(); + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + + // 方法没有标识LagouRequestMapping,就不处理 + if(!method.isAnnotationPresent(LagouRequestMapping.class)) {continue;} + + // 如果标识,就处理 + LagouRequestMapping annotation = method.getAnnotation(LagouRequestMapping.class); + String methodUrl = annotation.value(); // /query + String url = baseUrl + methodUrl; // 计算出来的url /demo/query + + // 把method所有信息及url封装为一个Handler + Handler handler = new Handler(entry.getValue(), method, Pattern.compile(url)); + + // 计算方法的参数位置信息 + // query(HttpServletRequest request, HttpServletResponse response,String name) + Parameter[] parameters = method.getParameters(); + for (int j = 0; j < parameters.length; j++) { + Parameter parameter = parameters[j]; + + if (parameter.getType() == HttpServletRequest.class || parameter.getType() == HttpServletResponse.class) { + // 如果是request和response对象,那么参数名称写HttpServletRequest和HttpServletResponse + handler.getParamIndexMapping().put(parameter.getType().getSimpleName(), j); + } else { + handler.getParamIndexMapping().put(parameter.getName(), j); // + } + + } + + + // 建立url和method之间的映射关系(map缓存起来) + handlerMapping.add(handler); + } + } + + } + + // 实现依赖注入 + private void doAutoWired() { + + if (ioc.isEmpty()) { + return; + } + + // 有对象,再进行依赖注入处理 + + // 遍历ioc中所有对象,查看对象中的字段,是否有@LagouAutowired注解,如果有需要维护依赖注入关系 + for (Map.Entry entry : ioc.entrySet()) { + // 获取bean对象中的字段信息 + Field[] declaredFields = entry.getValue().getClass().getDeclaredFields(); + + // 遍历判断处理 + for (int i = 0; i < declaredFields.length; i++) { + Field declaredField = declaredFields[i]; + if (!declaredField.isAnnotationPresent(LagouAutowired.class)) { + continue; + } + + // 有该注解 + LagouAutowired annotation = declaredField.getAnnotation(LagouAutowired.class); + String beanName = annotation.value(); // 需要注入的bean的id + + if ("".equals(beanName.trim())) { + // 没有配置具体的bean id,那就需要根据当前字段类型注入(接口注入) IDemoService + beanName = declaredField.getType().getName(); + } + + // 开启赋值 + declaredField.setAccessible(true); + + try { + declaredField.set(entry.getValue(), ioc.get(beanName)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + } + + // ioc容器 + // 基于classNames缓存的类的全限定类名,以及反射技术,完成对象创建和管理 + private void doInstance() { + + if (classNames.size() == 0) { + return; + } + + try { + + for (int i = 0; i < classNames.size(); i++) { + String className = classNames.get(i); // com.lemon.demo.controller.DemoController + + // 反射 + Class clazz = Class.forName(className); + + // 区分controller,区分service' + if (clazz.isAnnotationPresent(LagouController.class)) { + // controller的id此处不做过多处理,不取value了,就拿类的首字母小写作为id,保存到ioc中 + String simpleName = clazz.getSimpleName(); + String lowerFirstSimpleName = lowerFirst(simpleName); + + Object o = clazz.newInstance(); + ioc.put(lowerFirstSimpleName, o); + } else if (clazz.isAnnotationPresent(LagouService.class)) { + LagouService annotation = (LagouService) clazz.getAnnotation(LagouService.class); + //获取注解value值 + String beanName = annotation.value(); + Object instance = clazz.newInstance(); + + // 如果指定了id,就以指定的为准 + if (!"".equals(beanName.trim())) { + ioc.put(beanName, instance); + } else { + // 如果没有指定,就以类名首字母小写 + beanName = lowerFirst(clazz.getSimpleName()); + ioc.put(beanName, instance); + } + + // service层往往是有接口的,面向接口开发,此时再以接口名为id,放入一份对象到ioc中,便于后期根据接口类型注入 + Class[] interfaces = clazz.getInterfaces(); + + for (int j = 0; j < interfaces.length; j++) { + Class anInterface = interfaces[j]; + // 以接口的全限定类名作为id放入 + ioc.put(anInterface.getName(), clazz.newInstance()); + } + } else { + continue; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + // 扫描类 + // scanPackage: com.lagou.demo package----> 磁盘上的文件夹(File) com/lagou/demo + private void doScan(String scanPackage) { + + String scanPackagePath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + + scanPackage.replaceAll("\\.", "/"); + + File pack = new File(scanPackagePath); + + File[] files = pack.listFiles(); + + for (File file : files) { + if(file.isDirectory()) { // 子package + // 递归 + doScan(scanPackage + "." + file.getName()); // com.lagou.demo.controller + }else if(file.getName().endsWith(".class")) { + String className = scanPackage + "." + file.getName().replaceAll(".class", ""); + classNames.add(className); + } + } + + } + + // 加载配置文件 + private void doLoadConfig(String contextConfigLocation) { + + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(contextConfigLocation); + + try { + properties.load(resourceAsStream); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + // 首字母小写方法 + public String lowerFirst(String str) { + char[] chars = str.toCharArray(); + if('A' <= chars[0] && chars[0] <= 'Z') { + chars[0] += 32; + } + return String.valueOf(chars); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + doPost(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // 处理请求:根据url,找到对应的Method方法,进行调用 + // 获取uri + // String requestURI = req.getRequestURI(); + // Method method = handlerMapping.get(requestURI);// 获取到一个反射的方法 + // 反射调用,需要传入对象,需要传入参数,此处无法完成调用,没有把对象缓存起来,也没有参数!!!!改造initHandlerMapping(); + // method.invoke() + + + // 根据uri获取到能够处理当前请求的hanlder(从handlermapping中(list)) + Handler handler = getHandler(req); + + if (handler == null) { + resp.getWriter().write("404 not found"); + return; + } + + // 参数绑定 + // 获取所有参数类型数组,这个数组的长度就是我们最后要传入的args数组的长度 + Class[] parameterTypes = handler.getMethod().getParameterTypes(); + + + // 根据上述数组长度创建一个新的数组(参数数组,是要传入反射调用的) + Object[] paraValues = new Object[parameterTypes.length]; + + // 以下就是为了向参数数组中塞值,而且还得保证参数的顺序和方法中形参顺序一致 + + Map parameterMap = req.getParameterMap(); + + // 遍历request中所有参数 (填充除了request,response之外的参数) + for(Map.Entry param: parameterMap.entrySet()) { + // name=1&name=2 name [1,2] + String value = StringUtils.join(param.getValue(), ","); // 如同 1,2 + + // 如果参数和方法中的参数匹配上了,填充数据 + if(!handler.getParamIndexMapping().containsKey(param.getKey())) {continue;} + + // 方法形参确实有该参数,找到它的索引位置,对应的把参数值放入paraValues + Integer index = handler.getParamIndexMapping().get(param.getKey());//name在第 2 个位置 + + paraValues[index] = value; // 把前台传递过来的参数值填充到对应的位置去 + + } + + int requestIndex = handler.getParamIndexMapping().get(HttpServletRequest.class.getSimpleName()); // 0 + paraValues[requestIndex] = req; + + + int responseIndex = handler.getParamIndexMapping().get(HttpServletResponse.class.getSimpleName()); // 1 + paraValues[responseIndex] = resp; + + + // 最终调用handler的method属性 + try { + handler.getMethod().invoke(handler.getController(), paraValues); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + private Handler getHandler(HttpServletRequest req) { + if (handlerMapping.isEmpty()) { + return null; + } + + String url = req.getRequestURI(); + + for (Handler handler : handlerMapping) { + Matcher matcher = handler.getPattern().matcher(url); + + if (!matcher.matches()) { + continue; + } + + return handler; + } + return null; + } + + +} diff --git a/mvc/src/main/resources/springmvc.properties b/mvc/src/main/resources/springmvc.properties new file mode 100644 index 00000000..1171d682 --- /dev/null +++ b/mvc/src/main/resources/springmvc.properties @@ -0,0 +1 @@ +scanPackage=com.lemon.demo \ No newline at end of file diff --git a/mvc/src/main/webapp/WEB-INF/web.xml b/mvc/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..723a6c42 --- /dev/null +++ b/mvc/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,22 @@ + + + + Archetype Created Web Application + + + lgoumvc + com.lemon.mvcframework.servlet.LgDispatcherServlet + + contextConfigLocation + springmvc.properties + + + + + lgoumvc + /* + + + diff --git a/mvc/src/main/webapp/index.jsp b/mvc/src/main/webapp/index.jsp new file mode 100644 index 00000000..c38169bb --- /dev/null +++ b/mvc/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/mvc/target/classes/com/lemon/demo/controller/DemoController.class b/mvc/target/classes/com/lemon/demo/controller/DemoController.class new file mode 100644 index 00000000..10761085 Binary files /dev/null and b/mvc/target/classes/com/lemon/demo/controller/DemoController.class differ diff --git a/mvc/target/classes/com/lemon/demo/service/IDemoService.class b/mvc/target/classes/com/lemon/demo/service/IDemoService.class new file mode 100644 index 00000000..2bf49307 Binary files /dev/null and b/mvc/target/classes/com/lemon/demo/service/IDemoService.class differ diff --git a/mvc/target/classes/com/lemon/demo/service/impl/DemoServiceImpl.class b/mvc/target/classes/com/lemon/demo/service/impl/DemoServiceImpl.class new file mode 100644 index 00000000..8618bdd3 Binary files /dev/null and b/mvc/target/classes/com/lemon/demo/service/impl/DemoServiceImpl.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/annotations/LagouAutowired.class b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouAutowired.class new file mode 100644 index 00000000..e0b3512f Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouAutowired.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/annotations/LagouController.class b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouController.class new file mode 100644 index 00000000..ff015c16 Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouController.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/annotations/LagouRequestMapping.class b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouRequestMapping.class new file mode 100644 index 00000000..0785fb2d Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouRequestMapping.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/annotations/LagouService.class b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouService.class new file mode 100644 index 00000000..b09d5930 Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/annotations/LagouService.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/pojo/Handler.class b/mvc/target/classes/com/lemon/mvcframework/pojo/Handler.class new file mode 100644 index 00000000..b614e0d9 Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/pojo/Handler.class differ diff --git a/mvc/target/classes/com/lemon/mvcframework/servlet/LgDispatcherServlet.class b/mvc/target/classes/com/lemon/mvcframework/servlet/LgDispatcherServlet.class new file mode 100644 index 00000000..21ff8ccf Binary files /dev/null and b/mvc/target/classes/com/lemon/mvcframework/servlet/LgDispatcherServlet.class differ diff --git a/mvc/target/classes/springmvc.properties b/mvc/target/classes/springmvc.properties new file mode 100644 index 00000000..1171d682 --- /dev/null +++ b/mvc/target/classes/springmvc.properties @@ -0,0 +1 @@ +scanPackage=com.lemon.demo \ No newline at end of file diff --git a/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..728df232 --- /dev/null +++ b/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,9 @@ +com/lemon/demo/service/impl/DemoServiceImpl.class +com/lemon/mvcframework/annotations/LagouService.class +com/lemon/mvcframework/pojo/Handler.class +com/lemon/demo/controller/DemoController.class +com/lemon/mvcframework/annotations/LagouController.class +com/lemon/mvcframework/annotations/LagouRequestMapping.class +com/lemon/mvcframework/annotations/LagouAutowired.class +com/lemon/demo/service/IDemoService.class +com/lemon/mvcframework/servlet/LgDispatcherServlet.class diff --git a/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..50e2f792 --- /dev/null +++ b/mvc/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,9 @@ +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/demo/service/IDemoService.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouService.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouController.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/demo/controller/DemoController.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouAutowired.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/pojo/Handler.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/annotations/LagouRequestMapping.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/demo/service/impl/DemoServiceImpl.java +/Users/fangpeng/IDEAProjects/springmvc/mvc/src/main/java/com/lemon/mvcframework/servlet/LgDispatcherServlet.java diff --git a/mvc/target/tomcat/conf/logging.properties b/mvc/target/tomcat/conf/logging.properties new file mode 100644 index 00000000..76c9512b --- /dev/null +++ b/mvc/target/tomcat/conf/logging.properties @@ -0,0 +1,64 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +1catalina.org.apache.juli.FileHandler.level = FINE +1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +1catalina.org.apache.juli.FileHandler.prefix = catalina. + +2localhost.org.apache.juli.FileHandler.level = FINE +2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +2localhost.org.apache.juli.FileHandler.prefix = localhost. + +3manager.org.apache.juli.FileHandler.level = FINE +3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +3manager.org.apache.juli.FileHandler.prefix = manager. + +4host-manager.org.apache.juli.FileHandler.level = FINE +4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +4host-manager.org.apache.juli.FileHandler.prefix = host-manager. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler + +# For example, set the org.apache.catalina.util.LifecycleBase logger to log +# each component that extends LifecycleBase changing state: +#org.apache.catalina.util.LifecycleBase.level = FINE + +# To see debug messages in TldLocationsCache, uncomment the following line: +#org.apache.jasper.compiler.TldLocationsCache.level = FINE diff --git a/mvc/target/tomcat/conf/tomcat-users.xml b/mvc/target/tomcat/conf/tomcat-users.xml new file mode 100644 index 00000000..7114f5d1 --- /dev/null +++ b/mvc/target/tomcat/conf/tomcat-users.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/mvc/target/tomcat/conf/web.xml b/mvc/target/tomcat/conf/web.xml new file mode 100644 index 00000000..cc8383cb --- /dev/null +++ b/mvc/target/tomcat/conf/web.xml @@ -0,0 +1,4283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + org.apache.catalina.servlets.DefaultServlet + + debug + 0 + + + listings + false + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.apache.jasper.servlet.JspServlet + + fork + false + + + xpoweredBy + false + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + / + + + + + jsp + *.jsp + *.jspx + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + 123 + application/vnd.lotus-1-2-3 + + + 3dml + text/vnd.in3d.3dml + + + 3g2 + video/3gpp2 + + + 3gp + video/3gpp + + + 7z + application/x-7z-compressed + + + aab + application/x-authorware-bin + + + aac + audio/x-aac + + + aam + application/x-authorware-map + + + aas + application/x-authorware-seg + + + abs + audio/x-mpeg + + + abw + application/x-abiword + + + ac + application/pkix-attr-cert + + + acc + application/vnd.americandynamics.acc + + + ace + application/x-ace-compressed + + + acu + application/vnd.acucobol + + + acutc + application/vnd.acucorp + + + adp + audio/adpcm + + + aep + application/vnd.audiograph + + + afm + application/x-font-type1 + + + afp + application/vnd.ibm.modcap + + + ahead + application/vnd.ahead.space + + + ai + application/postscript + + + aif + audio/x-aiff + + + aifc + audio/x-aiff + + + aiff + audio/x-aiff + + + aim + application/x-aim + + + air + application/vnd.adobe.air-application-installer-package+zip + + + ait + application/vnd.dvb.ait + + + ami + application/vnd.amiga.ami + + + anx + application/annodex + + + apk + application/vnd.android.package-archive + + + application + application/x-ms-application + + + apr + application/vnd.lotus-approach + + + art + image/x-jg + + + asc + application/pgp-signature + + + asf + video/x-ms-asf + + + asm + text/x-asm + + + aso + application/vnd.accpac.simply.aso + + + asx + video/x-ms-asf + + + atc + application/vnd.acucorp + + + atom + application/atom+xml + + + atomcat + application/atomcat+xml + + + atomsvc + application/atomsvc+xml + + + atx + application/vnd.antix.game-component + + + au + audio/basic + + + avi + video/x-msvideo + + + avx + video/x-rad-screenplay + + + aw + application/applixware + + + axa + audio/annodex + + + axv + video/annodex + + + azf + application/vnd.airzip.filesecure.azf + + + azs + application/vnd.airzip.filesecure.azs + + + azw + application/vnd.amazon.ebook + + + bat + application/x-msdownload + + + bcpio + application/x-bcpio + + + bdf + application/x-font-bdf + + + bdm + application/vnd.syncml.dm+wbxml + + + bed + application/vnd.realvnc.bed + + + bh2 + application/vnd.fujitsu.oasysprs + + + bin + application/octet-stream + + + bmi + application/vnd.bmi + + + bmp + image/bmp + + + body + text/html + + + book + application/vnd.framemaker + + + box + application/vnd.previewsystems.box + + + boz + application/x-bzip2 + + + bpk + application/octet-stream + + + btif + image/prs.btif + + + bz + application/x-bzip + + + bz2 + application/x-bzip2 + + + c + text/x-c + + + c11amc + application/vnd.cluetrust.cartomobile-config + + + c11amz + application/vnd.cluetrust.cartomobile-config-pkg + + + c4d + application/vnd.clonk.c4group + + + c4f + application/vnd.clonk.c4group + + + c4g + application/vnd.clonk.c4group + + + c4p + application/vnd.clonk.c4group + + + c4u + application/vnd.clonk.c4group + + + cab + application/vnd.ms-cab-compressed + + + cap + application/vnd.tcpdump.pcap + + + car + application/vnd.curl.car + + + cat + application/vnd.ms-pki.seccat + + + cc + text/x-c + + + cct + application/x-director + + + ccxml + application/ccxml+xml + + + cdbcmsg + application/vnd.contact.cmsg + + + cdf + application/x-cdf + + + cdkey + application/vnd.mediastation.cdkey + + + cdmia + application/cdmi-capability + + + cdmic + application/cdmi-container + + + cdmid + application/cdmi-domain + + + cdmio + application/cdmi-object + + + cdmiq + application/cdmi-queue + + + cdx + chemical/x-cdx + + + cdxml + application/vnd.chemdraw+xml + + + cdy + application/vnd.cinderella + + + cer + application/pkix-cert + + + cgm + image/cgm + + + chat + application/x-chat + + + chm + application/vnd.ms-htmlhelp + + + chrt + application/vnd.kde.kchart + + + cif + chemical/x-cif + + + cii + application/vnd.anser-web-certificate-issue-initiation + + + cil + application/vnd.ms-artgalry + + + cla + application/vnd.claymore + + + class + application/java + + + clkk + application/vnd.crick.clicker.keyboard + + + clkp + application/vnd.crick.clicker.palette + + + clkt + application/vnd.crick.clicker.template + + + clkw + application/vnd.crick.clicker.wordbank + + + clkx + application/vnd.crick.clicker + + + clp + application/x-msclip + + + cmc + application/vnd.cosmocaller + + + cmdf + chemical/x-cmdf + + + cml + chemical/x-cml + + + cmp + application/vnd.yellowriver-custom-menu + + + cmx + image/x-cmx + + + cod + application/vnd.rim.cod + + + com + application/x-msdownload + + + conf + text/plain + + + cpio + application/x-cpio + + + cpp + text/x-c + + + cpt + application/mac-compactpro + + + crd + application/x-mscardfile + + + crl + application/pkix-crl + + + crt + application/x-x509-ca-cert + + + cryptonote + application/vnd.rig.cryptonote + + + csh + application/x-csh + + + csml + chemical/x-csml + + + csp + application/vnd.commonspace + + + css + text/css + + + cst + application/x-director + + + csv + text/csv + + + cu + application/cu-seeme + + + curl + text/vnd.curl + + + cww + application/prs.cww + + + cxt + application/x-director + + + cxx + text/x-c + + + dae + model/vnd.collada+xml + + + daf + application/vnd.mobius.daf + + + dataless + application/vnd.fdsn.seed + + + davmount + application/davmount+xml + + + dcr + application/x-director + + + dcurl + text/vnd.curl.dcurl + + + dd2 + application/vnd.oma.dd2+xml + + + ddd + application/vnd.fujixerox.ddd + + + deb + application/x-debian-package + + + def + text/plain + + + deploy + application/octet-stream + + + der + application/x-x509-ca-cert + + + dfac + application/vnd.dreamfactory + + + dib + image/bmp + + + dic + text/x-c + + + dir + application/x-director + + + dis + application/vnd.mobius.dis + + + dist + application/octet-stream + + + distz + application/octet-stream + + + djv + image/vnd.djvu + + + djvu + image/vnd.djvu + + + dll + application/x-msdownload + + + dmg + application/octet-stream + + + dmp + application/vnd.tcpdump.pcap + + + dms + application/octet-stream + + + dna + application/vnd.dna + + + doc + application/msword + + + docm + application/vnd.ms-word.document.macroenabled.12 + + + docx + application/vnd.openxmlformats-officedocument.wordprocessingml.document + + + dot + application/msword + + + dotm + application/vnd.ms-word.template.macroenabled.12 + + + dotx + application/vnd.openxmlformats-officedocument.wordprocessingml.template + + + dp + application/vnd.osgi.dp + + + dpg + application/vnd.dpgraph + + + dra + audio/vnd.dra + + + dsc + text/prs.lines.tag + + + dssc + application/dssc+der + + + dtb + application/x-dtbook+xml + + + dtd + application/xml-dtd + + + dts + audio/vnd.dts + + + dtshd + audio/vnd.dts.hd + + + dump + application/octet-stream + + + dv + video/x-dv + + + dvb + video/vnd.dvb.file + + + dvi + application/x-dvi + + + dwf + model/vnd.dwf + + + dwg + image/vnd.dwg + + + dxf + image/vnd.dxf + + + dxp + application/vnd.spotfire.dxp + + + dxr + application/x-director + + + ecelp4800 + audio/vnd.nuera.ecelp4800 + + + ecelp7470 + audio/vnd.nuera.ecelp7470 + + + ecelp9600 + audio/vnd.nuera.ecelp9600 + + + ecma + application/ecmascript + + + edm + application/vnd.novadigm.edm + + + edx + application/vnd.novadigm.edx + + + efif + application/vnd.picsel + + + ei6 + application/vnd.pg.osasli + + + elc + application/octet-stream + + + eml + message/rfc822 + + + emma + application/emma+xml + + + eol + audio/vnd.digital-winds + + + eot + application/vnd.ms-fontobject + + + eps + application/postscript + + + epub + application/epub+zip + + + es3 + application/vnd.eszigno3+xml + + + esf + application/vnd.epson.esf + + + et3 + application/vnd.eszigno3+xml + + + etx + text/x-setext + + + exe + application/octet-stream + + + exi + application/exi + + + ext + application/vnd.novadigm.ext + + + ez + application/andrew-inset + + + ez2 + application/vnd.ezpix-album + + + ez3 + application/vnd.ezpix-package + + + f + text/x-fortran + + + f4v + video/x-f4v + + + f77 + text/x-fortran + + + f90 + text/x-fortran + + + fbs + image/vnd.fastbidsheet + + + fcs + application/vnd.isac.fcs + + + fdf + application/vnd.fdf + + + fe_launch + application/vnd.denovo.fcselayout-link + + + fg5 + application/vnd.fujitsu.oasysgp + + + fgd + application/x-director + + + fh + image/x-freehand + + + fh4 + image/x-freehand + + + fh5 + image/x-freehand + + + fh7 + image/x-freehand + + + fhc + image/x-freehand + + + fig + application/x-xfig + + + flac + audio/flac + + + fli + video/x-fli + + + flo + application/vnd.micrografx.flo + + + flv + video/x-flv + + + flw + application/vnd.kde.kivio + + + flx + text/vnd.fmi.flexstor + + + fly + text/vnd.fly + + + fm + application/vnd.framemaker + + + fnc + application/vnd.frogans.fnc + + + for + text/x-fortran + + + fpx + image/vnd.fpx + + + frame + application/vnd.framemaker + + + fsc + application/vnd.fsc.weblaunch + + + fst + image/vnd.fst + + + ftc + application/vnd.fluxtime.clip + + + fti + application/vnd.anser-web-funds-transfer-initiation + + + fvt + video/vnd.fvt + + + fxp + application/vnd.adobe.fxp + + + fxpl + application/vnd.adobe.fxp + + + fzs + application/vnd.fuzzysheet + + + g2w + application/vnd.geoplan + + + g3 + image/g3fax + + + g3w + application/vnd.geospace + + + gac + application/vnd.groove-account + + + gbr + application/rpki-ghostbusters + + + gdl + model/vnd.gdl + + + geo + application/vnd.dynageo + + + gex + application/vnd.geometry-explorer + + + ggb + application/vnd.geogebra.file + + + ggt + application/vnd.geogebra.tool + + + ghf + application/vnd.groove-help + + + gif + image/gif + + + gim + application/vnd.groove-identity-message + + + gmx + application/vnd.gmx + + + gnumeric + application/x-gnumeric + + + gph + application/vnd.flographit + + + gqf + application/vnd.grafeq + + + gqs + application/vnd.grafeq + + + gram + application/srgs + + + gre + application/vnd.geometry-explorer + + + grv + application/vnd.groove-injector + + + grxml + application/srgs+xml + + + gsf + application/x-font-ghostscript + + + gtar + application/x-gtar + + + gtm + application/vnd.groove-tool-message + + + gtw + model/vnd.gtw + + + gv + text/vnd.graphviz + + + gxt + application/vnd.geonext + + + gz + application/x-gzip + + + h + text/x-c + + + h261 + video/h261 + + + h263 + video/h263 + + + h264 + video/h264 + + + hal + application/vnd.hal+xml + + + hbci + application/vnd.hbci + + + hdf + application/x-hdf + + + hh + text/x-c + + + hlp + application/winhlp + + + hpgl + application/vnd.hp-hpgl + + + hpid + application/vnd.hp-hpid + + + hps + application/vnd.hp-hps + + + hqx + application/mac-binhex40 + + + htc + text/x-component + + + htke + application/vnd.kenameaapp + + + htm + text/html + + + html + text/html + + + hvd + application/vnd.yamaha.hv-dic + + + hvp + application/vnd.yamaha.hv-voice + + + hvs + application/vnd.yamaha.hv-script + + + i2g + application/vnd.intergeo + + + icc + application/vnd.iccprofile + + + ice + x-conference/x-cooltalk + + + icm + application/vnd.iccprofile + + + ico + image/x-icon + + + ics + text/calendar + + + ief + image/ief + + + ifb + text/calendar + + + ifm + application/vnd.shana.informed.formdata + + + iges + model/iges + + + igl + application/vnd.igloader + + + igm + application/vnd.insors.igm + + + igs + model/iges + + + igx + application/vnd.micrografx.igx + + + iif + application/vnd.shana.informed.interchange + + + imp + application/vnd.accpac.simply.imp + + + ims + application/vnd.ms-ims + + + in + text/plain + + + ink + application/inkml+xml + + + inkml + application/inkml+xml + + + iota + application/vnd.astraea-software.iota + + + ipfix + application/ipfix + + + ipk + application/vnd.shana.informed.package + + + irm + application/vnd.ibm.rights-management + + + irp + application/vnd.irepository.package+xml + + + iso + application/octet-stream + + + itp + application/vnd.shana.informed.formtemplate + + + ivp + application/vnd.immervision-ivp + + + ivu + application/vnd.immervision-ivu + + + jad + text/vnd.sun.j2me.app-descriptor + + + jam + application/vnd.jam + + + jar + application/java-archive + + + java + text/x-java-source + + + jisp + application/vnd.jisp + + + jlt + application/vnd.hp-jlyt + + + jnlp + application/x-java-jnlp-file + + + joda + application/vnd.joost.joda-archive + + + jpe + image/jpeg + + + jpeg + image/jpeg + + + jpg + image/jpeg + + + jpgm + video/jpm + + + jpgv + video/jpeg + + + jpm + video/jpm + + + js + application/javascript + + + jsf + text/plain + + + json + application/json + + + jspf + text/plain + + + kar + audio/midi + + + karbon + application/vnd.kde.karbon + + + kfo + application/vnd.kde.kformula + + + kia + application/vnd.kidspiration + + + kml + application/vnd.google-earth.kml+xml + + + kmz + application/vnd.google-earth.kmz + + + kne + application/vnd.kinar + + + knp + application/vnd.kinar + + + kon + application/vnd.kde.kontour + + + kpr + application/vnd.kde.kpresenter + + + kpt + application/vnd.kde.kpresenter + + + ksp + application/vnd.kde.kspread + + + ktr + application/vnd.kahootz + + + ktx + image/ktx + + + ktz + application/vnd.kahootz + + + kwd + application/vnd.kde.kword + + + kwt + application/vnd.kde.kword + + + lasxml + application/vnd.las.las+xml + + + latex + application/x-latex + + + lbd + application/vnd.llamagraphics.life-balance.desktop + + + lbe + application/vnd.llamagraphics.life-balance.exchange+xml + + + les + application/vnd.hhe.lesson-player + + + lha + application/octet-stream + + + link66 + application/vnd.route66.link66+xml + + + list + text/plain + + + list3820 + application/vnd.ibm.modcap + + + listafp + application/vnd.ibm.modcap + + + log + text/plain + + + lostxml + application/lost+xml + + + lrf + application/octet-stream + + + lrm + application/vnd.ms-lrm + + + ltf + application/vnd.frogans.ltf + + + lvp + audio/vnd.lucent.voice + + + lwp + application/vnd.lotus-wordpro + + + lzh + application/octet-stream + + + m13 + application/x-msmediaview + + + m14 + application/x-msmediaview + + + m1v + video/mpeg + + + m21 + application/mp21 + + + m2a + audio/mpeg + + + m2v + video/mpeg + + + m3a + audio/mpeg + + + m3u + audio/x-mpegurl + + + m3u8 + application/vnd.apple.mpegurl + + + m4a + audio/mp4 + + + m4b + audio/mp4 + + + m4r + audio/mp4 + + + m4u + video/vnd.mpegurl + + + m4v + video/mp4 + + + ma + application/mathematica + + + mac + image/x-macpaint + + + mads + application/mads+xml + + + mag + application/vnd.ecowin.chart + + + maker + application/vnd.framemaker + + + man + text/troff + + + mathml + application/mathml+xml + + + mb + application/mathematica + + + mbk + application/vnd.mobius.mbk + + + mbox + application/mbox + + + mc1 + application/vnd.medcalcdata + + + mcd + application/vnd.mcd + + + mcurl + text/vnd.curl.mcurl + + + mdb + application/x-msaccess + + + mdi + image/vnd.ms-modi + + + me + text/troff + + + mesh + model/mesh + + + meta4 + application/metalink4+xml + + + mets + application/mets+xml + + + mfm + application/vnd.mfmp + + + mft + application/rpki-manifest + + + mgp + application/vnd.osgeo.mapguide.package + + + mgz + application/vnd.proteus.magazine + + + mid + audio/midi + + + midi + audio/midi + + + mif + application/x-mif + + + mime + message/rfc822 + + + mj2 + video/mj2 + + + mjp2 + video/mj2 + + + mlp + application/vnd.dolby.mlp + + + mmd + application/vnd.chipnuts.karaoke-mmd + + + mmf + application/vnd.smaf + + + mmr + image/vnd.fujixerox.edmics-mmr + + + mny + application/x-msmoney + + + mobi + application/x-mobipocket-ebook + + + mods + application/mods+xml + + + mov + video/quicktime + + + movie + video/x-sgi-movie + + + mp1 + audio/mpeg + + + mp2 + audio/mpeg + + + mp21 + application/mp21 + + + mp2a + audio/mpeg + + + mp3 + audio/mpeg + + + mp4 + video/mp4 + + + mp4a + audio/mp4 + + + mp4s + application/mp4 + + + mp4v + video/mp4 + + + mpa + audio/mpeg + + + mpc + application/vnd.mophun.certificate + + + mpe + video/mpeg + + + mpeg + video/mpeg + + + mpega + audio/x-mpeg + + + mpg + video/mpeg + + + mpg4 + video/mp4 + + + mpga + audio/mpeg + + + mpkg + application/vnd.apple.installer+xml + + + mpm + application/vnd.blueice.multipass + + + mpn + application/vnd.mophun.application + + + mpp + application/vnd.ms-project + + + mpt + application/vnd.ms-project + + + mpv2 + video/mpeg2 + + + mpy + application/vnd.ibm.minipay + + + mqy + application/vnd.mobius.mqy + + + mrc + application/marc + + + mrcx + application/marcxml+xml + + + ms + text/troff + + + mscml + application/mediaservercontrol+xml + + + mseed + application/vnd.fdsn.mseed + + + mseq + application/vnd.mseq + + + msf + application/vnd.epson.msf + + + msh + model/mesh + + + msi + application/x-msdownload + + + msl + application/vnd.mobius.msl + + + msty + application/vnd.muvee.style + + + mts + model/vnd.mts + + + mus + application/vnd.musician + + + musicxml + application/vnd.recordare.musicxml+xml + + + mvb + application/x-msmediaview + + + mwf + application/vnd.mfer + + + mxf + application/mxf + + + mxl + application/vnd.recordare.musicxml + + + mxml + application/xv+xml + + + mxs + application/vnd.triscape.mxs + + + mxu + video/vnd.mpegurl + + + n-gage + application/vnd.nokia.n-gage.symbian.install + + + n3 + text/n3 + + + nb + application/mathematica + + + nbp + application/vnd.wolfram.player + + + nc + application/x-netcdf + + + ncx + application/x-dtbncx+xml + + + ngdat + application/vnd.nokia.n-gage.data + + + nlu + application/vnd.neurolanguage.nlu + + + nml + application/vnd.enliven + + + nnd + application/vnd.noblenet-directory + + + nns + application/vnd.noblenet-sealer + + + nnw + application/vnd.noblenet-web + + + npx + image/vnd.net-fpx + + + nsf + application/vnd.lotus-notes + + + oa2 + application/vnd.fujitsu.oasys2 + + + oa3 + application/vnd.fujitsu.oasys3 + + + oas + application/vnd.fujitsu.oasys + + + obd + application/x-msbinder + + + oda + application/oda + + + + odb + application/vnd.oasis.opendocument.database + + + + odc + application/vnd.oasis.opendocument.chart + + + + odf + application/vnd.oasis.opendocument.formula + + + odft + application/vnd.oasis.opendocument.formula-template + + + + odg + application/vnd.oasis.opendocument.graphics + + + + odi + application/vnd.oasis.opendocument.image + + + + odm + application/vnd.oasis.opendocument.text-master + + + + odp + application/vnd.oasis.opendocument.presentation + + + + ods + application/vnd.oasis.opendocument.spreadsheet + + + + odt + application/vnd.oasis.opendocument.text + + + oga + audio/ogg + + + ogg + audio/ogg + + + ogv + video/ogg + + + + ogx + application/ogg + + + onepkg + application/onenote + + + onetmp + application/onenote + + + onetoc + application/onenote + + + onetoc2 + application/onenote + + + opf + application/oebps-package+xml + + + oprc + application/vnd.palm + + + org + application/vnd.lotus-organizer + + + osf + application/vnd.yamaha.openscoreformat + + + osfpvg + application/vnd.yamaha.openscoreformat.osfpvg+xml + + + otc + application/vnd.oasis.opendocument.chart-template + + + otf + application/x-font-otf + + + + otg + application/vnd.oasis.opendocument.graphics-template + + + + oth + application/vnd.oasis.opendocument.text-web + + + oti + application/vnd.oasis.opendocument.image-template + + + + otp + application/vnd.oasis.opendocument.presentation-template + + + + ots + application/vnd.oasis.opendocument.spreadsheet-template + + + + ott + application/vnd.oasis.opendocument.text-template + + + oxps + application/oxps + + + oxt + application/vnd.openofficeorg.extension + + + p + text/x-pascal + + + p10 + application/pkcs10 + + + p12 + application/x-pkcs12 + + + p7b + application/x-pkcs7-certificates + + + p7c + application/pkcs7-mime + + + p7m + application/pkcs7-mime + + + p7r + application/x-pkcs7-certreqresp + + + p7s + application/pkcs7-signature + + + p8 + application/pkcs8 + + + pas + text/x-pascal + + + paw + application/vnd.pawaafile + + + pbd + application/vnd.powerbuilder6 + + + pbm + image/x-portable-bitmap + + + pcap + application/vnd.tcpdump.pcap + + + pcf + application/x-font-pcf + + + pcl + application/vnd.hp-pcl + + + pclxl + application/vnd.hp-pclxl + + + pct + image/pict + + + pcurl + application/vnd.curl.pcurl + + + pcx + image/x-pcx + + + pdb + application/vnd.palm + + + pdf + application/pdf + + + pfa + application/x-font-type1 + + + pfb + application/x-font-type1 + + + pfm + application/x-font-type1 + + + pfr + application/font-tdpfr + + + pfx + application/x-pkcs12 + + + pgm + image/x-portable-graymap + + + pgn + application/x-chess-pgn + + + pgp + application/pgp-encrypted + + + pic + image/pict + + + pict + image/pict + + + pkg + application/octet-stream + + + pki + application/pkixcmp + + + pkipath + application/pkix-pkipath + + + plb + application/vnd.3gpp.pic-bw-large + + + plc + application/vnd.mobius.plc + + + plf + application/vnd.pocketlearn + + + pls + audio/x-scpls + + + pml + application/vnd.ctc-posml + + + png + image/png + + + pnm + image/x-portable-anymap + + + pnt + image/x-macpaint + + + portpkg + application/vnd.macports.portpkg + + + pot + application/vnd.ms-powerpoint + + + potm + application/vnd.ms-powerpoint.template.macroenabled.12 + + + potx + application/vnd.openxmlformats-officedocument.presentationml.template + + + ppam + application/vnd.ms-powerpoint.addin.macroenabled.12 + + + ppd + application/vnd.cups-ppd + + + ppm + image/x-portable-pixmap + + + pps + application/vnd.ms-powerpoint + + + ppsm + application/vnd.ms-powerpoint.slideshow.macroenabled.12 + + + ppsx + application/vnd.openxmlformats-officedocument.presentationml.slideshow + + + ppt + application/vnd.ms-powerpoint + + + pptm + application/vnd.ms-powerpoint.presentation.macroenabled.12 + + + pptx + application/vnd.openxmlformats-officedocument.presentationml.presentation + + + pqa + application/vnd.palm + + + prc + application/x-mobipocket-ebook + + + pre + application/vnd.lotus-freelance + + + prf + application/pics-rules + + + ps + application/postscript + + + psb + application/vnd.3gpp.pic-bw-small + + + psd + image/vnd.adobe.photoshop + + + psf + application/x-font-linux-psf + + + pskcxml + application/pskc+xml + + + ptid + application/vnd.pvi.ptid1 + + + pub + application/x-mspublisher + + + pvb + application/vnd.3gpp.pic-bw-var + + + pwn + application/vnd.3m.post-it-notes + + + pya + audio/vnd.ms-playready.media.pya + + + pyv + video/vnd.ms-playready.media.pyv + + + qam + application/vnd.epson.quickanime + + + qbo + application/vnd.intu.qbo + + + qfx + application/vnd.intu.qfx + + + qps + application/vnd.publishare-delta-tree + + + qt + video/quicktime + + + qti + image/x-quicktime + + + qtif + image/x-quicktime + + + qwd + application/vnd.quark.quarkxpress + + + qwt + application/vnd.quark.quarkxpress + + + qxb + application/vnd.quark.quarkxpress + + + qxd + application/vnd.quark.quarkxpress + + + qxl + application/vnd.quark.quarkxpress + + + qxt + application/vnd.quark.quarkxpress + + + ra + audio/x-pn-realaudio + + + ram + audio/x-pn-realaudio + + + rar + application/x-rar-compressed + + + ras + image/x-cmu-raster + + + rcprofile + application/vnd.ipunplugged.rcprofile + + + rdf + application/rdf+xml + + + rdz + application/vnd.data-vision.rdz + + + rep + application/vnd.businessobjects + + + res + application/x-dtbresource+xml + + + rgb + image/x-rgb + + + rif + application/reginfo+xml + + + rip + audio/vnd.rip + + + rl + application/resource-lists+xml + + + rlc + image/vnd.fujixerox.edmics-rlc + + + rld + application/resource-lists-diff+xml + + + rm + application/vnd.rn-realmedia + + + rmi + audio/midi + + + rmp + audio/x-pn-realaudio-plugin + + + rms + application/vnd.jcp.javame.midlet-rms + + + rnc + application/relax-ng-compact-syntax + + + roa + application/rpki-roa + + + roff + text/troff + + + rp9 + application/vnd.cloanto.rp9 + + + rpss + application/vnd.nokia.radio-presets + + + rpst + application/vnd.nokia.radio-preset + + + rq + application/sparql-query + + + rs + application/rls-services+xml + + + rsd + application/rsd+xml + + + rss + application/rss+xml + + + rtf + application/rtf + + + rtx + text/richtext + + + s + text/x-asm + + + saf + application/vnd.yamaha.smaf-audio + + + sbml + application/sbml+xml + + + sc + application/vnd.ibm.secure-container + + + scd + application/x-msschedule + + + scm + application/vnd.lotus-screencam + + + scq + application/scvp-cv-request + + + scs + application/scvp-cv-response + + + scurl + text/vnd.curl.scurl + + + sda + application/vnd.stardivision.draw + + + sdc + application/vnd.stardivision.calc + + + sdd + application/vnd.stardivision.impress + + + sdkd + application/vnd.solent.sdkm+xml + + + sdkm + application/vnd.solent.sdkm+xml + + + sdp + application/sdp + + + sdw + application/vnd.stardivision.writer + + + see + application/vnd.seemail + + + seed + application/vnd.fdsn.seed + + + sema + application/vnd.sema + + + semd + application/vnd.semd + + + semf + application/vnd.semf + + + ser + application/java-serialized-object + + + setpay + application/set-payment-initiation + + + setreg + application/set-registration-initiation + + + sfd-hdstx + application/vnd.hydrostatix.sof-data + + + sfs + application/vnd.spotfire.sfs + + + sgl + application/vnd.stardivision.writer-global + + + sgm + text/sgml + + + sgml + text/sgml + + + sh + application/x-sh + + + shar + application/x-shar + + + shf + application/shf+xml + + + + sig + application/pgp-signature + + + silo + model/mesh + + + sis + application/vnd.symbian.install + + + sisx + application/vnd.symbian.install + + + sit + application/x-stuffit + + + sitx + application/x-stuffitx + + + skd + application/vnd.koan + + + skm + application/vnd.koan + + + skp + application/vnd.koan + + + skt + application/vnd.koan + + + sldm + application/vnd.ms-powerpoint.slide.macroenabled.12 + + + sldx + application/vnd.openxmlformats-officedocument.presentationml.slide + + + slt + application/vnd.epson.salt + + + sm + application/vnd.stepmania.stepchart + + + smf + application/vnd.stardivision.math + + + smi + application/smil+xml + + + smil + application/smil+xml + + + smzip + application/vnd.stepmania.package + + + snd + audio/basic + + + snf + application/x-font-snf + + + so + application/octet-stream + + + spc + application/x-pkcs7-certificates + + + spf + application/vnd.yamaha.smaf-phrase + + + spl + application/x-futuresplash + + + spot + text/vnd.in3d.spot + + + spp + application/scvp-vp-response + + + spq + application/scvp-vp-request + + + spx + audio/ogg + + + src + application/x-wais-source + + + sru + application/sru+xml + + + srx + application/sparql-results+xml + + + sse + application/vnd.kodak-descriptor + + + ssf + application/vnd.epson.ssf + + + ssml + application/ssml+xml + + + st + application/vnd.sailingtracker.track + + + stc + application/vnd.sun.xml.calc.template + + + std + application/vnd.sun.xml.draw.template + + + stf + application/vnd.wt.stf + + + sti + application/vnd.sun.xml.impress.template + + + stk + application/hyperstudio + + + stl + application/vnd.ms-pki.stl + + + str + application/vnd.pg.format + + + stw + application/vnd.sun.xml.writer.template + + + sub + text/vnd.dvb.subtitle + + + sus + application/vnd.sus-calendar + + + susp + application/vnd.sus-calendar + + + sv4cpio + application/x-sv4cpio + + + sv4crc + application/x-sv4crc + + + svc + application/vnd.dvb.service + + + svd + application/vnd.svd + + + svg + image/svg+xml + + + svgz + image/svg+xml + + + swa + application/x-director + + + swf + application/x-shockwave-flash + + + swi + application/vnd.aristanetworks.swi + + + sxc + application/vnd.sun.xml.calc + + + sxd + application/vnd.sun.xml.draw + + + sxg + application/vnd.sun.xml.writer.global + + + sxi + application/vnd.sun.xml.impress + + + sxm + application/vnd.sun.xml.math + + + sxw + application/vnd.sun.xml.writer + + + t + text/troff + + + taglet + application/vnd.mynfc + + + tao + application/vnd.tao.intent-module-archive + + + tar + application/x-tar + + + tcap + application/vnd.3gpp2.tcap + + + tcl + application/x-tcl + + + teacher + application/vnd.smart.teacher + + + tei + application/tei+xml + + + teicorpus + application/tei+xml + + + tex + application/x-tex + + + texi + application/x-texinfo + + + texinfo + application/x-texinfo + + + text + text/plain + + + tfi + application/thraud+xml + + + tfm + application/x-tex-tfm + + + thmx + application/vnd.ms-officetheme + + + tif + image/tiff + + + tiff + image/tiff + + + tmo + application/vnd.tmobile-livetv + + + torrent + application/x-bittorrent + + + tpl + application/vnd.groove-tool-template + + + tpt + application/vnd.trid.tpt + + + tr + text/troff + + + tra + application/vnd.trueapp + + + trm + application/x-msterminal + + + tsd + application/timestamped-data + + + tsv + text/tab-separated-values + + + ttc + application/x-font-ttf + + + ttf + application/x-font-ttf + + + ttl + text/turtle + + + twd + application/vnd.simtech-mindmapper + + + twds + application/vnd.simtech-mindmapper + + + txd + application/vnd.genomatix.tuxedo + + + txf + application/vnd.mobius.txf + + + txt + text/plain + + + u32 + application/x-authorware-bin + + + udeb + application/x-debian-package + + + ufd + application/vnd.ufdl + + + ufdl + application/vnd.ufdl + + + ulw + audio/basic + + + umj + application/vnd.umajin + + + unityweb + application/vnd.unity + + + uoml + application/vnd.uoml+xml + + + uri + text/uri-list + + + uris + text/uri-list + + + urls + text/uri-list + + + ustar + application/x-ustar + + + utz + application/vnd.uiq.theme + + + uu + text/x-uuencode + + + uva + audio/vnd.dece.audio + + + uvd + application/vnd.dece.data + + + uvf + application/vnd.dece.data + + + uvg + image/vnd.dece.graphic + + + uvh + video/vnd.dece.hd + + + uvi + image/vnd.dece.graphic + + + uvm + video/vnd.dece.mobile + + + uvp + video/vnd.dece.pd + + + uvs + video/vnd.dece.sd + + + uvt + application/vnd.dece.ttml+xml + + + uvu + video/vnd.uvvu.mp4 + + + uvv + video/vnd.dece.video + + + uvva + audio/vnd.dece.audio + + + uvvd + application/vnd.dece.data + + + uvvf + application/vnd.dece.data + + + uvvg + image/vnd.dece.graphic + + + uvvh + video/vnd.dece.hd + + + uvvi + image/vnd.dece.graphic + + + uvvm + video/vnd.dece.mobile + + + uvvp + video/vnd.dece.pd + + + uvvs + video/vnd.dece.sd + + + uvvt + application/vnd.dece.ttml+xml + + + uvvu + video/vnd.uvvu.mp4 + + + uvvv + video/vnd.dece.video + + + uvvx + application/vnd.dece.unspecified + + + uvvz + application/vnd.dece.zip + + + uvx + application/vnd.dece.unspecified + + + uvz + application/vnd.dece.zip + + + vcard + text/vcard + + + vcd + application/x-cdlink + + + vcf + text/x-vcard + + + vcg + application/vnd.groove-vcard + + + vcs + text/x-vcalendar + + + vcx + application/vnd.vcx + + + vis + application/vnd.visionary + + + viv + video/vnd.vivo + + + vor + application/vnd.stardivision.writer + + + vox + application/x-authorware-bin + + + vrml + model/vrml + + + vsd + application/vnd.visio + + + vsf + application/vnd.vsf + + + vss + application/vnd.visio + + + vst + application/vnd.visio + + + vsw + application/vnd.visio + + + vtu + model/vnd.vtu + + + vxml + application/voicexml+xml + + + w3d + application/x-director + + + wad + application/x-doom + + + wav + audio/x-wav + + + wax + audio/x-ms-wax + + + + wbmp + image/vnd.wap.wbmp + + + wbs + application/vnd.criticaltools.wbs+xml + + + wbxml + application/vnd.wap.wbxml + + + wcm + application/vnd.ms-works + + + wdb + application/vnd.ms-works + + + weba + audio/webm + + + webm + video/webm + + + webp + image/webp + + + wg + application/vnd.pmi.widget + + + wgt + application/widget + + + wks + application/vnd.ms-works + + + wm + video/x-ms-wm + + + wma + audio/x-ms-wma + + + wmd + application/x-ms-wmd + + + wmf + application/x-msmetafile + + + + wml + text/vnd.wap.wml + + + + wmlc + application/vnd.wap.wmlc + + + + wmls + text/vnd.wap.wmlscript + + + + wmlsc + application/vnd.wap.wmlscriptc + + + wmv + video/x-ms-wmv + + + wmx + video/x-ms-wmx + + + wmz + application/x-ms-wmz + + + woff + application/x-font-woff + + + wpd + application/vnd.wordperfect + + + wpl + application/vnd.ms-wpl + + + wps + application/vnd.ms-works + + + wqd + application/vnd.wqd + + + wri + application/x-mswrite + + + wrl + model/vrml + + + wsdl + application/wsdl+xml + + + wspolicy + application/wspolicy+xml + + + wtb + application/vnd.webturbo + + + wvx + video/x-ms-wvx + + + x32 + application/x-authorware-bin + + + x3d + application/vnd.hzn-3d-crossword + + + xap + application/x-silverlight-app + + + xar + application/vnd.xara + + + xbap + application/x-ms-xbap + + + xbd + application/vnd.fujixerox.docuworks.binder + + + xbm + image/x-xbitmap + + + xdf + application/xcap-diff+xml + + + xdm + application/vnd.syncml.dm+xml + + + xdp + application/vnd.adobe.xdp+xml + + + xdssc + application/dssc+xml + + + xdw + application/vnd.fujixerox.docuworks + + + xenc + application/xenc+xml + + + xer + application/patch-ops-error+xml + + + xfdf + application/vnd.adobe.xfdf + + + xfdl + application/vnd.xfdl + + + xht + application/xhtml+xml + + + xhtml + application/xhtml+xml + + + xhvml + application/xv+xml + + + xif + image/vnd.xiff + + + xla + application/vnd.ms-excel + + + xlam + application/vnd.ms-excel.addin.macroenabled.12 + + + xlc + application/vnd.ms-excel + + + xlm + application/vnd.ms-excel + + + xls + application/vnd.ms-excel + + + xlsb + application/vnd.ms-excel.sheet.binary.macroenabled.12 + + + xlsm + application/vnd.ms-excel.sheet.macroenabled.12 + + + xlsx + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + + + xlt + application/vnd.ms-excel + + + xltm + application/vnd.ms-excel.template.macroenabled.12 + + + xltx + application/vnd.openxmlformats-officedocument.spreadsheetml.template + + + xlw + application/vnd.ms-excel + + + xml + application/xml + + + xo + application/vnd.olpc-sugar + + + xop + application/xop+xml + + + xpi + application/x-xpinstall + + + xpm + image/x-xpixmap + + + xpr + application/vnd.is-xpr + + + xps + application/vnd.ms-xpsdocument + + + xpw + application/vnd.intercon.formnet + + + xpx + application/vnd.intercon.formnet + + + xsl + application/xml + + + xslt + application/xslt+xml + + + xsm + application/vnd.syncml+xml + + + xspf + application/xspf+xml + + + xul + application/vnd.mozilla.xul+xml + + + xvm + application/xv+xml + + + xvml + application/xv+xml + + + xwd + image/x-xwindowdump + + + xyz + chemical/x-xyz + + + yang + application/yang + + + yin + application/yin+xml + + + z + application/x-compress + + + Z + application/x-compress + + + zaz + application/vnd.zzazz.deck+xml + + + zip + application/zip + + + zir + application/vnd.zul + + + zirz + application/vnd.zul + + + zmm + application/vnd.handheld-entertainment+xml + + + + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + diff --git a/mvc/target/tomcat/logs/access_log.2022-02-23 b/mvc/target/tomcat/logs/access_log.2022-02-23 new file mode 100644 index 00000000..b8f80bd9 --- /dev/null +++ b/mvc/target/tomcat/logs/access_log.2022-02-23 @@ -0,0 +1,16 @@ +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:04:48 +0800] "GET /demo/query HTTP/1.1" 405 1065 http-bio-8080-exec-1 32 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:04:48 +0800] "GET /favicon.ico HTTP/1.1" 405 1065 http-bio-8080-exec-3 0 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:35:22 +0800] "GET /demo/query HTTP/1.1" 405 1065 http-bio-8080-exec-1 36 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:35:22 +0800] "GET /favicon.ico HTTP/1.1" 405 1065 http-bio-8080-exec-3 0 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:36:54 +0800] "GET /demo/query?name=lisi HTTP/1.1" 405 1065 http-bio-8080-exec-5 1 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:36:54 +0800] "GET /favicon.ico HTTP/1.1" 405 1065 http-bio-8080-exec-7 0 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:37:33 +0800] "GET /demo/query?name=lisi HTTP/1.1" 500 1550 http-bio-8080-exec-1 38 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:37:33 +0800] "GET /favicon.ico HTTP/1.1" 200 13 http-bio-8080-exec-2 1 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:41:06 +0800] "GET /demo/query?name=lisi HTTP/1.1" 500 1550 http-bio-8080-exec-1 74239 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:44:42 +0800] "GET /demo/query?name=lisi HTTP/1.1" 500 1550 http-bio-8080-exec-1 205957 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:44:42 +0800] "GET /demo/query?name=lisi HTTP/1.1" 500 1550 http-bio-8080-exec-3 18 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:45:54 +0800] "GET /demo/query?name=lisi HTTP/1.1" 500 1550 http-bio-8080-exec-1 51330 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:46:10 +0800] "GET /demo/query?name=lisi HTTP/1.1" 200 - http-bio-8080-exec-1 38 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:46:10 +0800] "GET /favicon.ico HTTP/1.1" 200 13 http-bio-8080-exec-3 1 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:46:41 +0800] "GET /demo/query?name=lisi HTTP/1.1" 200 - http-bio-8080-exec-1 46 +0:0:0:0:0:0:0:1 - - [23/Feb/2022:22:46:41 +0800] "GET /favicon.ico HTTP/1.1" 200 13 http-bio-8080-exec-3 1 diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 9fba93a3..00000000 --- a/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - com.fangpeng - study - 1.0-SNAPSHOT - - - 8 - 8 - - - - - io.netty - netty-all - 4.1.56.Final - - - org.projectlombok - lombok - 1.16.18 - - - com.google.code.gson - gson - 2.8.5 - - - com.google.guava - guava - 19.0 - - - ch.qos.logback - logback-classic - 1.2.3 - - - com.google.protobuf - protobuf-java - 3.11.3 - - - cglib - cglib - 2.2.2 - - - dom4j - dom4j - 1.6.1 - - - redis.clients - jedis - 3.3.0 - - - - - org.quartz-scheduler - quartz - 2.3.2 - - - - - - - com.dangdang - elastic-job-lite-core - 2.1.5 - - - mysql - mysql-connector-java - 5.1.46 - - - - \ No newline at end of file diff --git a/springmvc-demo/.gitignore b/springmvc-demo/.gitignore new file mode 100644 index 00000000..efb4aab2 --- /dev/null +++ b/springmvc-demo/.gitignore @@ -0,0 +1,46 @@ +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Maven template +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +### Example user template template +### Example user template + +# IntelliJ project files +.idea +*.iml +out +gen diff --git a/springmvc-demo/pom.xml b/springmvc-demo/pom.xml new file mode 100644 index 00000000..8466a1c8 --- /dev/null +++ b/springmvc-demo/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + com.lemon + springmvc-demo + 1.0-SNAPSHOT + + mvc + + pom + + + UTF-8 + 8 + 8 + + + + + junit + junit + 4.12 + test + + + + + org.springframework + spring-webmvc + 5.1.12.RELEASE + + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + + com.fasterxml.jackson.core + jackson-core + 2.9.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.0 + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.0 + + + + + + commons-fileupload + commons-fileupload + 1.3.1 + + + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 8080 + / + + + + + \ No newline at end of file diff --git a/springmvc-demo/src/main/java/com/lemon/controller/DemoController.java b/springmvc-demo/src/main/java/com/lemon/controller/DemoController.java new file mode 100644 index 00000000..cc65a995 --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/controller/DemoController.java @@ -0,0 +1,332 @@ +package com.lemon.controller; + +import com.lemon.pojo.QueryVo; +import com.lemon.pojo.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.UUID; + +/** + * @Description: TODO + * @Author : Lemon-CS + * @Date : 2022年02月21日 3:38 下午 + */ +@Controller +@RequestMapping("/demo") +public class DemoController { + + + // SpringMVC的异常处理机制(异常处理器) + // 注意:写在这里只会对当前controller类生效 + @ExceptionHandler(ArithmeticException.class) + public void handleException(ArithmeticException exception,HttpServletResponse response) { + // 异常处理逻辑 + try { + response.getWriter().write(exception.getMessage()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * url: http://localhost:8080/demo/handle01 + */ + @RequestMapping("/handle01") + public ModelAndView handle01(@ModelAttribute("name") String name) { + + //int c = 1/0; + + + Date date = new Date();// 服务器时间 + // 返回服务器时间到前端页面 + // 封装了数据和页面信息的 ModelAndView + ModelAndView modelAndView = new ModelAndView(); + // addObject 其实是向请求域中request.setAttribute("date",date); + modelAndView.addObject("date",date); + // 视图信息(封装跳转的页面信息) 逻辑视图名 + modelAndView.setViewName("success"); + return modelAndView; + } + + + /** + * SpringMVC在handler方法上传入Map、Model和ModelMap参数,并向这些参数中保存数据(放入到请求域),都可以在页面获取到 + * + * 它们之间是什么关系? + * 运行时的具体类型都是BindingAwareModelMap,相当于给BindingAwareModelMap中保存的数据都会放在请求域中 + * + * Map(jdk中的接口) Model(spring的接口) + * + * ModelMap(class,实现Map接口) + * + * BindingAwareModelMap继承了ExtendedModelMap,ExtendedModelMap继承了ModelMap,实现了Model接口 + */ + + + /** + * 直接声明形参ModelMap,封装数据 + * url: http://localhost:8080/demo/handle11 + * + * =================modelmap:class org.springframework.validation.support.BindingAwareModelMap + */ + @RequestMapping("/handle11") + public String handle11(ModelMap modelMap) { + Date date = new Date();// 服务器时间 + modelMap.addAttribute("date",date); + System.out.println("=================modelmap:" + modelMap.getClass()); + return "success"; + } + + /** + * 直接声明形参Model,封装数据 + * url: http://localhost:8080/demo/handle12 + * =================model:class org.springframework.validation.support.BindingAwareModelMap + */ + @RequestMapping("/handle12") + public String handle12(Model model) { + Date date = new Date(); + model.addAttribute("date",date); + System.out.println("=================model:" + model.getClass()); + return "success"; + } + + /** + * 直接声明形参Map集合,封装数据 + * url: http://localhost:8080/demo/handle13 + * =================map:class org.springframework.validation.support.BindingAwareModelMap + */ + @RequestMapping("/handle13") + public String handle13(Map map) { + Date date = new Date(); + map.put("date",date); + System.out.println("=================map:" + map.getClass()); + return "success"; + } + + /** + * + * SpringMVC 对原生servlet api的支持 url:/demo/handle02?id=1 + * + * 如果要在SpringMVC中使用servlet原生对象,比如HttpServletRequest\HttpServletResponse\HttpSession,直接在Handler方法形参中声明使用即可 + * + */ + @RequestMapping("/handle02") + public ModelAndView handle02(HttpServletRequest request, HttpServletResponse response, HttpSession session) { + String id = request.getParameter("id"); + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * SpringMVC 接收简单数据类型参数 url:/demo/handle03?id=1 + * + * 注意:接收简单数据类型参数,直接在handler方法的形参中声明即可,框架会取出参数值然后绑定到对应参数上 + * 要求:传递的参数名和声明的形参名称保持一致 + */ + @RequestMapping("/handle03") + public ModelAndView handle03(@RequestParam("ids") Integer id, Boolean flag) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * SpringMVC接收pojo类型参数 url:/demo/handle04?id=1&username=zhangsan + * + * 接收pojo类型参数,直接形参声明即可,类型就是Pojo的类型,形参名无所谓 + * 但是要求传递的参数名必须和Pojo的属性名保持一致 + */ + @RequestMapping("/handle04") + public ModelAndView handle04(User user) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * SpringMVC接收pojo包装类型参数 url:/demo/handle05?user.id=1&user.username=zhangsan + * 不管包装Pojo与否,它首先是一个pojo,那么就可以按照上述pojo的要求来 + * 1、绑定时候直接形参声明即可 + * 2、传参参数名和pojo属性保持一致,如果不能够定位数据项,那么通过属性名 + "." 的方式进一步锁定数据 + * + */ + @RequestMapping("/handle05") + public ModelAndView handle05(QueryVo queryVo) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /** + * 绑定日期类型参数 + * 定义一个SpringMVC的类型转换器 接口,扩展实现接口接口,注册你的实现 + * @param birthday + * @return + */ + @RequestMapping("/handle06") + public ModelAndView handle06(Date birthday) { + Date date = new Date();ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + + /* + * restful get /demo/handle/15 + */ + @RequestMapping(value = "/handle/{id}",method = {RequestMethod.GET}) + public ModelAndView handleGet(@PathVariable("id") Integer id) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * restful post /demo/handle + */ + @RequestMapping(value = "/handle",method = {RequestMethod.POST}) + public ModelAndView handlePost(String username) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * restful put /demo/handle/15/lisi + */ + @RequestMapping(value = "/handle/{id}/{name}",method = {RequestMethod.PUT}) + public ModelAndView handlePut(@PathVariable("id") Integer id,@PathVariable("name") String username) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /* + * restful delete /demo/handle/15 + */ + @RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE}) + public ModelAndView handleDelete(@PathVariable("id") Integer id) { + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + + @RequestMapping("/handle07") + // 添加@ResponseBody之后,不再走视图解析器那个流程,而是等同于response直接输出数据 + @ResponseBody + public User handle07(@RequestBody User user) { + + // 业务逻辑处理,修改name为张三丰 + user.setName("张三丰"); + return user; + } + + + /** + * 文件上传 + * @return + */ + @RequestMapping(value = "/upload") + public ModelAndView upload(MultipartFile uploadFile, HttpSession session) throws IOException { + + // 处理上传文件 + // 重命名,原名123.jpg ,获取后缀 + String originalFilename = uploadFile.getOriginalFilename();// 原始名称 + // 扩展名 jpg + String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length()); + String newName = UUID.randomUUID().toString() + "." + ext; + + // 存储,要存储到指定的文件夹,/uploads/yyyy-MM-dd,考虑文件过多的情况按照日期,生成一个子文件夹 + String realPath = session.getServletContext().getRealPath("/uploads"); + String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + File folder = new File(realPath + "/" + datePath); + + if(!folder.exists()) { + folder.mkdirs(); + } + + + // 存储文件到目录 + uploadFile.transferTo(new File(folder,newName)); + + + // TODO 文件磁盘路径要更新到数据库字段 + + Date date = new Date(); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("date",date); + modelAndView.setViewName("success"); + return modelAndView; + } + + + /** + * SpringMVC 重定向时参数传递的问题 + * 转发:A 找 B 借钱400,B没有钱但是悄悄的找到C借了400块钱给A + * url不会变,参数也不会丢失,一个请求 + * 重定向:A 找 B 借钱400,B 说我没有钱,你找别人借去,那么A 又带着400块的借钱需求找到C + * url会变,参数会丢失需要重新携带参数,两个请求 + */ + + @RequestMapping("/handleRedirect") + public String handleRedirect(String name, RedirectAttributes redirectAttributes) { + + //return "redirect:handle01?name=" + name; // 拼接参数安全性、参数长度都有局限 + // addFlashAttribute方法设置了一个flash类型属性,该属性会被暂存到session中,在跳转到页面之后该属性销毁 + redirectAttributes.addFlashAttribute("name",name); + return "redirect:handle01"; + + } + + +} diff --git a/springmvc-demo/src/main/java/com/lemon/controller/GlobalExceptionResolver.java b/springmvc-demo/src/main/java/com/lemon/controller/GlobalExceptionResolver.java new file mode 100644 index 00000000..47644bee --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/controller/GlobalExceptionResolver.java @@ -0,0 +1,26 @@ +package com.lemon.controller; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletResponse; + +/** + * @Description: 全局异常处理 + * 可以让我们优雅的捕获所有Controller对象handler方法抛出的异常 + * @Author : Lemon-CS + * @Date : 2022年02月21日 11:31 下午 + */ +@ControllerAdvice +public class GlobalExceptionResolver { + + @ExceptionHandler(ArithmeticException.class) + public ModelAndView handleException(ArithmeticException exception, HttpServletResponse response) { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.addObject("msg",exception.getMessage()); + modelAndView.setViewName("error"); + return modelAndView; + } + +} diff --git a/springmvc-demo/src/main/java/com/lemon/converter/DateConverter.java b/springmvc-demo/src/main/java/com/lemon/converter/DateConverter.java new file mode 100644 index 00000000..0afe1629 --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/converter/DateConverter.java @@ -0,0 +1,30 @@ +package com.lemon.converter; + +import org.springframework.core.convert.converter.Converter; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author Lemon-CS + * 自定义类型转换器 + * S:source,源类型 + * T:target:目标类型 + */ +public class DateConverter implements Converter { + @Override + public Date convert(String source) { + // 完成字符串向日期的转换 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + try { + Date parse = simpleDateFormat.parse(source); + return parse; + } catch (ParseException e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter01.java b/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter01.java new file mode 100644 index 00000000..b38b28bb --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter01.java @@ -0,0 +1,57 @@ +package com.lemon.interceptor; + + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 自定义springmvc拦截器 + */ +public class MyIntercepter01 implements HandlerInterceptor { + + + /** + * 会在handler方法业务逻辑执行之前执行 + * 往往在这里完成权限校验工作 + * @param request + * @param response + * @param handler + * @return 返回值boolean代表是否放行,true代表放行,false代表中止 + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + System.out.println("MyIntercepter01 preHandle......"); + return true; + } + + + /** + * 会在handler方法业务逻辑执行之后尚未跳转页面时执行 + * @param request + * @param response + * @param handler + * @param modelAndView 封装了视图和数据,此时尚未跳转页面呢,你可以在这里针对返回的数据和视图信息进行修改 + * @throws Exception + */ + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("MyIntercepter01 postHandle......"); + } + + /** + * 页面已经跳转渲染完毕之后执行 + * @param request + * @param response + * @param handler + * @param ex 可以在这里捕获异常 + * @throws Exception + */ + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println("MyIntercepter01 afterCompletion......"); + } +} diff --git a/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter02.java b/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter02.java new file mode 100644 index 00000000..fa0da44a --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/interceptor/MyIntercepter02.java @@ -0,0 +1,57 @@ +package com.lemon.interceptor; + + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 自定义springmvc拦截器 + */ +public class MyIntercepter02 implements HandlerInterceptor { + + + /** + * 会在handler方法业务逻辑执行之前执行 + * 往往在这里完成权限校验工作 + * @param request + * @param response + * @param handler + * @return 返回值boolean代表是否放行,true代表放行,false代表中止 + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + System.out.println("MyIntercepter02 preHandle......"); + return true; + } + + + /** + * 会在handler方法业务逻辑执行之后尚未跳转页面时执行 + * @param request + * @param response + * @param handler + * @param modelAndView 封装了视图和数据,此时尚未跳转页面呢,你可以在这里针对返回的数据和视图信息进行修改 + * @throws Exception + */ + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("MyIntercepter02 postHandle......"); + } + + /** + * 页面已经跳转渲染完毕之后执行 + * @param request + * @param response + * @param handler + * @param ex 可以在这里捕获异常 + * @throws Exception + */ + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println("MyIntercepter02 afterCompletion......"); + } +} diff --git a/springmvc-demo/src/main/java/com/lemon/pojo/QueryVo.java b/springmvc-demo/src/main/java/com/lemon/pojo/QueryVo.java new file mode 100644 index 00000000..ab656e4f --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/pojo/QueryVo.java @@ -0,0 +1,37 @@ +package com.lemon.pojo; + +/** + * @author Lemon-CS + */ +public class QueryVo { + + private String mail; + private String phone; + + // 嵌套了另外的Pojo对象 + private User user; + + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/springmvc-demo/src/main/java/com/lemon/pojo/User.java b/springmvc-demo/src/main/java/com/lemon/pojo/User.java new file mode 100644 index 00000000..af1a0dd6 --- /dev/null +++ b/springmvc-demo/src/main/java/com/lemon/pojo/User.java @@ -0,0 +1,28 @@ +package com.lemon.pojo; + +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author Lemon-CS + */ +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/springmvc-demo/src/main/resources/springmvc.xml b/springmvc-demo/src/main/resources/springmvc.xml new file mode 100644 index 00000000..1575ea4d --- /dev/null +++ b/springmvc-demo/src/main/resources/springmvc.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/springmvc-demo/src/main/resources/test.html b/springmvc-demo/src/main/resources/test.html new file mode 100644 index 00000000..409dd7af --- /dev/null +++ b/springmvc-demo/src/main/resources/test.html @@ -0,0 +1,10 @@ + + + + + Title + + +hello,I am html. + + \ No newline at end of file diff --git a/springmvc-demo/src/main/webapp/WEB-INF/js/jquery.min.js b/springmvc-demo/src/main/webapp/WEB-INF/js/jquery.min.js new file mode 100755 index 00000000..16ad06c5 --- /dev/null +++ b/springmvc-demo/src/main/webapp/WEB-INF/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/springmvc-demo/src/main/webapp/WEB-INF/jsp/error.jsp b/springmvc-demo/src/main/webapp/WEB-INF/jsp/error.jsp new file mode 100644 index 00000000..6a175f93 --- /dev/null +++ b/springmvc-demo/src/main/webapp/WEB-INF/jsp/error.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" isELIgnored="false" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> + + + + + Insert title here + + + 异常信息: ${msg} + + \ No newline at end of file diff --git a/springmvc-demo/src/main/webapp/WEB-INF/jsp/success.jsp b/springmvc-demo/src/main/webapp/WEB-INF/jsp/success.jsp new file mode 100644 index 00000000..5c3dfabb --- /dev/null +++ b/springmvc-demo/src/main/webapp/WEB-INF/jsp/success.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" isELIgnored="false" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> + + + + + Insert title here + + + 跳转成功!服务器时间:${date} + + \ No newline at end of file diff --git a/springmvc-demo/src/main/webapp/WEB-INF/web.xml b/springmvc-demo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..2abc97d7 --- /dev/null +++ b/springmvc-demo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,75 @@ + + + + Archetype Created Web Application + + + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + + + + hiddenHttpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + + + encoding + /* + + + + + hiddenHttpMethodFilter + /* + + + + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + springmvc + + + + / + + diff --git a/springmvc-demo/src/main/webapp/index.jsp b/springmvc-demo/src/main/webapp/index.jsp new file mode 100644 index 00000000..1c526541 --- /dev/null +++ b/springmvc-demo/src/main/webapp/index.jsp @@ -0,0 +1,125 @@ +<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %> + + + SpringMVC 测试页 + + + + + + + + + + +
+

Spring MVC 请求参数绑定

+
+

测试用例:SpringMVC 对原生servlet api的支持

+ 点击测试 +
+
+

测试用例:SpringMVC 接收简单数据类型参数

+ 点击测试 +
+
+

测试用例:SpringMVC 使用@RequestParam 接收简单数据类型参数(形参名和参数名不一致)

+
+ +
+

测试用例:SpringMVC接收pojo类型参数

+ 点击测试 +
+ +
+

测试用例:SpringMVC接收pojo包装类型参数

+ 点击测试 +
+ +
+

测试用例:SpringMVC接收日期类型参数

+ 点击测试 +
+
+ + +
+

SpringMVC对Restful风格url的支持

+
+

测试用例:SpringMVC对Restful风格url的支持

+ + rest_get测试 + + +
+ + + + + +
+ + + + + +
+ + + +
+
+ + + +
+

Ajax json交互

+
+ +
+
+ + +
+

multipart 文件上传

+
+ <%-- + 1 method="post" + 2 enctype="multipart/form-data" + 3 type="file" + --%> +
+ + + +
+
+ + + + + diff --git a/springmvc-demo/src/main/webapp/uploads/2020-08-08/1f6337fa-ce74-43da-8520-d4beac9e7c7b.mdj b/springmvc-demo/src/main/webapp/uploads/2020-08-08/1f6337fa-ce74-43da-8520-d4beac9e7c7b.mdj new file mode 100644 index 00000000..f968d2a9 --- /dev/null +++ b/springmvc-demo/src/main/webapp/uploads/2020-08-08/1f6337fa-ce74-43da-8520-d4beac9e7c7b.mdj @@ -0,0 +1,2900 @@ +{ + "_type": "Project", + "_id": "AAAAAAFF+h6SjaM2Hec=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFF+qBWK6M3Z8Y=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "spring源码分析", + "ownedElements": [ + { + "_type": "UMLClassDiagram", + "_id": "AAAAAAFF+qBtyKM79qY=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Main", + "defaultDiagram": true + }, + { + "_type": "UMLCollaboration", + "_id": "AAAAAAFvB4ZPaUMTqOs=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Collaboration1", + "ownedElements": [ + { + "_type": "UMLInteraction", + "_id": "AAAAAAFvB4ZPaUMUJsE=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMTqOs=" + }, + "name": "Interaction1", + "ownedElements": [ + { + "_type": "UMLSequenceDiagram", + "_id": "AAAAAAFvB4ZPaUMV5FA=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "BeanFactory获取流程", + "ownedViews": [ + { + "_type": "UMLFrameView", + "_id": "AAAAAAFvB4ZPaUMWRp0=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB4ZPakMXeUk=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMWRp0=" + }, + "font": "Arial;13;0", + "left": 75.97900390625, + "top": 10, + "width": 126.70263671875, + "height": 13, + "text": "BeanFactory获取流程" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB4ZPakMYEKc=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMWRp0=" + }, + "font": "Arial;13;1", + "left": 10, + "top": 10, + "width": 60.97900390625, + "height": 13, + "text": "interaction" + } + ], + "font": "Arial;13;0", + "left": 5, + "top": 5, + "width": 1204, + "height": 884, + "nameLabel": { + "$ref": "AAAAAAFvB4ZPakMXeUk=" + }, + "frameTypeLabel": { + "$ref": "AAAAAAFvB4ZPakMYEKc=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB5AVJkMnwXM=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB5AVJkMoH/g=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMnwXM=" + }, + "model": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB5AVJkMpi4U=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMoH/g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 192, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5AVJkMqCYQ=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMoH/g=" + }, + "font": "Arial;13;1", + "left": 101, + "top": 47, + "width": 181.90087890625, + "height": 13, + "text": "AbstractApplicationContext" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5AVJkMrVTw=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMoH/g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 192, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5AVJkMsmic=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMoH/g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 192, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 96, + "top": 40, + "width": 191.90087890625, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5AVJkMpi4U=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB5AVJkMqCYQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB5AVJkMrVTw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5AVJkMsmic=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB5AVJkMtIHU=", + "_parent": { + "$ref": "AAAAAAFvB5AVJkMnwXM=" + }, + "model": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "font": "Arial;13;0", + "left": 192, + "top": 80, + "width": 1, + "height": 577 + } + ], + "font": "Arial;13;0", + "left": 96, + "top": 40, + "width": 191.90087890625, + "height": 617, + "nameCompartment": { + "$ref": "AAAAAAFvB5AVJkMoH/g=" + }, + "linePart": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB5D230NKxlk=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5D23kNJ3Fs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5D230NLIiQ=", + "_parent": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "model": { + "$ref": "AAAAAAFvB5D23kNJ3Fs=" + }, + "font": "Arial;13;0", + "left": 207, + "top": 144, + "width": 160.41796875, + "height": 13, + "alpha": 1.9775423426214938, + "distance": 70.77428911688199, + "hostEdge": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "edgePosition": 1, + "text": "1 : obtainFreshBeanFactory" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5D230NMwSY=", + "_parent": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "model": { + "$ref": "AAAAAAFvB5D23kNJ3Fs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 246, + "top": 171, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5D230NNtKk=", + "_parent": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "model": { + "$ref": "AAAAAAFvB5D23kNJ3Fs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 212, + "top": 172, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB5D230NOmxo=", + "_parent": { + "$ref": "AAAAAAFvB5D230NKxlk=" + }, + "model": { + "$ref": "AAAAAAFvB5D23kNJ3Fs=" + }, + "font": "Arial;13;0", + "left": 185, + "top": 188, + "width": 14, + "height": 365 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + }, + "tail": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + }, + "points": "192:168;222:168;222:188;198:188", + "nameLabel": { + "$ref": "AAAAAAFvB5D230NLIiQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5D230NMwSY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5D230NNtKk=" + }, + "activation": { + "$ref": "AAAAAAFvB5D230NOmxo=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB5KX9ENj3t0=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB5KX9ENkbrc=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENj3t0=" + }, + "model": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB5KX9ENli0M=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENkbrc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1440, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5KX9ENmv28=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENkbrc=" + }, + "font": "Arial;13;1", + "left": 725, + "top": 47, + "width": 256.32080078125, + "height": 13, + "text": "AbstractRefreshableApplicationContext" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5KX9ENnVpk=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENkbrc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1440, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB5KX9ENoFvw=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENkbrc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1440, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 720, + "top": 40, + "width": 266.32080078125, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5KX9ENli0M=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB5KX9ENmv28=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB5KX9ENnVpk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5KX9ENoFvw=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB5KX9ENpUOM=", + "_parent": { + "$ref": "AAAAAAFvB5KX9ENj3t0=" + }, + "model": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + }, + "font": "Arial;13;0", + "left": 853, + "top": 80, + "width": 1, + "height": 585 + } + ], + "font": "Arial;13;0", + "left": 720, + "top": 40, + "width": 266.32080078125, + "height": 625, + "nameCompartment": { + "$ref": "AAAAAAFvB5KX9ENkbrc=" + }, + "linePart": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB5MdnEOEtu0=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5MdnEODTSw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5MdnEOFRz8=", + "_parent": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "model": { + "$ref": "AAAAAAFvB5MdnEODTSw=" + }, + "font": "Arial;13;0", + "left": 456, + "top": 216, + "width": 132.22802734375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "edgePosition": 1, + "text": "2 : refreshBeanFactory" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5MdnEOGwmg=", + "_parent": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "model": { + "$ref": "AAAAAAFvB5MdnEODTSw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 522, + "top": 201, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5MdnEOHJjA=", + "_parent": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "model": { + "$ref": "AAAAAAFvB5MdnEODTSw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 522, + "top": 236, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB5MdnEOIOpo=", + "_parent": { + "$ref": "AAAAAAFvB5MdnEOEtu0=" + }, + "model": { + "$ref": "AAAAAAFvB5MdnEODTSw=" + }, + "font": "Arial;13;0", + "left": 846, + "top": 232, + "width": 14, + "height": 289 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + }, + "tail": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + }, + "points": "198:232;846:232", + "nameLabel": { + "$ref": "AAAAAAFvB5MdnEOFRz8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5MdnEOGwmg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5MdnEOHJjA=" + }, + "activation": { + "$ref": "AAAAAAFvB5MdnEOIOpo=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB5PepEObFts=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5PepEOaMu0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5PepEOcOxE=", + "_parent": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "model": { + "$ref": "AAAAAAFvB5PepEOaMu0=" + }, + "font": "Arial;13;0", + "left": 872, + "top": 232, + "width": 127.89892578125, + "height": 13, + "alpha": 2.117584071132435, + "distance": 53.85164807134504, + "hostEdge": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "edgePosition": 1, + "text": "3 : createBeanFactory" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5PepEOdPV0=", + "_parent": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "model": { + "$ref": "AAAAAAFvB5PepEOaMu0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 913, + "top": 259, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5PepEOeO6E=", + "_parent": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "model": { + "$ref": "AAAAAAFvB5PepEOaMu0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 879, + "top": 260, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB5PepEOfqrY=", + "_parent": { + "$ref": "AAAAAAFvB5PepEObFts=" + }, + "model": { + "$ref": "AAAAAAFvB5PepEOaMu0=" + }, + "font": "Arial;13;0", + "left": 853, + "top": 276, + "width": 14, + "height": 93 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + }, + "tail": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + }, + "points": "859:256;889:256;889:276;866:276", + "nameLabel": { + "$ref": "AAAAAAFvB5PepEOcOxE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5PepEOdPV0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5PepEOeO6E=" + }, + "activation": { + "$ref": "AAAAAAFvB5PepEOfqrY=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB5R1q0O0zr4=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5R1q0Ozfvw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5R1rEO1ihg=", + "_parent": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "model": { + "$ref": "AAAAAAFvB5R1q0Ozfvw=" + }, + "font": "Arial;13;0", + "left": 471, + "top": 401, + "width": 109.83984375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "edgePosition": 1, + "text": "4 : getBeanFactory" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5R1rEO2AcE=", + "_parent": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "model": { + "$ref": "AAAAAAFvB5R1q0Ozfvw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 525, + "top": 386, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5R1rEO3iVI=", + "_parent": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "model": { + "$ref": "AAAAAAFvB5R1q0Ozfvw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 525, + "top": 421, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB5R1rEO44zg=", + "_parent": { + "$ref": "AAAAAAFvB5R1q0O0zr4=" + }, + "model": { + "$ref": "AAAAAAFvB5R1q0Ozfvw=" + }, + "font": "Arial;13;0", + "left": 853, + "top": 417, + "width": 14, + "height": 64 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + }, + "tail": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + }, + "points": "198:417;853:417", + "nameLabel": { + "$ref": "AAAAAAFvB5R1rEO1ihg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5R1rEO2AcE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5R1rEO3iVI=" + }, + "activation": { + "$ref": "AAAAAAFvB5R1rEO44zg=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB5TwNEPq4ZE=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMV5FA=" + }, + "model": { + "$ref": "AAAAAAFvB5TwNEPpu6I=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5TwNEPr3hQ=", + "_parent": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "model": { + "$ref": "AAAAAAFvB5TwNEPpu6I=" + }, + "font": "Arial;13;0", + "left": 436, + "top": 470, + "width": 177.76611328125, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "edgePosition": 1, + "text": "5 : DefaultListableBeanFactory" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5TwNEPsGVA=", + "_parent": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "model": { + "$ref": "AAAAAAFvB5TwNEPpu6I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 524, + "top": 485, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB5TwNEPtd9s=", + "_parent": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "model": { + "$ref": "AAAAAAFvB5TwNEPpu6I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 525, + "top": 450, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB5TwNEPuOGc=", + "_parent": { + "$ref": "AAAAAAFvB5TwNEPq4ZE=" + }, + "model": { + "$ref": "AAAAAAFvB5TwNEPpu6I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 185, + "top": 466, + "width": 14, + "height": 25 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB5AVJkMtIHU=" + }, + "tail": { + "$ref": "AAAAAAFvB5KX9ENpUOM=" + }, + "points": "853:466;198:466", + "nameLabel": { + "$ref": "AAAAAAFvB5TwNEPr3hQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB5TwNEPsGVA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB5TwNEPtd9s=" + }, + "activation": { + "$ref": "AAAAAAFvB5TwNEPuOGc=" + } + } + ] + } + ], + "messages": [ + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB5D23kNJ3Fs=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "obtainFreshBeanFactory", + "source": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "target": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB5MdnEODTSw=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "refreshBeanFactory", + "source": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "target": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB5PepEOaMu0=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "createBeanFactory", + "source": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + }, + "target": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB5R1q0Ozfvw=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "getBeanFactory", + "source": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "target": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB5TwNEPpu6I=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "DefaultListableBeanFactory", + "source": { + "$ref": "AAAAAAFvB5KX9ENigcM=" + }, + "target": { + "$ref": "AAAAAAFvB5AVJkMmpgo=" + }, + "messageSort": "reply" + } + ], + "participants": [ + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB5AVJkMmpgo=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "AbstractApplicationContext", + "represent": { + "$ref": "AAAAAAFvB5AVJUMlX7Y=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB5KX9ENigcM=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMUJsE=" + }, + "name": "AbstractRefreshableApplicationContext", + "represent": { + "$ref": "AAAAAAFvB5KX9ENh2jQ=" + }, + "isMultiInstance": false + } + ] + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB5AVJUMlX7Y=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMTqOs=" + }, + "name": "Role1" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB5KX9ENh2jQ=", + "_parent": { + "$ref": "AAAAAAFvB4ZPaUMTqOs=" + }, + "name": "Role2" + } + ] + }, + { + "_type": "UMLCollaboration", + "_id": "AAAAAAFvB+ZoHEP/aiM=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Collaboration2", + "ownedElements": [ + { + "_type": "UMLInteraction", + "_id": "AAAAAAFvB+ZoHEQACqA=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Interaction1", + "ownedElements": [ + { + "_type": "UMLSequenceDiagram", + "_id": "AAAAAAFvB+ZoHEQB4Eg=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "SequenceDiagram1", + "ownedViews": [ + { + "_type": "UMLFrameView", + "_id": "AAAAAAFvB+ZoHEQCiNM=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+ZoHUQDLso=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQCiNM=" + }, + "font": "Arial;13;0", + "left": 78.97900390625, + "top": 10, + "width": 115.9052734375, + "height": 13, + "text": "SequenceDiagram1" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+ZoH0QE+yA=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQCiNM=" + }, + "font": "Arial;13;1", + "left": 13, + "top": 10, + "width": 60.97900390625, + "height": 13, + "text": "interaction" + } + ], + "font": "Arial;13;0", + "left": 8, + "top": 5, + "width": 1420, + "height": 908, + "nameLabel": { + "$ref": "AAAAAAFvB+ZoHUQDLso=" + }, + "frameTypeLabel": { + "$ref": "AAAAAAFvB+ZoH0QE+yA=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB+dWCUQRFD4=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+dWCEQQOBI=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB+dWCUQSuPw=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQRFD4=" + }, + "model": { + "$ref": "AAAAAAFvB+dWCEQQOBI=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+dWCUQT6rY=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQSuPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+dWCUQU+Lc=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQSuPw=" + }, + "font": "Arial;13;1", + "left": 69, + "top": 47, + "width": 198.5380859375, + "height": 13, + "text": "AbstractBeanDefinitionReader" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+dWCUQVUUM=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQSuPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+dWCUQWngU=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQSuPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 64, + "top": 40, + "width": 208.5380859375, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+dWCUQT6rY=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB+dWCUQU+Lc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB+dWCUQVUUM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+dWCUQWngU=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB+dWCUQX1XE=", + "_parent": { + "$ref": "AAAAAAFvB+dWCUQRFD4=" + }, + "model": { + "$ref": "AAAAAAFvB+dWCEQQOBI=" + }, + "font": "Arial;13;0", + "left": 168, + "top": 80, + "width": 1, + "height": 481 + } + ], + "font": "Arial;13;0", + "left": 64, + "top": 40, + "width": 208.5380859375, + "height": 521, + "nameCompartment": { + "$ref": "AAAAAAFvB+dWCUQSuPw=" + }, + "linePart": { + "$ref": "AAAAAAFvB+dWCUQX1XE=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB+fBYkQ10Yo=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB+fBYkQ2VXQ=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ10Yo=" + }, + "model": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+fBYkQ36yY=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ2VXQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+fBYkQ4aMM=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ2VXQ=" + }, + "font": "Arial;13;1", + "left": 357, + "top": 47, + "width": 169.6435546875, + "height": 13, + "text": "XmlBeanDefinitionReader" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+fBYkQ5fLQ=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ2VXQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+fBYkQ6ElY=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ2VXQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 352, + "top": 40, + "width": 179.6435546875, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+fBYkQ36yY=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB+fBYkQ4aMM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB+fBYkQ5fLQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+fBYkQ6ElY=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB+fBYkQ7Rz4=", + "_parent": { + "$ref": "AAAAAAFvB+fBYkQ10Yo=" + }, + "model": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "font": "Arial;13;0", + "left": 442, + "top": 80, + "width": 1, + "height": 473 + } + ], + "font": "Arial;13;0", + "left": 352, + "top": 40, + "width": 179.6435546875, + "height": 513, + "nameCompartment": { + "$ref": "AAAAAAFvB+fBYkQ2VXQ=" + }, + "linePart": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+gitERYMUE=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+gitERXeeg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+gitERZ6lw=", + "_parent": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "model": { + "$ref": "AAAAAAFvB+gitERXeeg=" + }, + "font": "Arial;13;0", + "left": 235, + "top": 153, + "width": 133.70068359375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "edgePosition": 1, + "text": "1 : loadBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+gitURaRcs=", + "_parent": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "model": { + "$ref": "AAAAAAFvB+gitERXeeg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 138, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+gitURbdIU=", + "_parent": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "model": { + "$ref": "AAAAAAFvB+gitERXeeg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 173, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+gitURc7IU=", + "_parent": { + "$ref": "AAAAAAFvB+gitERYMUE=" + }, + "model": { + "$ref": "AAAAAAFvB+gitERXeeg=" + }, + "font": "Arial;13;0", + "left": 435, + "top": 169, + "width": 14, + "height": 328 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "tail": { + "$ref": "AAAAAAFvB+dWCUQX1XE=" + }, + "points": "168:169;435:169", + "nameLabel": { + "$ref": "AAAAAAFvB+gitERZ6lw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+gitURaRcs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+gitURbdIU=" + }, + "activation": { + "$ref": "AAAAAAFvB+gitURc7IU=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+i37kRv9ps=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+i37kRuYec=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+i37kRw6vc=", + "_parent": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "model": { + "$ref": "AAAAAAFvB+i37kRuYec=" + }, + "font": "Arial;13;0", + "left": 455, + "top": 176, + "width": 152.50244140625, + "height": 13, + "alpha": 1.9316320475032858, + "distance": 56.64803615307419, + "hostEdge": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "edgePosition": 1, + "text": "2 : doLoadBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+i37kRxabI=", + "_parent": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "model": { + "$ref": "AAAAAAFvB+i37kRuYec=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 502, + "top": 195, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+i37kRynB4=", + "_parent": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "model": { + "$ref": "AAAAAAFvB+i37kRuYec=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 468, + "top": 196, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+i37kRz3XY=", + "_parent": { + "$ref": "AAAAAAFvB+i37kRv9ps=" + }, + "model": { + "$ref": "AAAAAAFvB+i37kRuYec=" + }, + "font": "Arial;13;0", + "left": 442, + "top": 212, + "width": 14, + "height": 197 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "tail": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "points": "448:192;478:192;478:212;455:212", + "nameLabel": { + "$ref": "AAAAAAFvB+i37kRw6vc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+i37kRxabI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+i37kRynB4=" + }, + "activation": { + "$ref": "AAAAAAFvB+i37kRz3XY=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+l0C0SJkx0=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+l0C0SIpJc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+l0C0SKfrU=", + "_parent": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "model": { + "$ref": "AAAAAAFvB+l0C0SIpJc=" + }, + "font": "Arial;13;0", + "left": 418, + "top": 235, + "width": 152.470703125, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "edgePosition": 1, + "text": "3 : registerBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+l0C0SL2pQ=", + "_parent": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "model": { + "$ref": "AAAAAAFvB+l0C0SIpJc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 509, + "top": 235, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+l0C0SM8f8=", + "_parent": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "model": { + "$ref": "AAAAAAFvB+l0C0SIpJc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 475, + "top": 236, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+l0C0SNeM0=", + "_parent": { + "$ref": "AAAAAAFvB+l0C0SJkx0=" + }, + "model": { + "$ref": "AAAAAAFvB+l0C0SIpJc=" + }, + "font": "Arial;13;0", + "left": 449, + "top": 252, + "width": 14, + "height": 69 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "tail": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "points": "455:232;485:232;485:252;462:252", + "nameLabel": { + "$ref": "AAAAAAFvB+l0C0SKfrU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+l0C0SL2pQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+l0C0SM8f8=" + }, + "activation": { + "$ref": "AAAAAAFvB+l0C0SNeM0=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB+nQ6ESgWo0=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB+nQ6EShXnI=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6ESgWo0=" + }, + "model": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+nQ6ESizuA=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6EShXnI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1264, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+nQ6ESjr9o=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6EShXnI=" + }, + "font": "Arial;13;1", + "left": 637, + "top": 47, + "width": 253.419921875, + "height": 13, + "text": "DefaultBeanDefinitionDocumentReader" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+nQ6ESkHVc=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6EShXnI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1264, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+nQ6USlx3A=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6EShXnI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1264, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 632, + "top": 40, + "width": 263.419921875, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+nQ6ESizuA=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB+nQ6ESjr9o=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB+nQ6ESkHVc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+nQ6USlx3A=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB+nQ6USmLXk=", + "_parent": { + "$ref": "AAAAAAFvB+nQ6ESgWo0=" + }, + "model": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "font": "Arial;13;0", + "left": 764, + "top": 80, + "width": 1, + "height": 473 + } + ], + "font": "Arial;13;0", + "left": 632, + "top": 40, + "width": 263.419921875, + "height": 513, + "nameCompartment": { + "$ref": "AAAAAAFvB+nQ6EShXnI=" + }, + "linePart": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+ofikTDrFs=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+ofikTCegE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+ofikTESb8=", + "_parent": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "model": { + "$ref": "AAAAAAFvB+ofikTCegE=" + }, + "font": "Arial;13;0", + "left": 533, + "top": 248, + "width": 152.470703125, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "edgePosition": 1, + "text": "4 : registerBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+ofi0TFMkM=", + "_parent": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "model": { + "$ref": "AAAAAAFvB+ofikTCegE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 609, + "top": 233, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+ofi0TGjj8=", + "_parent": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "model": { + "$ref": "AAAAAAFvB+ofikTCegE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 609, + "top": 268, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+ofi0THym8=", + "_parent": { + "$ref": "AAAAAAFvB+ofikTDrFs=" + }, + "model": { + "$ref": "AAAAAAFvB+ofikTCegE=" + }, + "font": "Arial;13;0", + "left": 757, + "top": 264, + "width": 14, + "height": 273 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "tail": { + "$ref": "AAAAAAFvB+fBYkQ7Rz4=" + }, + "points": "462:264;757:264", + "nameLabel": { + "$ref": "AAAAAAFvB+ofikTESb8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+ofi0TFMkM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+ofi0TGjj8=" + }, + "activation": { + "$ref": "AAAAAAFvB+ofi0THym8=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+rFrkTbXC4=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+rFrkTaOZo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+rFrkTcKz8=", + "_parent": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "model": { + "$ref": "AAAAAAFvB+rFrkTaOZo=" + }, + "font": "Arial;13;0", + "left": 724, + "top": 275, + "width": 171.98974609375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "edgePosition": 1, + "text": "5 : doRegisterBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+rFrkTdnuY=", + "_parent": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "model": { + "$ref": "AAAAAAFvB+rFrkTaOZo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 824, + "top": 275, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+rFrkTePvo=", + "_parent": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "model": { + "$ref": "AAAAAAFvB+rFrkTaOZo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 790, + "top": 276, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+rFrkTfeBI=", + "_parent": { + "$ref": "AAAAAAFvB+rFrkTbXC4=" + }, + "model": { + "$ref": "AAAAAAFvB+rFrkTaOZo=" + }, + "font": "Arial;13;0", + "left": 764, + "top": 292, + "width": 14, + "height": 197 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "tail": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "points": "770:272;800:272;800:292;777:292", + "nameLabel": { + "$ref": "AAAAAAFvB+rFrkTcKz8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+rFrkTdnuY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+rFrkTePvo=" + }, + "activation": { + "$ref": "AAAAAAFvB+rFrkTfeBI=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+s/IETzRKs=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+s/H0Ty2mA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+s/IET0twI=", + "_parent": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "model": { + "$ref": "AAAAAAFvB+s/H0Ty2mA=" + }, + "font": "Arial;13;0", + "left": 746, + "top": 323, + "width": 141.6416015625, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "edgePosition": 1, + "text": "6 : parseBeanDefinitions" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+s/IET1IJE=", + "_parent": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "model": { + "$ref": "AAAAAAFvB+s/H0Ty2mA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 831, + "top": 323, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+s/IET24Sg=", + "_parent": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "model": { + "$ref": "AAAAAAFvB+s/H0Ty2mA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 797, + "top": 324, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+s/IET3MXs=", + "_parent": { + "$ref": "AAAAAAFvB+s/IETzRKs=" + }, + "model": { + "$ref": "AAAAAAFvB+s/H0Ty2mA=" + }, + "font": "Arial;13;0", + "left": 771, + "top": 340, + "width": 14, + "height": 109 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "tail": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "points": "777:320;807:320;807:340;784:340", + "nameLabel": { + "$ref": "AAAAAAFvB+s/IET0twI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+s/IET1IJE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+s/IET24Sg=" + }, + "activation": { + "$ref": "AAAAAAFvB+s/IET3MXs=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+vu8EUKz88=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+vu8EUJUwo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+vu8EULEJE=", + "_parent": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "model": { + "$ref": "AAAAAAFvB+vu8EUJUwo=" + }, + "font": "Arial;13;0", + "left": 749, + "top": 363, + "width": 148.1416015625, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "edgePosition": 1, + "text": "7 : processBeanDefinition" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+vu8EUMmFI=", + "_parent": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "model": { + "$ref": "AAAAAAFvB+vu8EUJUwo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 838, + "top": 363, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+vu8EUN2xM=", + "_parent": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "model": { + "$ref": "AAAAAAFvB+vu8EUJUwo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 804, + "top": 364, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+vu8EUOcxk=", + "_parent": { + "$ref": "AAAAAAFvB+vu8EUKz88=" + }, + "model": { + "$ref": "AAAAAAFvB+vu8EUJUwo=" + }, + "font": "Arial;13;0", + "left": 778, + "top": 380, + "width": 14, + "height": 37 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "tail": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "points": "784:360;814:360;814:380;791:380", + "nameLabel": { + "$ref": "AAAAAAFvB+vu8EULEJE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+vu8EUMmFI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+vu8EUN2xM=" + }, + "activation": { + "$ref": "AAAAAAFvB+vu8EUOcxk=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB+0PjkUilVA=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+0PjkUhY/8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB+0PjkUj0P8=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUilVA=" + }, + "model": { + "$ref": "AAAAAAFvB+0PjkUhY/8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+0Pj0UknDA=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUj0P8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1952, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+0Pj0UlQZ8=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUj0P8=" + }, + "font": "Arial;13;1", + "left": 981, + "top": 47, + "width": 173.97265625, + "height": 13, + "text": "BeanDefinitionReaderUtils" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+0Pj0Umsz8=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUj0P8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1952, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+0Pj0UnTvs=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUj0P8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1952, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 976, + "top": 40, + "width": 183.97265625, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+0Pj0UknDA=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB+0Pj0UlQZ8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB+0Pj0Umsz8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+0Pj0UnTvs=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB+0Pj0Uo0Vo=", + "_parent": { + "$ref": "AAAAAAFvB+0PjkUilVA=" + }, + "model": { + "$ref": "AAAAAAFvB+0PjkUhY/8=" + }, + "font": "Arial;13;0", + "left": 1068, + "top": 80, + "width": 1, + "height": 473 + } + ], + "font": "Arial;13;0", + "left": 976, + "top": 40, + "width": 183.97265625, + "height": 513, + "nameCompartment": { + "$ref": "AAAAAAFvB+0PjkUj0P8=" + }, + "linePart": { + "$ref": "AAAAAAFvB+0Pj0Uo0Vo=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+2VYkVEfzA=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+2VYUVDde0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+2VYkVFuwo=", + "_parent": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "model": { + "$ref": "AAAAAAFvB+2VYUVDde0=" + }, + "font": "Arial;13;0", + "left": 854, + "top": 384, + "width": 145.970703125, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "edgePosition": 1, + "text": "8 : registerBeanDefinition" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+2VYkVGKMA=", + "_parent": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "model": { + "$ref": "AAAAAAFvB+2VYUVDde0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 926, + "top": 369, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+2VYkVH+8Q=", + "_parent": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "model": { + "$ref": "AAAAAAFvB+2VYUVDde0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 926, + "top": 404, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+2VYkVIKeg=", + "_parent": { + "$ref": "AAAAAAFvB+2VYkVEfzA=" + }, + "model": { + "$ref": "AAAAAAFvB+2VYUVDde0=" + }, + "font": "Arial;13;0", + "left": 1061, + "top": 400, + "width": 14, + "height": 73 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+0Pj0Uo0Vo=" + }, + "tail": { + "$ref": "AAAAAAFvB+nQ6USmLXk=" + }, + "points": "791:400;1061:400", + "nameLabel": { + "$ref": "AAAAAAFvB+2VYkVFuwo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+2VYkVGKMA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+2VYkVH+8Q=" + }, + "activation": { + "$ref": "AAAAAAFvB+2VYkVIKeg=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFvB+3WmkVbFxU=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+3WmkVappc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFvB+3WmkVc2Ys=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVbFxU=" + }, + "model": { + "$ref": "AAAAAAFvB+3WmkVappc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFvB+3Wm0VdKkI=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVc2Ys=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2368, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+3Wm0VenM8=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVc2Ys=" + }, + "font": "Arial;13;1", + "left": 1189, + "top": 47, + "width": 181.9326171875, + "height": 13, + "text": "DefaultListableBeanFactory" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+3Wm0VfIFI=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVc2Ys=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2368, + "width": 106.20263671875, + "height": 13, + "text": "(from Interaction1)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFvB+3Wm0VgTu4=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVc2Ys=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2368, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1184, + "top": 40, + "width": 191.9326171875, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+3Wm0VdKkI=" + }, + "nameLabel": { + "$ref": "AAAAAAFvB+3Wm0VenM8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFvB+3Wm0VfIFI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+3Wm0VgTu4=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFvB+3Wm0Vhq5s=", + "_parent": { + "$ref": "AAAAAAFvB+3WmkVbFxU=" + }, + "model": { + "$ref": "AAAAAAFvB+3WmkVappc=" + }, + "font": "Arial;13;0", + "left": 1280, + "top": 80, + "width": 1, + "height": 489 + } + ], + "font": "Arial;13;0", + "left": 1184, + "top": 40, + "width": 191.9326171875, + "height": 529, + "nameCompartment": { + "$ref": "AAAAAAFvB+3WmkVc2Ys=" + }, + "linePart": { + "$ref": "AAAAAAFvB+3Wm0Vhq5s=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFvB+5BKEV+8hM=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQB4Eg=" + }, + "model": { + "$ref": "AAAAAAFvB+5BKEV9YnI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+5BKEV/uzg=", + "_parent": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "model": { + "$ref": "AAAAAAFvB+5BKEV9YnI=" + }, + "font": "Arial;13;0", + "left": 1101, + "top": 408, + "width": 145.970703125, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "edgePosition": 1, + "text": "9 : registerBeanDefinition" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+5BKEWAKAo=", + "_parent": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "model": { + "$ref": "AAAAAAFvB+5BKEV9YnI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1173, + "top": 393, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFvB+5BKEWBdnM=", + "_parent": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "model": { + "$ref": "AAAAAAFvB+5BKEV9YnI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1173, + "top": 428, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "edgePosition": 1 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFvB+5BKUWCOhE=", + "_parent": { + "$ref": "AAAAAAFvB+5BKEV+8hM=" + }, + "model": { + "$ref": "AAAAAAFvB+5BKEV9YnI=" + }, + "font": "Arial;13;0", + "left": 1273, + "top": 424, + "width": 14, + "height": 29 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFvB+3Wm0Vhq5s=" + }, + "tail": { + "$ref": "AAAAAAFvB+0Pj0Uo0Vo=" + }, + "points": "1074:424;1273:424", + "nameLabel": { + "$ref": "AAAAAAFvB+5BKEV/uzg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFvB+5BKEWAKAo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFvB+5BKEWBdnM=" + }, + "activation": { + "$ref": "AAAAAAFvB+5BKUWCOhE=" + } + } + ] + } + ], + "messages": [ + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+gitERXeeg=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "loadBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+dWCEQQOBI=" + }, + "target": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+i37kRuYec=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "doLoadBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "target": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+l0C0SIpJc=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "registerBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "target": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+ofikTCegE=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "registerBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+fBYkQ0R48=" + }, + "target": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+rFrkTaOZo=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "doRegisterBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "target": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+s/H0Ty2mA=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "parseBeanDefinitions", + "source": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "target": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+vu8EUJUwo=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "processBeanDefinition", + "source": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "target": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+2VYUVDde0=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "registerBeanDefinition", + "source": { + "$ref": "AAAAAAFvB+nQ6ESfFXo=" + }, + "target": { + "$ref": "AAAAAAFvB+0PjkUhY/8=" + } + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFvB+5BKEV9YnI=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "registerBeanDefinition", + "source": { + "$ref": "AAAAAAFvB+0PjkUhY/8=" + }, + "target": { + "$ref": "AAAAAAFvB+3WmkVappc=" + } + } + ], + "participants": [ + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB+dWCEQQOBI=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "AbstractBeanDefinitionReader", + "represent": { + "$ref": "AAAAAAFvB+dWCEQPtA8=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB+fBYkQ0R48=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "XmlBeanDefinitionReader", + "represent": { + "$ref": "AAAAAAFvB+fBYkQzWao=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB+nQ6ESfFXo=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "DefaultBeanDefinitionDocumentReader", + "represent": { + "$ref": "AAAAAAFvB+nQ6ESeTsw=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB+0PjkUhY/8=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "BeanDefinitionReaderUtils", + "represent": { + "$ref": "AAAAAAFvB+0PjkUgmnc=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFvB+3WmkVappc=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEQACqA=" + }, + "name": "DefaultListableBeanFactory", + "represent": { + "$ref": "AAAAAAFvB+3WmkVZ0yk=" + }, + "isMultiInstance": false + } + ] + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB+dWCEQPtA8=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Role1" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB+fBYkQzWao=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Role2" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB+nQ6ESeTsw=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Role3" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB+0PjkUgmnc=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Role4" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFvB+3WmkVZ0yk=", + "_parent": { + "$ref": "AAAAAAFvB+ZoHEP/aiM=" + }, + "name": "Role5" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 18fda3a5..00000000 Binary files a/src/.DS_Store and /dev/null differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store deleted file mode 100644 index 8d3aae20..00000000 Binary files a/src/main/.DS_Store and /dev/null differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store deleted file mode 100644 index d12931e9..00000000 Binary files a/src/main/java/.DS_Store and /dev/null differ diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store deleted file mode 100644 index 31128fdc..00000000 Binary files a/src/main/java/com/.DS_Store and /dev/null differ diff --git a/src/main/java/com/fangpeng/.DS_Store b/src/main/java/com/fangpeng/.DS_Store deleted file mode 100644 index 3350dc02..00000000 Binary files a/src/main/java/com/fangpeng/.DS_Store and /dev/null differ diff --git a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java b/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java deleted file mode 100644 index 59964ffc..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.fangpeng.algorithm.hash; - -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * @Description: 一致性hash算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:18 下午 - */ -public class ConsistentHashNoVirtual { - - // 1. 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 2. 针对客户端IP求出hash值 - // 3. 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - public static void main(String[] args) { - // step1 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 定义服务器ip - String[] tomcatServers = new String[]{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"}; - - SortedMap hashServerMap = new TreeMap<>(); - - for (String tomcatServer : tomcatServers) { - // 求出每一个ip的hash值,对应到hash环上,存储hash值与ip的对应关系 - int serverHash = Math.abs(tomcatServer.hashCode()); - // 存储hash值与ip的对应关系 - hashServerMap.put(serverHash, tomcatServer); - } - - // step2 针对客户端IP求出hash值 - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - - for (String client : clients) { - int clientHash = Math.abs(client.hashCode()); - //step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - // 根据客户端ip的哈希值去找出哪一个服务器节点能够处理() - SortedMap tailMap = hashServerMap.tailMap(clientHash); - - if (tailMap.isEmpty()) { - // 取哈希环上的顺时针第一台服务器 - Integer firstKey = hashServerMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(firstKey)); - } else { - // 取哈希环上的顺时针比它大的第一台服务器 - Integer nextKey = tailMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(nextKey)); - } - } - - } - -} diff --git a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java b/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java deleted file mode 100644 index 26858639..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fangpeng.algorithm.hash; - - -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:35 下午 - */ -public class ConsistentHashWithVirtual { - - public static void main(String[] args) { - - // step1 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 定义服务器ip - String[] tomcatServers = new String[]{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"}; - - SortedMap hashServerMap = new TreeMap<>(); - - // 定义针对每个真实服务器虚拟出来几个节点 - int virtaulCount = 3; - - - for(String tomcatServer: tomcatServers) { - // 求出每一个ip的hash值,对应到hash环上,存储hash值与ip的对应关系 - int serverHash = Math.abs(tomcatServer.hashCode()); - // 存储hash值与ip的对应关系 - hashServerMap.put(serverHash,tomcatServer); - - // 处理虚拟节点 - for(int i = 0; i < virtaulCount; i++) { - int virtualHash = Math.abs((tomcatServer + "#" + i).hashCode()); - hashServerMap.put(virtualHash,"----由虚拟节点"+ i + "映射过来的请求:"+ tomcatServer); - } - - } - - - // step2 针对客户端IP求出hash值 - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - for(String client : clients) { - int clientHash = Math.abs(client.hashCode()); - // step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - // 根据客户端ip的哈希值去找出哪一个服务器节点能够处理() - SortedMap integerStringSortedMap = hashServerMap.tailMap(clientHash); - if(integerStringSortedMap.isEmpty()) { - // 取哈希环上的顺时针第一台服务器 - Integer firstKey = hashServerMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(firstKey)); - }else{ - Integer nextKey = integerStringSortedMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(nextKey)); - } - } - } - -} diff --git a/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java b/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java deleted file mode 100644 index f8467f98..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.algorithm.hash; - -/** - * @Description: 普通hash算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:14 下午 - */ -public class GenetalHash { - - public static void main(String[] args) { - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - - // 定义服务器数量 - int serverCount = 5; // (编号对应0,1,2) - - // hash(ip) % node_counts = index - //根据index锁定应该路由到的tomcat服务器 - for (String client : clients) { - int hash = Math.abs(client.hashCode()); - int index = hash % serverCount; - System.out.println("客户端:" + client + " 被路由到服务器编号为:" + index); - } - - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java deleted file mode 100644 index ce6b6fa4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * @author 方鹏 - * @date 2022年02月07日 8:51 下午 - */ -public class Client { - public static void main(String[] args) { - //创建计算机对象 - Computer computer = new Computer(); - //读取SD卡中的数据 - String msg = computer.readSD(new SDCardImpl()); - System.out.println(msg); - - System.out.println("==============="); - //使用该电脑读取TF卡中的数据 - //定义适配器类 - String msg1 = computer.readSD(new SDAdapterTF()); - System.out.println(msg1); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java deleted file mode 100644 index a9a3ffeb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 计算机类 - * @author 方鹏 - * @date 2022年02月07日 8:42 下午 - */ -public class Computer { - - //从SD卡中读取数据 - public String readSD(SDCard sdCard) { - if(sdCard == null) { - throw new NullPointerException("sd card is null"); - } - return sdCard.readSD(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java deleted file mode 100644 index ecdc9ce5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 适配器类 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDAdapterTF extends TFCardImpl implements SDCard { - @Override - public String readSD() { - System.out.println("adapter read tf card"); - return readTF(); - } - - @Override - public void writeSD(String msg) { - System.out.println("adapter write tf card"); - writeTF(msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java deleted file mode 100644 index 6493462d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/* - * 目标接口 - * @author 方鹏 - * @date 2022/2/7 8:43 下午 - */ -public interface SDCard { - - //从SD卡中读取数据 - String readSD(); - //往SD卡中写数据 - void writeSD(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java deleted file mode 100644 index df916c37..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 具体的SD卡 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDCardImpl implements SDCard { - - public String readSD() { - String msg = "SDCard read msg : hello word SD"; - return msg; - } - - public void writeSD(String msg) { - System.out.println("SDCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java deleted file mode 100644 index f1ff5653..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/* - * 适配者类的接口 - * @author 方鹏 - * @date 2022/2/7 8:44 下午 - */ -public interface TFCard { - - //从TF卡中读取数据 - String readTF(); - //往TF卡中写数据 - void writeTF(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java deleted file mode 100644 index 3c1cda80..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 适配者类 - * @author 方鹏 - * @date 2022年02月07日 8:45 下午 - */ -public class TFCardImpl implements TFCard { - @Override - public String readTF() { - String msg = "TFCard read msg : hello word TFcard"; - return msg; - } - - @Override - public void writeTF(String msg) { - System.out.println("TFCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java deleted file mode 100644 index 48ed6264..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * @author 方鹏 - * @date 2022年02月07日 8:51 下午 - */ -public class Client { - public static void main(String[] args) { - //创建计算机对象 - Computer computer = new Computer(); - //读取SD卡中的数据 - String msg = computer.readSD(new SDCardImpl()); - System.out.println(msg); - - System.out.println("==============="); - //使用该电脑读取TF卡中的数据 - //定义适配器类 - //使用该电脑读取TF卡中的数据 - //创建适配器类对象 - SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl()); - String msg1 = computer.readSD(sdAdapterTF); - System.out.println(msg1); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java deleted file mode 100644 index 37272315..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 计算机类 - * @author 方鹏 - * @date 2022年02月07日 8:42 下午 - */ -public class Computer { - - //从SD卡中读取数据 - public String readSD(SDCard sdCard) { - if(sdCard == null) { - throw new NullPointerException("sd card is null"); - } - return sdCard.readSD(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java deleted file mode 100644 index f963eb7d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 适配器类 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDAdapterTF implements SDCard { - - //声明适配者类 - private TFCard tfCard; - - public SDAdapterTF(TFCard tfCard) { - this.tfCard = tfCard; - } - - @Override - public String readSD() { - System.out.println("adapter read tf card"); - return tfCard.readTF(); - } - - @Override - public void writeSD(String msg) { - System.out.println("adapter write tf card"); - tfCard.writeTF(msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java deleted file mode 100644 index cfe17948..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/* - * 目标接口 - * @author 方鹏 - * @date 2022/2/7 8:43 下午 - */ -public interface SDCard { - - //从SD卡中读取数据 - String readSD(); - //往SD卡中写数据 - void writeSD(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java deleted file mode 100644 index dd1964c1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 具体的SD卡 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDCardImpl implements SDCard { - - public String readSD() { - String msg = "SDCard read msg : hello word SD"; - return msg; - } - - public void writeSD(String msg) { - System.out.println("SDCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java deleted file mode 100644 index 0593fceb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/* - * 适配者类的接口 - * @author 方鹏 - * @date 2022/2/7 8:44 下午 - */ -public interface TFCard { - - //从TF卡中读取数据 - String readTF(); - //往TF卡中写数据 - void writeTF(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java deleted file mode 100644 index 128ff1cf..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 适配者类 - * @author 方鹏 - * @date 2022年02月07日 8:45 下午 - */ -public class TFCardImpl implements TFCard { - @Override - public String readTF() { - String msg = "TFCard read msg : hello word TFcard"; - return msg; - } - - @Override - public void writeTF(String msg) { - System.out.println("TFCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java deleted file mode 100644 index 78d05ac5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * avi视频文件(具体的实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:28 下午 - */ -public class AviFile implements VideoFile { - @Override - public void decode(String fileName) { - System.out.println("avi视频文件 :" + fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Client.java b/src/main/java/com/fangpeng/design/pattern/bridge/Client.java deleted file mode 100644 index 632d5f31..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * @author 方鹏 - * @date 2022年02月08日 1:32 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建mac系统对象 - OpratingSystem system = new Mac(new AviFile()); - //使用操作系统播放视频文件 - system.play("战狼3"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java b/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java deleted file mode 100644 index 43185840..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * Mac操作系统(扩展抽象化角色) - * @author 方鹏 - * @date 2022年02月08日 1:32 下午 - */ -public class Mac extends OpratingSystem { - - public Mac(VideoFile videoFile) { - super(videoFile); - } - - @Override - public void play(String fileName) { - videoFile.decode(fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java b/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java deleted file mode 100644 index bfa1ba17..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 抽象的操作系统类(抽象化角色) - * @author 方鹏 - * @date 2022年02月08日 1:29 下午 - */ -public abstract class OpratingSystem { - - //声明videFile变量 - protected VideoFile videoFile; - - public OpratingSystem(VideoFile videoFile) { - this.videoFile = videoFile; - } - - public abstract void play(String fileName); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java deleted file mode 100644 index 54e37123..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * rmvb视频文件(具体的实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:29 下午 - */ -public class RmvbFile implements VideoFile { - @Override - public void decode(String fileName) { - System.out.println("rmvb视频文件 :" + fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java deleted file mode 100644 index 6cdf1765..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 视频文件(实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:27 下午 - */ -public interface VideoFile { - - //解码功能 - void decode(String fileName); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java b/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java deleted file mode 100644 index f2277275..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 扩展抽象化角色(windows操作系统) - * @author 方鹏 - * @date 2022年02月08日 1:30 下午 - */ -public class Windows extends OpratingSystem { - - public Windows(VideoFile videoFile) { - super(videoFile); - } - - @Override - public void play(String fileName) { - videoFile.decode(fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java deleted file mode 100644 index abee7d97..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * 产品对象 - * @author 方鹏 - * @date 2022年02月07日 5:23 下午 - */ -public class Bike { - - private String frame;//车架 - - private String seat;//车座 - - public String getFrame() { - return frame; - } - - public void setFrame(String frame) { - this.frame = frame; - } - - public String getSeat() { - return seat; - } - - public void setSeat(String seat) { - this.seat = seat; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java deleted file mode 100644 index a4a7e663..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * Builder - * @author 方鹏 - * @date 2022年02月07日 5:24 下午 - */ -public abstract class Builder { - - //声明Bike类型的变量,并进行赋值 - protected Bike bike = new Bike(); - - public abstract void buildFrame(); - - public abstract void buildSeat(); - - //构建自行车的方法 - public abstract Bike createBike(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java deleted file mode 100644 index e8f474b5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - - -/** - * @author 方鹏 - * @date 2022年02月07日 5:30 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建指挥者对象 - Director director = new Director(new MobileBuilder()); - - //让指挥者只会组装自行车 - Bike bike = director.construct(); - - System.out.println(bike.getFrame()); - System.out.println(bike.getSeat()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java deleted file mode 100644 index 5ec7dae2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * @author 方鹏 - * @date 2022年02月07日 5:28 下午 - */ -public class Director { - - //声明builder类型的变量 - private Builder builder; - - public Director(Builder builder) { - this.builder = builder; - } - - //组装自行车的功能 - public Bike construct() { - builder.buildFrame(); - builder.buildSeat(); - return builder.createBike(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java deleted file mode 100644 index 4a353703..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * MobileBuilder - * @author 方鹏 - * @date 2022年02月07日 5:25 下午 - */ -public class MobileBuilder extends Builder { - @Override - public void buildFrame() { - bike.setFrame("碳纤维车架"); - } - - @Override - public void buildSeat() { - bike.setSeat("真皮车座"); - } - - @Override - public Bike createBike() { - return bike; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java deleted file mode 100644 index bc01c2c8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * OfoBuilder - * @author 方鹏 - * @date 2022年02月07日 5:25 下午 - */ -public class OfoBuilder extends Builder { - @Override - public void buildFrame() { - bike.setFrame("铝合金车架"); - } - - @Override - public void buildSeat() { - bike.setSeat("橡胶车座"); - } - - @Override - public Bike createBike() { - return bike; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java b/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java deleted file mode 100644 index b54fac23..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo2; - -/** - * @author 方鹏 - * @date 2022年02月07日 5:46 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建手机对象 通过构建者对象获取手机对象 - Phone phone = new Phone.Builder() - .cpu("intel") - .screen("三星屏幕") - .memory("金士顿内存条") - .mainboard("华硕主板") - .build(); - - System.out.println(phone); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java b/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java deleted file mode 100644 index 78f27b54..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo2; - -/** - * 手机类 - * @author 方鹏 - * @date 2022年02月07日 5:41 下午 - */ -public class Phone { - - private String cpu; - private String screen; - private String memory; - private String mainboard; - - //私有构造方法 - private Phone(Builder builder) { - this.cpu = builder.cpu; - this.screen = builder.screen; - this.memory = builder.memory; - this.mainboard = builder.mainboard; - } - - @Override - public String toString() { - return "Phone{" + - "cpu='" + cpu + '\'' + - ", screen='" + screen + '\'' + - ", memory='" + memory + '\'' + - ", mainboard='" + mainboard + '\'' + - '}'; - } - - public static final class Builder { - private String cpu; - private String screen; - private String memory; - private String mainboard; - - public Builder cpu(String cpu) { - this.cpu = cpu; - return this; - } - - public Builder screen(String screen) { - this.screen = screen; - return this; - } - public Builder memory(String memory) { - this.memory = memory; - return this; - } - public Builder mainboard(String mainboard) { - this.mainboard = mainboard; - return this; - } - - //使用构建者创建Phone对象 - public Phone build() { - return new Phone(this); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/Client.java b/src/main/java/com/fangpeng/design/pattern/combination/Client.java deleted file mode 100644 index 423933e6..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/Client.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * @author 方鹏 - * @date 2022年02月08日 2:13 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建菜单树 - MenuComponent menu1 = new Menu("菜单管理",2); - menu1.add(new MenuItem("页面访问",3)); - menu1.add(new MenuItem("展开菜单",3)); - menu1.add(new MenuItem("编辑菜单",3)); - menu1.add(new MenuItem("删除菜单",3)); - menu1.add(new MenuItem("新增菜单",3)); - - MenuComponent menu2 = new Menu("权限管理",2); - menu2.add(new MenuItem("页面访问",3)); - menu2.add(new MenuItem("提交保存",3)); - - MenuComponent menu3 = new Menu("角色管理",2); - menu3.add(new MenuItem("页面访问",3)); - menu3.add(new MenuItem("新增角色",3)); - menu3.add(new MenuItem("修改角色",3)); - - //创建一级菜单 - MenuComponent component = new Menu("系统管理",1); - //将二级菜单添加到一级菜单中 - component.add(menu1); - component.add(menu2); - component.add(menu3); - - - //打印菜单名称(如果有子菜单一块打印) - component.print(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/Menu.java b/src/main/java/com/fangpeng/design/pattern/combination/Menu.java deleted file mode 100644 index 31cfe758..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/Menu.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -import java.util.ArrayList; -import java.util.List; - -/** - * 菜单类 : 属于树枝节点 - * @author 方鹏 - * @date 2022年02月08日 2:06 下午 - */ -public class Menu extends MenuComponent { - - //菜单可以有多个子菜单或者子菜单项 - private List menuComponentList = new ArrayList<>(); - - //构造方法 - public Menu(String name, int level) { - this.name = name; - this.level = level; - } - - @Override - public void add(MenuComponent menuComponent) { - menuComponentList.add(menuComponent); - } - - @Override - public void remove(MenuComponent menuComponent) { - menuComponentList.remove(menuComponent); - } - - @Override - public MenuComponent getChild(int index) { - return menuComponentList.get(index); - } - - @Override - public void print() { - //打印菜单名称 - for(int i = 0; i < level; i++) { - System.out.print("--|"); - } - System.out.println(name); - - //打印子菜单或者子菜单项名称 - for (MenuComponent component : menuComponentList) { - component.print(); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java b/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java deleted file mode 100644 index 0307ad80..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * 菜单组件 : 属于抽象根节点 - * @author 方鹏 - * @date 2022年02月08日 2:02 下午 - */ -public abstract class MenuComponent { - - //菜单组件的名称 - protected String name; - //菜单组件的层级 - protected int level; - - //添加子菜单 - public void add(MenuComponent menuComponent) { - throw new UnsupportedOperationException(); - } - - //移除子菜单 - public void remove(MenuComponent menuComponent) { - throw new UnsupportedOperationException(); - } - - //获取指定的子菜单 - public MenuComponent getChild(int index) { - throw new UnsupportedOperationException(); - } - - //获取菜单或者菜单项的名称 - public String getName() { - return name; - } - - //打印菜单名称的方法(包含子菜单和字菜单项) - public abstract void print(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java b/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java deleted file mode 100644 index a2db6723..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * 菜单项类 : 属于叶子节点 - * @author 方鹏 - * @date 2022年02月08日 2:12 下午 - */ -public class MenuItem extends MenuComponent { - - public MenuItem(String name,int level) { - this.name = name; - this.level = level; - } - - @Override - public void print() { - //打印菜单项的名称 - for(int i = 0; i < level; i++) { - System.out.print("--|"); - } - System.out.println(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Client.java b/src/main/java/com/fangpeng/design/pattern/command/Client.java deleted file mode 100644 index 4d238c4b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Client.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * @author 方鹏 - * @date 2022年02月08日 4:10 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建第一个订单对象 - Order order1 = new Order(); - order1.setDiningTable(1); - order1.setFood("西红柿鸡蛋面",1); - order1.setFood("小杯可乐",2); - - //创建第二个订单对象 - Order order2 = new Order(); - order2.setDiningTable(2); - order2.setFood("尖椒肉丝盖饭",1); - order2.setFood("小杯雪碧",1); - - //创建厨师对象 - SeniorChef receiver = new SeniorChef(); - //创建命令对象 - OrderCommand cmd1 = new OrderCommand(receiver,order1); - OrderCommand cmd2 = new OrderCommand(receiver,order2); - - //创建调用者(服务员对象) - Waitor invoke = new Waitor(); - invoke.setCommand(cmd1); - invoke.setCommand(cmd2); - - //让服务员发起命令 - invoke.orderUp(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Command.java b/src/main/java/com/fangpeng/design/pattern/command/Command.java deleted file mode 100644 index 95a6f348..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Command.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * 抽象命令类 - * @author 方鹏 - * @date 2022年02月08日 4:04 下午 - */ -public interface Command { - - void execute(); -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Order.java b/src/main/java/com/fangpeng/design/pattern/command/Order.java deleted file mode 100644 index 66e8c412..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Order.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.HashMap; -import java.util.Map; - -/** - * 订单类 - * @author 方鹏 - * @date 2022年02月08日 4:02 下午 - */ -public class Order { - //餐桌号码 - private int diningTable; - - //所下的餐品及份数 - private Map foodDir = new HashMap<>(); - - public int getDiningTable() { - return diningTable; - } - - public void setDiningTable(int diningTable) { - this.diningTable = diningTable; - } - - public Map getFoodDir() { - return foodDir; - } - - public void setFood(String name, int num) { - foodDir.put(name,num); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java b/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java deleted file mode 100644 index add13774..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.Map; -import java.util.Set; - -/** - * 具体的命令类 - * @author 方鹏 - * @date 2022年02月08日 4:05 下午 - */ -public class OrderCommand implements Command { - - //持有接收者对象 - private SeniorChef receiver; - private Order order; - - public OrderCommand(SeniorChef receiver, Order order) { - this.receiver = receiver; - this.order = order; - } - - @Override - public void execute() { - System.out.println(order.getDiningTable() + "桌的订单:"); - Map foodDir = order.getFoodDir(); - //遍历map集合 - Set keys = foodDir.keySet(); - for (String foodName : keys) { - receiver.makeFood(foodName, foodDir.get(foodName)); - } - - System.out.println(order.getDiningTable() + "桌的饭准备完毕!!!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java b/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java deleted file mode 100644 index 066d0e43..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * 厨师类 - * @author 方鹏 - * @date 2022年02月08日 4:04 下午 - */ -public class SeniorChef { - - public void makeFood(String name,int num) { - System.out.println("厨师制作:" + num + "份" + name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Waitor.java b/src/main/java/com/fangpeng/design/pattern/command/Waitor.java deleted file mode 100644 index bb6065ee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Waitor.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.ArrayList; -import java.util.List; - -/** - * 服务员类(属于请求者角色) - * @author 方鹏 - * @date 2022年02月08日 4:08 下午 - */ -public class Waitor { - - //持有多个命令对象 - private List commands = new ArrayList(); - - public void setCommand(Command cmd) { - //将cmd对象存储到list集合中 - commands.add(cmd); - } - - //发起命令功能 喊 订单来了 - public void orderUp() { - System.out.println("美女服务员:大厨,新订单来了。。。。"); - //遍历list集合 - for (Command command : commands) { - if(command != null) { - command.execute(); - } - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java b/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java deleted file mode 100644 index efd6cf2b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 培根类(具体的装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:33 下午 - */ -public class Bacon extends Garnish { - - public Bacon(FastFood fastFood) { - super(fastFood,2,"培根"); - } - - @Override - public float cost() { - //计算价格 - return getPrice() + getFastFood().cost(); - } - - @Override - public String getDesc() { - return super.getDesc() + getFastFood().getDesc(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Client.java b/src/main/java/com/fangpeng/design/pattern/decorator/Client.java deleted file mode 100644 index f0f8272c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Client.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * @author 方鹏 - * @date 2022年02月07日 9:33 下午 - */ -public class Client { - - public static void main(String[] args) { - //点一份炒饭 - FastFood food = new FriedRice(); - - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("==============="); - - //在上面的炒饭中加一个鸡蛋 - food = new Egg(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("================"); - //再加一个鸡蛋 - food = new Egg(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("================"); - food = new Bacon(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java b/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java deleted file mode 100644 index ca84e5bc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 鸡蛋类(具体的装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:30 下午 - */ -public class Egg extends Garnish { - - public Egg(FastFood fastFood) { - super(fastFood, 1, "鸡蛋"); - } - - @Override - public float cost() { - //计算价格 - return getPrice() + getFastFood().cost(); - } - - @Override - public String getDesc() { - return super.getDesc() + getFastFood().getDesc(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java b/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java deleted file mode 100644 index dc884268..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 快餐类(抽象构件角色) - * @author 方鹏 - * @date 2022年02月07日 9:24 下午 - */ -public abstract class FastFood { - - private float price;//价格 - private String desc; //描述 - - public float getPrice() { - return price; - } - - public void setPrice(float price) { - this.price = price; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public FastFood(float price, String desc) { - this.price = price; - this.desc = desc; - } - - public FastFood() { - } - - public abstract float cost(); -} - diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java b/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java deleted file mode 100644 index 7c32f0b7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * @author 方鹏 - * @date 2022年02月07日 9:27 下午 - */ -public class FriedNoodles extends FastFood { - - public FriedNoodles() { - super(12,"炒面"); - } - - @Override - public float cost() { - return getPrice(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java b/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java deleted file mode 100644 index 6eda3d40..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 炒饭(具体构件角色) - * @author 方鹏 - * @date 2022年02月07日 9:26 下午 - */ -public class FriedRice extends FastFood { - - public FriedRice() { - super(10,"炒饭"); - } - - @Override - public float cost() { - return getPrice(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java b/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java deleted file mode 100644 index 1529dbb0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** 装饰者类(抽象装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:29 下午 - */ -public abstract class Garnish extends FastFood { - - //声明快餐类的变量 - private FastFood fastFood; - - public FastFood getFastFood() { - return fastFood; - } - - public void setFastFood(FastFood fastFood) { - this.fastFood = fastFood; - } - - public Garnish(FastFood fastFood, float price, String desc) { - super(price, desc); - this.fastFood = fastFood; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java b/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java deleted file mode 100644 index 62109ebb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 空调类 - * @author 方鹏 - * @date 2022年02月08日 1:42 下午 - */ -public class AirCondition { - - public void on() { - System.out.println("打开空调。。。。"); - } - - public void off() { - System.out.println("关闭空调。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/Client.java b/src/main/java/com/fangpeng/design/pattern/facade/Client.java deleted file mode 100644 index 779a4e40..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/Client.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * @author 方鹏 - * @date 2022年02月08日 1:46 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建智能音箱对象 - SmartAppliancesFacade facade = new SmartAppliancesFacade(); - //控制家电 - facade.say("打开家电"); - - System.out.println("=================="); - - facade.say("关闭家电"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/Light.java b/src/main/java/com/fangpeng/design/pattern/facade/Light.java deleted file mode 100644 index 359d818a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/Light.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 电灯类 - * @author 方鹏 - * @date 2022年02月08日 1:41 下午 - */ -public class Light { - - //开灯 - public void on() { - System.out.println("打开电灯。。。。"); - } - - //关灯 - public void off() { - System.out.println("关闭电灯。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java b/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java deleted file mode 100644 index 312c5743..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 外观类,用户主要和该类对象进行交互 - * @author 方鹏 - * @date 2022年02月08日 1:42 下午 - */ -public class SmartAppliancesFacade { - - //聚合电灯对象,电视机对象,空调对象 - private Light light; - private TV tv; - private AirCondition airCondition; - - public SmartAppliancesFacade() { - light = new Light(); - tv = new TV(); - airCondition = new AirCondition(); - } - - //通过语言控制 - public void say(String message) { - if(message.contains("打开")) { - on(); - } else if(message.contains("关闭")) { - off(); - } else { - System.out.println("我还听不懂你说的!!!"); - } - } - - - //一键打开功能 - private void on() { - light.on(); - tv.on(); - airCondition.on(); - } - - //一键关闭功能 - private void off() { - light.off(); - tv.off(); - airCondition.off(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/TV.java b/src/main/java/com/fangpeng/design/pattern/facade/TV.java deleted file mode 100644 index 5a821343..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/TV.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 电视机类 - * @author 方鹏 - * @date 2022年02月08日 1:41 下午 - */ -public class TV { - - public void on() { - System.out.println("打开电视机。。。。"); - } - - public void off() { - System.out.println("关闭电视机。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java deleted file mode 100644 index c75f4d7d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java deleted file mode 100644 index 87061eda..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 美式风味的甜品工厂:生产美式咖啡和抹茶慕斯 - */ -public class AmericanDessertFactory implements DessertFactory { - @Override - public Coffee createCoffee() { - return new AmericanCoffee(); - } - - @Override - public Dessert createDessert() { - return new MatchaMousse(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java deleted file mode 100644 index c5b61484..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -public class Client { - - public static void main(String[] args) { - //创建的是意大利风味甜品工厂对象 - //ItalyDessertFactory factory = new ItalyDessertFactory(); - AmericanDessertFactory factory = new AmericanDessertFactory(); - //获取拿铁咖啡和提拉米苏甜品 - Coffee coffee = factory.createCoffee(); - Dessert dessert = factory.createDessert(); - - System.out.println(coffee.getName()); - dessert.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java deleted file mode 100644 index ef3a6ce8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java deleted file mode 100644 index cabc8d6d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 甜品抽象类 - */ -public abstract class Dessert { - - public abstract void show(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java deleted file mode 100644 index 29ee6d57..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -public interface DessertFactory { - - //生产咖啡的功能 - Coffee createCoffee(); - - //生产甜品的功能 - Dessert createDessert(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java deleted file mode 100644 index 54134188..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 意大利风味甜品工厂:生产拿铁咖啡和提拉米苏甜品 - */ -public class ItalyDessertFactory implements DessertFactory { - @Override - public Coffee createCoffee() { - return new LatteCoffee(); - } - - @Override - public Dessert createDessert() { - return new Trimisu(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java deleted file mode 100644 index ef73e645..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java deleted file mode 100644 index 46946480..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 抹茶慕斯类 - */ -public class MatchaMousse extends Dessert { - @Override - public void show() { - System.out.println("抹茶慕斯"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java deleted file mode 100644 index e7dc7d28..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 提拉米苏类 - */ -public class Trimisu extends Dessert { - @Override - public void show() { - System.out.println("提拉米苏"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java deleted file mode 100644 index a6f62589..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java deleted file mode 100644 index acc5720f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java deleted file mode 100644 index b48d5c54..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java deleted file mode 100644 index 96038e69..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java deleted file mode 100644 index 19a15311..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java deleted file mode 100644 index 6895f839..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java deleted file mode 100644 index 5b6fa0d9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -public class Client { - - public static void main(String[] args) { - Coffee coffee = CoffeeFactory.createCoffee("american"); - System.out.println(coffee.getName()); - - System.out.println("============="); - Coffee latte = CoffeeFactory.createCoffee("latte"); - System.out.println(latte.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java deleted file mode 100644 index b4ca156d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java deleted file mode 100644 index 963bea42..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -import com.sun.xml.internal.bind.v2.ClassFactory; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -public class CoffeeFactory { - - //加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储 - //1,定义容器对象存储咖啡对象 - private static Map map = new HashMap<>(); - - //2,加载配置文件, 只需要加载一次 - static { - //2.1 创建Properties对象 - Properties p = new Properties(); - //2.2 调用p对象中的load方法进行配置文件的加载 - InputStream is = ClassFactory.class.getClassLoader().getResourceAsStream("bean.properties"); - try { - p.load(is); - //从p集合中获取全类名并创建对象 - Set keys = p.keySet(); - for (Object key : keys) { - String className = p.getProperty((String) key); - //通过反射技术创建对象 - Class clazz = Class.forName(className); - Coffee coffee = (Coffee) clazz.newInstance(); - //将名称和对象存储到容器中 - map.put((String)key, coffee); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - //根据名称获取对象 - public static Coffee createCoffee(String name) { - return map.get(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java deleted file mode 100644 index 0f6dce18..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java deleted file mode 100644 index 692cbedf..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java deleted file mode 100644 index 7c96f956..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class AmericanCoffeeFactory implements CoffeeFactory { - @Override - public Coffee createCoffee() { - return new AmericanCoffee(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java deleted file mode 100644 index 6a38d3ca..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - store.setFactory(new AmericanCoffeeFactory()); - //2,点咖啡 - Coffee coffee = store.orderCoffee(); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java deleted file mode 100644 index 0eeda4bd..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java deleted file mode 100644 index af37f98a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - CoffeeFactory : 抽象工厂 - */ -public interface CoffeeFactory { - - //创建咖啡对象的方法 - Coffee createCoffee(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java deleted file mode 100644 index de67807e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -import com.fangpeng.design.pattern.factory.simple_factory.SimpleCoffeeFactory; - -public class CoffeeStore { - - private CoffeeFactory factory; - - public void setFactory(CoffeeFactory factory) { - this.factory = factory; - } - - public Coffee orderCoffee() { - - Coffee coffee = factory.createCoffee(); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java deleted file mode 100644 index 81d191be..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java deleted file mode 100644 index 1e22e32a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class LatteCoffeeFactory implements CoffeeFactory { - @Override - public Coffee createCoffee() { - return new LatteCoffee(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java deleted file mode 100644 index 31c593dc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java deleted file mode 100644 index 837a90c5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java deleted file mode 100644 index 25e20b6d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java deleted file mode 100644 index af08dc96..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - SimpleCoffeeFactory factory = new SimpleCoffeeFactory(); - //调用生产咖啡的方法 - Coffee coffee = factory.createCoffee(type); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java deleted file mode 100644 index f4d4a834..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java deleted file mode 100644 index 6be44db0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 简单咖啡工厂类,用来生产咖啡 - */ -public class SimpleCoffeeFactory { - - public Coffee createCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java deleted file mode 100644 index 46d20368..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java deleted file mode 100644 index f2eb10c4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java deleted file mode 100644 index 2c2cade3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java deleted file mode 100644 index d60e5188..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - - //调用生产咖啡的方法 - Coffee coffee = SimpleCoffeeFactory.createCoffee(type); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java deleted file mode 100644 index 69dff436..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java deleted file mode 100644 index 75215686..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 简单咖啡工厂类,用来生产咖啡 - */ -public class SimpleCoffeeFactory { - - public static Coffee createCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java deleted file mode 100644 index 4019d14e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * 抽象享元角色 - * @author 方鹏 - * @date 2022年02月08日 2:37 下午 - */ -public abstract class AbstractBox { - - //获取图形的方法 - public abstract String getShape(); - - //显示图形及颜色 - public void display(String color) { - System.out.println("方块形状:" + getShape() + ", 颜色:" + color); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java b/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java deleted file mode 100644 index 78f7bb94..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -import java.util.HashMap; -import java.util.Map; - -/** - * 工厂类,将该类设计为单例 - * @author 方鹏 - * @date 2022年02月08日 2:39 下午 - */ -public class BoxFactory { - - private Map map; - - //在构造方法中进行初始化操作 - private BoxFactory() { - map = new HashMap<>(); - map.put("I", new IBox()); - map.put("L", new LBox()); - map.put("O", new OBox()); - } - - private static BoxFactory factory = new BoxFactory(); - - //提供一个方法获取该工厂类对象 - public static BoxFactory getInstance() { - return factory; - } - - //根据名称获取图形对象 - public AbstractBox getShape(String name) { - return map.get(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java b/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java deleted file mode 100644 index bf8369e6..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * @author 方鹏 - * @date 2022年02月08日 2:42 下午 - */ -public class Client { - - public static void main(String[] args) { - //获取I图形对象 - AbstractBox box1 = BoxFactory.getInstance().getShape("I"); - box1.display("灰色"); - - //获取L图形对象 - AbstractBox box2 = BoxFactory.getInstance().getShape("L"); - box2.display("绿色"); - - //获取O图形对象 - AbstractBox box3 = BoxFactory.getInstance().getShape("O"); - box3.display("灰色"); - - //获取O图形对象 - AbstractBox box4 = BoxFactory.getInstance().getShape("O"); - box4.display("红色"); - - System.out.println("两次获取到的O图形对象是否是同一个对象:" + (box3 == box4)); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java deleted file mode 100644 index d69bffc7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * I图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:38 下午 - */ -public class IBox extends AbstractBox { - - @Override - public String getShape() { - return "I"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java deleted file mode 100644 index 58023ea5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * L图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:38 下午 - */ -public class LBox extends AbstractBox { - - @Override - public String getShape() { - return "L"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java deleted file mode 100644 index 8de72af4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * O图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:39 下午 - */ -public class OBox extends AbstractBox { - - @Override - public String getShape() { - return "O"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java b/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java deleted file mode 100644 index a989125a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 抽象表达式类 - * @author 方鹏 - * @date 2022年02月09日 6:49 下午 - */ -public abstract class AbstractExpression { - - public abstract int interpret(Context context); -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java deleted file mode 100644 index 920ff752..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * @author 方鹏 - * @date 2022年02月09日 9:45 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建环境对象 - Context context = new Context(); - - //创建多个变量对象 - Variable a = new Variable("a"); - Variable b = new Variable("b"); - Variable c = new Variable("c"); - Variable d = new Variable("d"); - - //将变量存储到环境对象中 - context.assign(a,1); - context.assign(b,2); - context.assign(c,3); - context.assign(d,4); - - //获取抽象语法树 a + b - c + d - AbstractExpression expression = new Minus(a,new Minus(new Minus(b,c),d)); - - //解释(计算) - int result = expression.interpret(context); - - System.out.println(expression + " = " + result); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java deleted file mode 100644 index 130c4e0a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -import java.util.HashMap; -import java.util.Map; - -/** - * 环境角色类 - * @author 方鹏 - * @date 2022年02月09日 6:49 下午 - */ -public class Context { - - //定义一个map集合,用来存储变量及对应的值 - private Map map = new HashMap(); - - //添加变量的功能 - public void assign(Variable var, Integer value) { - map.put(var,value); - } - - //根据变量获取对应的值 - public int getValue(Variable var) { - return map.get(var); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java deleted file mode 100644 index 3a21dbc2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 减法表达式类 - * @author 方鹏 - * @date 2022年02月09日 9:26 下午 - */ -public class Minus extends AbstractExpression { - - //-号左边的表达式 - private AbstractExpression left; - //-号右边的表达式 - private AbstractExpression right; - - public Minus(AbstractExpression left, AbstractExpression right) { - this.left = left; - this.right = right; - } - - @Override - public int interpret(Context context) { - //将左边表达式的结果和右边表达式的结果进行相减 - return left.interpret(context) - right.interpret(context); - } - - @Override - public String toString() { - return "(" + left.toString() + " - " + right.toString() + ")"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java deleted file mode 100644 index 4f80f9ba..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 加法表达式类 - * @author 方鹏 - * @date 2022年02月09日 9:26 下午 - */ -public class Plus extends AbstractExpression { - - //+号左边的表达式 - private AbstractExpression left; - //+号右边的表达式 - private AbstractExpression right; - - public Plus(AbstractExpression left, AbstractExpression right) { - this.left = left; - this.right = right; - } - - @Override - public int interpret(Context context) { - //将左边表达式的结果和右边表达式的结果进行相加 - return left.interpret(context) + right.interpret(context); - } - - @Override - public String toString() { - return "(" + left.toString() + " + " + right.toString() + ")"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java deleted file mode 100644 index 3d56211c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 封装变量的类 - * @author 方鹏 - * @date 2022年02月09日 9:27 下午 - */ -public class Variable extends AbstractExpression { - - //声明存储变量名的成员变量 - private String name; - - public Variable(String name) { - this.name = name; - } - - @Override - public int interpret(Context context) { - //直接返回变量的值 - return context.getValue(this); - } - - @Override - public String toString() { - return name; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/Client.java b/src/main/java/com/fangpeng/design/pattern/iterator/Client.java deleted file mode 100644 index 42283dac..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/Client.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:54 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建聚合对象 - StudentAggregateImpl aggregate = new StudentAggregateImpl(); - //添加元素 - aggregate.addStudent(new Student("张三","001")); - aggregate.addStudent(new Student("李四","002")); - aggregate.addStudent(new Student("王五","003")); - aggregate.addStudent(new Student("赵六","004")); - - //遍历聚合对象 - - //1,获取迭代器对象 - StudentIterator iterator = aggregate.getStudentIterator(); - //2,遍历 - while(iterator.hasNext()) { - //3,获取元素 - Student student = iterator.next(); - System.out.println(student.toString()); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/Student.java b/src/main/java/com/fangpeng/design/pattern/iterator/Student.java deleted file mode 100644 index a6d2b3f9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/Student.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:49 下午 - */ -public class Student { - - private String name; - private String number; - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - ", number='" + number + '\'' + - '}'; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getNumber() { - return number; - } - - public void setNumber(String number) { - this.number = number; - } - - public Student(String name, String number) { - this.name = name; - this.number = number; - } - - public Student() { - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java deleted file mode 100644 index ceac4047..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/* - * 抽象聚合角色接口 - * @author 方鹏 - * @date 2022/2/8 8:52 下午 - */ -public interface StudentAggregate { - - //添加学生功能 - void addStudent(Student stu); - - //删除学生功能 - void removeStudent(Student stu); - - //获取迭代器对象功能 - StudentIterator getStudentIterator(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java deleted file mode 100644 index 2b552d67..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:52 下午 - */ -public class StudentAggregateImpl implements StudentAggregate { - - private List list = new ArrayList(); - - @Override - public void addStudent(Student stu) { - list.add(stu); - } - - @Override - public void removeStudent(Student stu) { - list.remove(stu); - } - - @Override - public StudentIterator getStudentIterator() { - return new StudentIteratorImpl(list); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java deleted file mode 100644 index ef4054f1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/* - * 抽象迭代器角色接口 - * @author 方鹏 - * @date 2022/2/8 8:49 下午 -*/ -public interface StudentIterator { - - //判断是否还有元素 - boolean hasNext(); - - //获取下一个元素 - Student next(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java deleted file mode 100644 index 44bbb354..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -import java.util.List; - -/** - * 具体迭代器角色类 - * @author 方鹏 - * @date 2022年02月08日 8:50 下午 - */ -public class StudentIteratorImpl implements StudentIterator { - - private List list; - private int position = 0;//用来记录遍历时的位置 - - public StudentIteratorImpl(List list) { - this.list = list; - } - - @Override - public boolean hasNext() { - return position < list.size(); - } - - @Override - public Student next() { - //从集合中获取指定位置的元素 - Student currentStudent = list.get(position); - position++; - return currentStudent; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Client.java b/src/main/java/com/fangpeng/design/pattern/mediator/Client.java deleted file mode 100644 index ff1ad405..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Client.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:36 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建中介者对象 - MediatorStructure mediator = new MediatorStructure(); - - //创建租房者对象 - Tenant tenant = new Tenant("李四", mediator); - //创建房主对象 - HouseOwner houseOwner = new HouseOwner("张三", mediator); - - //中介者要知道具体的房主和租房者 - mediator.setTenant(tenant); - mediator.setHouseOwner(houseOwner); - - tenant.constact("我要租三室的房子!!!"); - houseOwner.constact("我这里有三室的房子,你要租吗?"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java b/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java deleted file mode 100644 index 843f8fa5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的同事角色类 - * @author 方鹏 - * @date 2022年02月08日 8:29 下午 - */ -public class HouseOwner extends Person { - - public HouseOwner(String name, Mediator mediator) { - super(name, mediator); - } - - //和中介联系(沟通) - public void constact(String message) { - mediator.constact(message,this); - } - - //获取信息 - public void getMessage(String message) { - System.out.println("房主" + name + "获取到的信息是:" + message); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java b/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java deleted file mode 100644 index f9f87535..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 抽象中介者类 - * @author 方鹏 - * @date 2022年02月08日 8:27 下午 - */ -public abstract class Mediator { - - public abstract void constact(String message, Person person); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java b/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java deleted file mode 100644 index d80aa0ef..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的中介者角色类 - * @author 方鹏 - * @date 2022年02月08日 8:31 下午 - */ -public class MediatorStructure extends Mediator { - - //聚合房主和租房者对象 - private HouseOwner houseOwner; - private Tenant tenant; - - public HouseOwner getHouseOwner() { - return houseOwner; - } - - public void setHouseOwner(HouseOwner houseOwner) { - this.houseOwner = houseOwner; - } - - public Tenant getTenant() { - return tenant; - } - - public void setTenant(Tenant tenant) { - this.tenant = tenant; - } - - @Override - public void constact(String message, Person person) { - if(person == houseOwner) { - tenant.getMessage(message); - } else { - houseOwner.getMessage(message); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Person.java b/src/main/java/com/fangpeng/design/pattern/mediator/Person.java deleted file mode 100644 index 32850896..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Person.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 抽象同事类 - * @author 方鹏 - * @date 2022年02月08日 8:28 下午 - */ -public abstract class Person { - - protected String name; - protected Mediator mediator; - - public Person(String name, Mediator mediator) { - this.name = name; - this.mediator = mediator; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java b/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java deleted file mode 100644 index bcaa3d46..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的同事角色类 - * @author 方鹏 - * @date 2022年02月08日 8:30 下午 - */ -public class Tenant extends Person { - public Tenant(String name, Mediator mediator) { - super(name, mediator); - } - - //和中介联系(沟通) - public void constact(String message) { - mediator.constact(message,this); - } - - //获取信息 - public void getMessage(String message) { - System.out.println("租房者" + name + "获取到的信息是:" + message); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java deleted file mode 100644 index dadf4457..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * @author 方鹏 - * @date 2022年02月09日 6:26 下午 - */ -public class Client { - public static void main(String[] args) { - System.out.println("---------------大战boos前-----------------"); - //创建游戏角色对象 - GameRole gameRole = new GameRole(); - gameRole.initState();//初始化状态操作 - gameRole.stateDisplay(); - - //将该游戏角色内部状态进行备份 - //创建管理者对象 - RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker(); - roleStateCaretaker.setMemento(gameRole.saveState()); - - System.out.println("---------------大战boos后-----------------"); - //损耗严重 - gameRole.fight(); - gameRole.stateDisplay(); - - System.out.println("---------------恢复之前的状态-----------------"); - gameRole.recoverState(roleStateCaretaker.getMemento()); - gameRole.stateDisplay(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java deleted file mode 100644 index bf7880bc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * 游戏角色类(属于发起人角色) - * @author 方鹏 - * @date 2022年02月09日 6:25 下午 - */ -public class GameRole { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - //初始化内部状态 - public void initState() { - this.vit = 100; - this.atk = 100; - this.def = 100; - } - - //战斗 - public void fight() { - this.vit = 0; - this.atk = 0; - this.def = 0; - } - - //保存角色状态功能 - public Memento saveState() { - return new RoleStateMemento(vit,atk,def); - } - - //恢复角色状态 - public void recoverState(Memento memento) { - RoleStateMemento roleStateMemento = (RoleStateMemento) memento; - //将备忘录对象中存储的状态赋值给当前对象的成员 - this.vit = roleStateMemento.getVit(); - this.atk = roleStateMemento.getAtk(); - this.def = roleStateMemento.getDef(); - } - - //展示状态功能 - public void stateDisplay() { - System.out.println("角色生命力:" + vit); - System.out.println("角色攻击力:" + atk); - System.out.println("角色防御力:" + def); - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - - private class RoleStateMemento implements Memento { - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - public RoleStateMemento(int vit, int atk, int def) { - this.vit = vit; - this.atk = atk; - this.def = def; - } - - public RoleStateMemento() { - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java deleted file mode 100644 index 49890cb4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/* - * 备忘录接口,对外提供窄接口 - * @author 方鹏 - * @date 2022/2/9 6:25 下午 - */ -public interface Memento { -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java deleted file mode 100644 index 2a8d886d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * 备忘录对象管理对象 - * @author 方鹏 - * @date 2022年02月09日 6:25 下午 - */ -public class RoleStateCaretaker { - - //声明RoleStateMemento类型的变量 - private Memento memento; - - public Memento getMemento() { - return memento; - } - - public void setMemento(Memento memento) { - this.memento = memento; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java deleted file mode 100644 index b9be516e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * @author 方鹏 - * @date 2022年02月09日 5:23 下午 - */ -public class Client { - - public static void main(String[] args) { - System.out.println("---------------大战boos前-----------------"); - //创建游戏角色对象 - GameRole gameRole = new GameRole(); - gameRole.initState();//初始化状态操作 - gameRole.stateDisplay(); - - //将该游戏角色内部状态进行备份 - //创建管理者对象 - RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker(); - roleStateCaretaker.setRoleStateMemento(gameRole.saveState()); - - System.out.println("---------------大战boos后-----------------"); - //损耗严重 - gameRole.fight(); - gameRole.stateDisplay(); - - System.out.println("---------------恢复之前的状态-----------------"); - gameRole.recoverState(roleStateCaretaker.getRoleStateMemento()); - gameRole.stateDisplay(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java deleted file mode 100644 index 8a96caa5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 游戏角色类(属于发起人角色) - * @author 方鹏 - * @date 2022年02月09日 5:32 下午 - */ -public class GameRole { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - //初始化内部状态 - public void initState() { - this.vit = 100; - this.atk = 100; - this.def = 100; - } - - //战斗 - public void fight() { - this.vit = 0; - this.atk = 0; - this.def = 0; - } - - //保存角色状态功能 - public RoleStateMemento saveState() { - return new RoleStateMemento(vit,atk,def); - } - - //恢复角色状态 - public void recoverState(RoleStateMemento roleStateMemento) { - //将备忘录对象中存储的状态赋值给当前对象的成员 - this.vit = roleStateMemento.getVit(); - this.atk = roleStateMemento.getAtk(); - this.def = roleStateMemento.getDef(); - } - - //展示状态功能 - public void stateDisplay() { - System.out.println("角色生命力:" + vit); - System.out.println("角色攻击力:" + atk); - System.out.println("角色防御力:" + def); - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java deleted file mode 100644 index 53922cd1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 备忘录对象管理对象 - * @author 方鹏 - * @date 2022年02月09日 5:35 下午 - */ -public class RoleStateCaretaker { - - //声明RoleStateMemento类型的变量 - private RoleStateMemento roleStateMemento; - - public RoleStateMemento getRoleStateMemento() { - return roleStateMemento; - } - - public void setRoleStateMemento(RoleStateMemento roleStateMemento) { - this.roleStateMemento = roleStateMemento; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java deleted file mode 100644 index 643b83a3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 备忘录角色类 - * @author 方鹏 - * @date 2022年02月09日 5:42 下午 - */ -public class RoleStateMemento { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - public RoleStateMemento(int vit, int atk, int def) { - this.vit = vit; - this.atk = atk; - this.def = def; - } - - public RoleStateMemento() { - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Client.java b/src/main/java/com/fangpeng/design/pattern/observer/Client.java deleted file mode 100644 index 684a76ee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * @author 方鹏 - * @date 2022年02月08日 6:31 下午 - */ -public class Client { - - public static void main(String[] args) { - //1,创建公众号对象 - SubscriptionSubject subject = new SubscriptionSubject(); - - //2,订阅公众号 - subject.attach(new WeiXinUser("孙悟空")); - subject.attach(new WeiXinUser("猪悟能")); - subject.attach(new WeiXinUser("沙悟净")); - - //3,公众号更新,发出消息给订阅者(观察者对象) - subject.notify("程序猿的专栏更新了!"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Observer.java b/src/main/java/com/fangpeng/design/pattern/observer/Observer.java deleted file mode 100644 index fb643116..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Observer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * 抽象观察者类 - * @author 方鹏 - * @date 2022年02月08日 6:27 下午 - */ -public interface Observer { - - void update(String message); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Subject.java b/src/main/java/com/fangpeng/design/pattern/observer/Subject.java deleted file mode 100644 index f6ed7b60..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Subject.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/* - * 抽象主题角色类 - * @author 方鹏 - * @date 2022/2/8 6:26 下午 - */ -public interface Subject { - - //添加订阅者(添加观察者对象) - void attach(Observer observer); - - //删除订阅者 - void detach(Observer observer); - - //通知订阅者更新消息 - void notify(String message); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java b/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java deleted file mode 100644 index dca6e7d5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -import java.util.ArrayList; -import java.util.List; - -/** - * 具体主题角色类 - * @author 方鹏 - * @date 2022年02月08日 6:27 下午 - */ -public class SubscriptionSubject implements Subject { - - //定义一个集合,用来存储多个观察者对象 - private List weixinUserList = new ArrayList<>(); - - @Override - public void attach(Observer observer) { - weixinUserList.add(observer); - } - - @Override - public void detach(Observer observer) { - weixinUserList.remove(observer); - } - - @Override - public void notify(String message) { - //遍历集合 - for (Observer observer : weixinUserList) { - //调用观察者对象中的update方法 - observer.update(message); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java b/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java deleted file mode 100644 index e8ad24e7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * 具体的观察者角色类 - * @author 方鹏 - * @date 2022年02月08日 6:29 下午 - */ -public class WeiXinUser implements Observer { - - private String name; - - public WeiXinUser(String name) { - this.name = name; - } - - @Override - public void update(String message) { - System.out.println(name + "-" + message); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java b/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java deleted file mode 100644 index 35dd74f8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.prototype.demo; - -import java.io.Closeable; -import java.io.IOException; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:44 下午 - */ -public class Realizetype implements Cloneable { - - public Realizetype() { - System.out.println("具体的原型对象创建完成!"); - } - - @Override - protected Realizetype clone() throws CloneNotSupportedException { - System.out.println("具体原型复制成功!"); - - return (Realizetype) super.clone(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java b/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java deleted file mode 100644 index 2d238e62..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.prototype.demo; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:46 下午 - */ -public class client { - - public static void main(String[] args) throws CloneNotSupportedException { - //创建一个原型类对象 - Realizetype realizetype = new Realizetype(); - - //调用Realizetype类中的clone方法进行对象的克隆 - Realizetype clone = realizetype.clone(); - - System.out.println("原型对象和克隆出来的是否是同一个对象?" + (realizetype == clone)); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java deleted file mode 100644 index fcdc0911..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:54 下午 - */ -public class CitaionTest { - - public static void main(String[] args) throws CloneNotSupportedException { - //1,创建原型对象 - Citation citation = new Citation(); - //创建张三学生对象 - Student stu = new Student(); - stu.setName("张三"); - citation.setStu(stu); - - //2,克隆奖状对象 - Citation citation1 = citation.clone(); - Student stu1 = citation1.getStu(); - stu1.setName("李四"); - - /*citation.setName("张三"); - citation1.setName("李四");*/ - - //3,调用show方法展示 - citation.show(); - citation1.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java deleted file mode 100644 index f620ee5c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:52 下午 - */ -public class Citation implements Cloneable{ - - //三好学生上的姓名 - //private String name; - // - //public String getName() { - // return name; - //} - // - //public void setName(String name) { - // this.name = name; - //} - - private Student stu; - - public Student getStu() { - return stu; - } - - public void setStu(Student stu) { - this.stu = stu; - } - - @Override - public Citation clone() throws CloneNotSupportedException { - return (Citation) super.clone(); - } - - public void show() { - System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java deleted file mode 100644 index f494b2af..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:58 下午 - */ -public class Student { - - //学生的姓名 - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - '}'; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java deleted file mode 100644 index 83fd435c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:54 下午 - */ -public class CitaionTest { - - public static void main(String[] args) throws Exception { - //1,创建原型对象 - Citation citation = new Citation(); - //创建张三学生对象 - Student stu = new Student(); - stu.setName("张三"); - citation.setStu(stu); - - //创建对象输出流对象 - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/robin/a.txt")); - //写对象 - oos.writeObject(citation); - //释放资源 - oos.close(); - - //创建对象输入流对象 - ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/robin/a.txt")); - //读取对象 - Citation citation1 = (Citation) ois.readObject(); - //释放资源 - ois.close(); - Student stu1 = citation1.getStu(); - stu1.setName("李四"); - - citation.show(); - citation1.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java deleted file mode 100644 index 3fde0c6f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.Serializable; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:52 下午 - */ -public class Citation implements Cloneable, Serializable { - - //三好学生上的姓名 - //private String name; - // - //public String getName() { - // return name; - //} - // - //public void setName(String name) { - // this.name = name; - //} - - private Student stu; - - public Student getStu() { - return stu; - } - - public void setStu(Student stu) { - this.stu = stu; - } - - @Override - public Citation clone() throws CloneNotSupportedException { - return (Citation) super.clone(); - } - - public void show() { - System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java deleted file mode 100644 index be56d6fe..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.Serializable; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:58 下午 - */ -public class Student implements Serializable { - - //学生的姓名 - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - '}'; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java deleted file mode 100644 index fb8ec17f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:54 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建代理工厂对象 - ProxyFactory factory = new ProxyFactory(); - //获取代理对象 - TrainStation proxyObject = factory.getProxyObject(); - //调用代理对象中的sell方法卖票 - proxyObject.sell(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java deleted file mode 100644 index feb207ad..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.MethodInterceptor; -import net.sf.cglib.proxy.MethodProxy; - -import java.lang.reflect.Method; - -/** - * 代理对象工厂,用来获取代理对象 - * @author 方鹏 - * @date 2022年02月07日 6:48 下午 - */ -public class ProxyFactory implements MethodInterceptor { - - //声明火车站对象 - private TrainStation station = new TrainStation(); - - public TrainStation getProxyObject() { - //创建Enhancer对象,类似于JDK代理中的Proxy类 - Enhancer enhancer = new Enhancer(); - //设置父类的字节码对象。指定父类 - enhancer.setSuperclass(TrainStation.class); - //设置回调函数 - enhancer.setCallback(this); - //创建代理对象 - TrainStation proxyObject = (TrainStation) enhancer.create(); - return proxyObject; - } - - @Override - public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { - //System.out.println("方法执行了"); - System.out.println("代售点收取一定的服务费用(CGLib代理)"); - //要调用目标对象的方法 - Object obj = method.invoke(station, objects); - return obj; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java deleted file mode 100644 index 08d7b067..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - - -/** - * 火车站类 - * @author 方鹏 - * @date 2022年02月07日 6:11 下午 - */ -public class TrainStation{ - - public void sell() { - System.out.println("火车站卖票"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java deleted file mode 100644 index 5f62d7eb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:26 下午 - */ -public class Client { - public static void main(String[] args) { - //获取代理对象 - //1,创建代理工厂对象 - ProxyFactory factory = new ProxyFactory(); - //2,使用factory对象的方法获取代理对象 - SellTickets proxyObject = factory.getProxyObject(); - //3,调用卖调用的方法 - proxyObject.sell(); - - System.out.println(proxyObject.getClass()); - - //让程序一直执行 - while(true) {} - - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java deleted file mode 100644 index 53ba8dab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - - -import com.fangpeng.design.pattern.proxy.cglib_proxy.TrainStation; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * 获取代理对象的工厂类:代理类也实现了对应的接口 - * @author 方鹏 - * @date 2022年02月07日 6:19 下午 - */ -public class ProxyFactory { - - //声明目标对象 - private TrainStation station = new TrainStation(); - - //获取代理对象的方法 - public SellTickets getProxyObject() { - //返回代理对象 - /* - ClassLoader loader : 类加载器,用于加载代理类。可以通过目标对象获取类加载器 - Class[] interfaces : 代理类实现的接口的字节码对象 - InvocationHandler h : 代理对象的调用处理程序 - */ - SellTickets proxyObject = (SellTickets) Proxy.newProxyInstance( - station.getClass().getClassLoader(), - station.getClass().getInterfaces(), - new InvocationHandler() { - - /* - Object proxy : 代理对象。和proxyObject对象是同一个对象,在invoke方法中基本不用 - Method method : 对接口中的方法进行封装的method对象 - Object[] args : 调用方法的实际参数 - - 返回值: 方法的返回值。 - */ - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //System.out.println("invoke方法执行了"); - System.out.println("代售点收取一定的服务费用(jdk动态代理)"); - //执行目标对象的方法 - Object obj = method.invoke(station, args); - return obj; - } - } - ); - return proxyObject; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java deleted file mode 100644 index f0f4d68f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - -/* - * 卖火车票的接口 - * @author 方鹏 - * @date 2022/2/7 6:11 下午 - */ -public interface SellTickets { - - void sell(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java deleted file mode 100644 index 124cc5e1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:14 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建代售点类对象 - ProxyPoint proxyPoint = new ProxyPoint(); - //调用方法进行买票 - proxyPoint.sell(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java deleted file mode 100644 index 1e96cbb7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * 代售点类 - * @author 方鹏 - * @date 2022年02月07日 6:12 下午 - */ -public class ProxyPoint implements SellTickets { - - //声明火车站类对象 - private TrainStation trainStation = new TrainStation(); - - @Override - public void sell() { - System.out.println("代售点收取一些服务费用"); - trainStation.sell(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java deleted file mode 100644 index 73ef3dfa..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/* - * 卖火车票的接口 - * @author 方鹏 - * @date 2022/2/7 6:11 下午 - */ -public interface SellTickets { - - void sell(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java deleted file mode 100644 index b3ab4aab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * 火车站类 - * @author 方鹏 - * @date 2022年02月07日 6:11 下午 - */ -public class TrainStation implements SellTickets { - - public void sell() { - System.out.println("火车站卖票"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java deleted file mode 100644 index 2243e07c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * @author 方鹏 - * @date 2022年02月08日 5:05 下午 - */ -public class Client { - public static void main(String[] args) { - //创建一个请假条对象 - LeaveRequest leave = new LeaveRequest("小明",2,"身体不适"); - - //创建各级领导对象 - GroupLeader groupLeader = new GroupLeader(); - Manager manager = new Manager(); - GeneralManager generalManager = new GeneralManager(); - - //设置处理者链 - groupLeader.setNextHandler(manager); - manager.setNextHandler(generalManager); - - - //小明提交请假申请 - groupLeader.submit(leave); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java b/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java deleted file mode 100644 index dc8a8250..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 总经理类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:04 下午 - */ -public class GeneralManager extends Handler { - - public GeneralManager() { - super(Handler.NUM_THREE,Handler.NUM_SEVEN); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("总经理审批:同意"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java b/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java deleted file mode 100644 index 92ea295f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 小组长类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:02 下午 - */ -public class GroupLeader extends Handler { - - public GroupLeader() { - super(0, Handler.NUM_ONE); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("小组长审批:同意"); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java deleted file mode 100644 index 3b575ded..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 抽象处理者类 - * @author 方鹏 - * @date 2022年02月08日 4:56 下午 - */ -public abstract class Handler { - - protected final static int NUM_ONE = 1; - protected final static int NUM_THREE = 3; - protected final static int NUM_SEVEN = 7; - - //该领导处理的请求天数区间 - private int numStart; - private int numEnd; - - //声明后续者(声明上级领导) - private Handler nextHandler; - - public Handler(int numStart) { - this.numStart = numStart; - } - - public Handler(int numStart, int numEnd) { - this.numStart = numStart; - this.numEnd = numEnd; - } - - //设置上级领导对象 - public void setNextHandler(Handler nextHandler) { - this.nextHandler = nextHandler; - } - - //各级领导处理请求条的方法 - protected abstract void handleLeave(LeaveRequest leave); - - //提交请求条 - public final void submit(LeaveRequest leave) { - //该领导进行审批 - this.handleLeave(leave); - if(this.nextHandler != null && leave.getNum() > this.numEnd) { - //提交给上级领导进行审批 - this.nextHandler.submit(leave); - } else { - System.out.println("流程结束!"); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java b/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java deleted file mode 100644 index 4da92df3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 请假条类 - * @author 方鹏 - * @date 2022年02月08日 4:55 下午 - */ -public class LeaveRequest { - - //姓名 - private String name; - - //请假天数 - private int num; - - //请假内容 - private String content; - - public LeaveRequest(String name, int num, String content) { - this.name = name; - this.num = num; - this.content = content; - } - - public String getName() { - return name; - } - - public int getNum() { - return num; - } - - public String getContent() { - return content; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java deleted file mode 100644 index a520aad4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 部门经理类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:03 下午 - */ -public class Manager extends Handler { - - public Manager() { - super(Handler.NUM_ONE,Handler.NUM_THREE); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("部门经理审批:同意"); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java deleted file mode 100644 index e578fdb4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Client - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class Client { - public static void main(String[] args) { - Request req = null; - Response res = null ; - - FilterChain filterChain = new FilterChain(); - filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter()); - filterChain.doFilter(req,res); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java deleted file mode 100644 index 9a5e4162..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Filter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Filter { - public void doFilter(Request req,Response res,FilterChain c); -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java deleted file mode 100644 index 86f80109..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -import java.util.ArrayList; -import java.util.List; - -/** - * @version v1.0 - * @ClassName: FilterChain - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class FilterChain { //过滤器链 - - private List filters = new ArrayList(); - - private int index = 0; - - // 链式调用 - public FilterChain addFilter(Filter filter) { - this.filters.add(filter); - return this; - } - - public void doFilter(Request request, Response response) { - if (index == filters.size()) { - return; - } - Filter filter = filters.get(index); - index++; - filter.doFilter(request, response, this); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java deleted file mode 100644 index 23269818..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: FirstFilter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class FirstFilter implements Filter { - @Override - public void doFilter(Request req, Response res, FilterChain chain) { - System.out.println("过滤器1 前置处理"); - - // 先执行所有request再倒序执行所有response - chain.doFilter(req, res); - - System.out.println("过滤器1 后置处理"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java deleted file mode 100644 index 7effe065..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Request - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Request { -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java deleted file mode 100644 index 59e4ddc7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Response - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Response { -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java deleted file mode 100644 index a6b3b850..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: FirstFilter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class SecondFilter implements Filter { - @Override - public void doFilter(Request req, Response res, FilterChain chain) { - System.out.println("过滤器2 前置处理"); - - // 先执行所有request再倒序执行所有response - chain.doFilter(req, res); - - System.out.println("过滤器2 后置处理"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java b/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java deleted file mode 100644 index 3b2125f7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.singleton; - -import java.io.IOException; -import java.io.InputStream; - -public class RuntimeDemo { - - public static void main(String[] args) throws IOException { - //获取Runtime类的对象 - Runtime runtime = Runtime.getRuntime(); - - //调用runtime的方法exec, 参数要的是一个命令 - Process process = runtime.exec("ls"); - //调用process对象的获取输入流的方法 - InputStream is = process.getInputStream(); - byte[] arr = new byte[1024 * 1024 * 100]; - //读取数据 - int len = is.read(arr);//返回读到的字节的个数 - //将字节数组转换为字符串输出到控制台 - System.out.println(new String(arr,0, len ,"UTF-8")); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java deleted file mode 100644 index 48a93851..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo1; - -public class Client { - - public static void main(String[] args) { - //创建Singletion类的对象 - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断获取到的两个是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java deleted file mode 100644 index 6a539cbb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo1; - -/* - 饿汉式: 静态成员变量 - */ -public class Singleton { - - //1,私有构造方法 - private Singleton() { - - } - - //2,在本类中创建本类对象 - private static Singleton instance = new Singleton(); - - //3,提供一个公共的访问方式,让外界获取该对象 - public static Singleton getInstance() { - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java deleted file mode 100644 index a98a28b0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo2; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java deleted file mode 100644 index 056263ae..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo2; - -/* - 饿汉式 : 静态代码块 - */ -public class Singleton { - - //私有构造方法 - private Singleton() { - - } - - //声明Singleton类型的变量 - private static Singleton instance; - - //在静态代码块中进行赋值 - static { - instance = new Singleton(); - } - - //对外提供获取该类对象的方法 - public static Singleton getInstance() { - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java deleted file mode 100644 index e8deb15f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo3; - -import com.fangpeng.design.pattern.singleton.demo2.Singleton; - -public class Client { - - public static void main(String[] args) { - com.fangpeng.design.pattern.singleton.demo2.Singleton instance = com.fangpeng.design.pattern.singleton.demo2.Singleton.getInstance(); - - com.fangpeng.design.pattern.singleton.demo2.Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java deleted file mode 100644 index abe36270..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo3; - -/* - 懒汉式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //声明Singleton类型的变量instance - //只是声明一个该类型的变量,并没有进行赋值 - private static Singleton instance; - - //对外提供访问方式 - public static synchronized Singleton getInstance() { - //判断instance是否为null,如果为null,说明还没有创建Singleton类的对象 - //如果没有,创建一个并返回,如果有,直接返回 - if (instance == null) { - //线程1等待,线程2获取到cpu的执行权,也会进入到该判断里面 - instance = new Singleton(); - } - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java deleted file mode 100644 index e11a8f4f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo4; - -import com.fangpeng.design.pattern.singleton.demo4.Singleton; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java deleted file mode 100644 index 1c51206a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo4; - -import javax.swing.plaf.synth.SynthViewportUI; - -/* - 双重检查锁方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //声明Singleton类型的变量 - private static volatile Singleton instance; - - //对外提供公共的访问方式 - public static Singleton getInstance() { - //第一次判断,如果instance的值不为null,不需要抢占锁,直接返回对象 - if (instance == null) { - synchronized (Singleton.class) { - //第二次判断 - if (instance == null) { - instance = new Singleton(); - } - } - } - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java deleted file mode 100644 index 8cdec49a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo5; - -import com.fangpeng.design.pattern.singleton.demo5.Singleton; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java deleted file mode 100644 index fa414dee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo5; - -/* - 静态内部类方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //定义一个静态内部类 - private static class SingletonHolder { - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java deleted file mode 100644 index f2699ac4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo6; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.INSTANCE; - Singleton instance1 = Singleton.INSTANCE; - - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java deleted file mode 100644 index 398ed8fe..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo6; - -/* - 枚举实现方式 - */ -public enum Singleton { - INSTANCE; -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java deleted file mode 100644 index aecd01b2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo7; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/* - 测试使用序列化破坏单例模式 - */ -public class Client { - - public static void main(String[] args) throws Exception { - //writeObject2File(); - readObjectFromFile(); - readObjectFromFile(); - } - - //从文件读取数据(对象) - public static void readObjectFromFile() throws Exception { - //1,创建对象输入流对象 - ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\a.txt")); - //2,读取对象 - Singleton instance = (Singleton) ois.readObject(); - - System.out.println(instance); - - //释放资源 - ois.close(); - } - - //向文件中写数据(对象) - public static void writeObject2File() throws Exception { - //1,获取Singleton对象 - Singleton instance = Singleton.getInstance(); - //2,创建对象输出流对象 - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Think\\Desktop\\a.txt")); - //3,写对象 - oos.writeObject(instance); - //4,释放资源 - oos.close(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java deleted file mode 100644 index 96e512c3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo7; - -/* - 静态内部类方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //定义一个静态内部类 - private static class SingletonHolder { - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - - //当进行反序列化时,会自动调用该方法,将该方法的返回值直接返回 - public Object readResolve() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java deleted file mode 100644 index 5477ff5b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo8; - -import java.lang.reflect.Constructor; - -public class Client { - - public static void main(String[] args) throws Exception { - //1,获取Singleton的字节码对象 - Class clazz = Singleton.class; - - //2,获取无参构造方法对象 - Constructor constructor = clazz.getDeclaredConstructor(); - - //3,取消访问检查 - constructor.setAccessible(true); - - //4,创建Singleton对象 - Singleton s1 = (Singleton) constructor.newInstance(); - Singleton s2 = (Singleton) constructor.newInstance(); - - System.out.println(s1 == s2); //如果返回的是true,说明并没有破坏单例模式,如果是false,说明破坏了单例模式 - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java deleted file mode 100644 index dea8168e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo8; - -public class Singleton { - - private static boolean flag = false; - - //私有构造方法 - private Singleton() { - synchronized (Singleton.class) { - - //判断flag的值是否是true,如果是true,说明非第一次访问,直接抛一个异常,如果是false的话,说明第一次访问 - if (flag) { - throw new RuntimeException("不能创建多个对象"); - } - //将flag的值设置为true - flag = true; - } - } - - //定义一个静态内部类 - private static class SingletonHolder { - //在内部类中声明并初始化外部类的对象 - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/Client.java b/src/main/java/com/fangpeng/design/pattern/state/after/Client.java deleted file mode 100644 index 6e7bbd9a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * @author 方鹏 - * @date 2022年02月08日 6:12 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建环境角色对象 - Context context = new Context(); - //设置当前电梯装填 - context.setLiftState(new ClosingState()); - - context.open(); - context.run(); - context.close(); - context.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java b/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java deleted file mode 100644 index 3f3cd37a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯关闭状态类 - * @author 方鹏 - * @date 2022年02月08日 6:07 下午 - */ -public class ClosingState extends LiftState { - @Override - //电梯门关闭,这是关闭状态要实现的动作 - public void close() { - System.out.println("电梯门关闭..."); - } - - //电梯门关了再打开,逗你玩呢,那这个允许呀 - @Override - public void open() { - super.context.setLiftState(Context.OPENING_STATE); - super.context.open(); - } - - - //电梯门关了就跑,这是再正常不过了 - @Override - public void run() { - super.context.setLiftState(Context.RUNNING_STATE); - super.context.run(); - } - - //电梯门关着,我就不按楼层 - @Override - public void stop() { - super.context.setLiftState(Context.STOPPING_STATE); - super.context.stop(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/Context.java b/src/main/java/com/fangpeng/design/pattern/state/after/Context.java deleted file mode 100644 index 79ff694c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/Context.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 环境角色类 - * @author 方鹏 - * @date 2022年02月08日 6:05 下午 - */ -public class Context { - - //定义对应状态对象的常量 - public final static OpeningState OPENING_STATE = new OpeningState(); - public final static ClosingState CLOSING_STATE = new ClosingState(); - public final static RunningState RUNNING_STATE = new RunningState(); - public final static StoppingState STOPPING_STATE = new StoppingState(); - - //定义一个当前电梯状态变量 - private LiftState liftState; - - public LiftState getLiftState() { - return liftState; - } - - //设置当前状态对象 - public void setLiftState(LiftState liftState) { - this.liftState = liftState; - //设置当前状态对象中的Context对象 - this.liftState.setContext(this); - } - - public void open() { - this.liftState.open(); - } - - public void close() { - this.liftState.close(); - } - - public void run() { - this.liftState.run(); - } - - public void stop() { - this.liftState.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java b/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java deleted file mode 100644 index 0006dfab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 抽象状态类 - * @author 方鹏 - * @date 2022年02月08日 6:05 下午 - */ -public abstract class LiftState { - - //声明环境角色类变量 - protected Context context; - - public void setContext(Context context) { - this.context = context; - } - - //电梯开启操作 - public abstract void open(); - - //电梯关闭操作 - public abstract void close(); - - //电梯运行操作 - public abstract void run(); - - //电梯停止操作 - public abstract void stop(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java b/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java deleted file mode 100644 index b9f3e898..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯开启状态类 - * @author 方鹏 - * @date 2022年02月08日 6:07 下午 - */ -public class OpeningState extends LiftState { - //当前状态要执行的方法 - @Override - public void open() { - System.out.println("电梯开启。。。"); - } - - @Override - public void close() { - //修改状态 - super.context.setLiftState(Context.CLOSING_STATE); - //调用当前状态中的context中的close方法 - super.context.close(); - } - - @Override - public void run() { - //什么都不做 - } - - @Override - public void stop() { - //什么都不做 - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java b/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java deleted file mode 100644 index d54700dd..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯运行状态类 - * @author 方鹏 - * @date 2022年02月08日 6:08 下午 - */ -public class RunningState extends LiftState { - //运行的时候开电梯门?你疯了!电梯不会给你开的 - @Override - public void open() { - //do nothing - } - - //电梯门关闭?这是肯定了 - @Override - public void close() {//虽然可以关门,但这个动作不归我执行 - //do nothing - } - - //这是在运行状态下要实现的方法 - @Override - public void run() { - System.out.println("电梯正在运行..."); - } - - //这个事绝对是合理的,光运行不停止还有谁敢做这个电梯?!估计只有上帝了 - @Override - public void stop() { - super.context.setLiftState(Context.STOPPING_STATE); - super.context.stop(); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java b/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java deleted file mode 100644 index 39b5239d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯停止状态类 - * @author 方鹏 - * @date 2022年02月08日 6:09 下午 - */ -public class StoppingState extends LiftState { - //停止状态,开门,那是要的! - @Override - public void open() { - //状态修改 - super.context.setLiftState(Context.OPENING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().open(); - } - - @Override - public void close() {//虽然可以关门,但这个动作不归我执行 - //状态修改 - super.context.setLiftState(Context.CLOSING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().close(); - } - - //停止状态再跑起来,正常的很 - @Override - public void run() { - //状态修改 - super.context.setLiftState(Context.RUNNING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().run(); - } - - //停止状态是怎么发生的呢?当然是停止方法执行了 - @Override - public void stop() { - System.out.println("电梯停止了..."); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/Client.java b/src/main/java/com/fangpeng/design/pattern/state/before/Client.java deleted file mode 100644 index ccb3a8d9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/Client.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * @author 方鹏 - * @date 2022年02月08日 5:25 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建电梯对象 - Lift lift = new Lift(); - - //设置当前电梯的状态 - lift.setState(ILift.CLOSING_STATE); - - //打开 - lift.open(); - lift.close(); - lift.run(); - lift.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java b/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java deleted file mode 100644 index 3c4d9a46..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * @version v1.0 - * @ClassName: ILift - * @Description: 电梯接口 - * @Author: Lemon-CS - */ -public interface ILift { - - //定义四个电梯状态的常量 - int OPENING_STATE = 1; - int CLOSING_STATE = 2; - int RUNNING_STATE = 3; - int STOPPING_STATE = 4; - - //设置电梯状态的功能 - void setState(int state); - - //电梯操作功能 - void open(); - - void close(); - - void run(); - - void stop(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java b/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java deleted file mode 100644 index 2898c46d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * 电梯类(ILift的子实现类) - * @author 方鹏 - * @date 2022年02月08日 5:22 下午 - */ -public class Lift implements ILift { - - //声明一个记录当前电梯的状态 - private int state; - - @Override - public void setState(int state) { - this.state = state; - } - - @Override - public void open() { - switch (state) { //当前电梯状态 - case OPENING_STATE : - //什么事都不做 - break; - case CLOSING_STATE : - System.out.println("电梯打开了..."); - //设置当前电梯状态为开启状态 - setState(OPENING_STATE); - break; - case STOPPING_STATE : - System.out.println("电梯打开了..."); - //设置当前电梯状态为开启状态 - setState(OPENING_STATE); - break; - case RUNNING_STATE : - //什么事都不做 - break; - } - } - - @Override - public void close() { - switch (this.state) { - case OPENING_STATE: - System.out.println("电梯关门了。。。");//只有开门状态可以关闭电梯门,可以对应电梯状态表来看 - this.setState(CLOSING_STATE);//关门之后电梯就是关闭状态了 - break; - case CLOSING_STATE: - //do nothing //已经是关门状态,不能关门 - break; - case RUNNING_STATE: - //do nothing //运行时电梯门是关着的,不能关门 - break; - case STOPPING_STATE: - //do nothing //停止时电梯也是关着的,不能关门 - break; - } - } - - @Override - public void run() { - switch (this.state) { - case OPENING_STATE://电梯不能开着门就走 - //do nothing - break; - case CLOSING_STATE://门关了,可以运行了 - System.out.println("电梯开始运行了。。。"); - this.setState(RUNNING_STATE);//现在是运行状态 - break; - case RUNNING_STATE: - //do nothing 已经是运行状态了 - break; - case STOPPING_STATE: - System.out.println("电梯开始运行了。。。"); - this.setState(RUNNING_STATE); - break; - } - } - - @Override - public void stop() { - switch (this.state) { - case OPENING_STATE: //开门的电梯已经是是停止的了(正常情况下) - //do nothing - break; - case CLOSING_STATE://关门时才可以停止 - System.out.println("电梯停止了。。。"); - this.setState(STOPPING_STATE); - break; - case RUNNING_STATE://运行时当然可以停止了 - System.out.println("电梯停止了。。。"); - this.setState(STOPPING_STATE); - break; - case STOPPING_STATE: - //do nothing - break; - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/Client.java b/src/main/java/com/fangpeng/design/pattern/strategy/Client.java deleted file mode 100644 index 29633ed1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/Client.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * @author 方鹏 - * @date 2022年02月08日 3:41 下午 - */ -public class Client { - public static void main(String[] args) { - //春节来了,使用春节促销活动 - SalesMan salesMan = new SalesMan(new StrategyA()); - //展示促销活动 - salesMan.salesManShow(); - - System.out.println("=============="); - //中秋节到了,使用中秋节的促销活动 - salesMan.setStrategy(new StrategyB()); - //展示促销活动 - salesMan.salesManShow(); - - System.out.println("=============="); - //圣诞节到了,使用圣诞节的促销活动 - salesMan.setStrategy(new StrategyC()); - //展示促销活动 - salesMan.salesManShow(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java b/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java deleted file mode 100644 index 5aaadb47..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 促销员(环境类) - * @author 方鹏 - * @date 2022年02月08日 3:40 下午 - */ -public class SalesMan { - - //聚合策略类对象 - private Strategy strategy; - - public SalesMan(Strategy strategy) { - this.strategy = strategy; - } - - public Strategy getStrategy() { - return strategy; - } - - public void setStrategy(Strategy strategy) { - this.strategy = strategy; - } - - //由促销员展示促销活动给用户 - public void salesManShow() { - strategy.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java b/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java deleted file mode 100644 index 981defa3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/* - * 抽象策略类 - * @author 方鹏 - * @date 2022/2/8 3:37 下午 - */ -public interface Strategy { - - void show(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java deleted file mode 100644 index e6602070..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyA implements Strategy { - - @Override - public void show() { - System.out.println("买一送一"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java deleted file mode 100644 index cd22410c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyB implements Strategy { - - @Override - public void show() { - System.out.println("满200元减50元"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java deleted file mode 100644 index 690e9639..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyC implements Strategy { - - @Override - public void show() { - System.out.println("满1000元加一元换购任意200元以下商品"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java b/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java deleted file mode 100644 index 5b3579b3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 抽象类(定义模板方法和基本方法) - * @author 方鹏 - * @date 2022年02月08日 3:08 下午 - */ -public abstract class AbstractClass { - - //模板方法定义 - public final void cookProcess() { - pourOil(); - heatOil(); - pourVegetable(); - pourSauce(); - fry(); - } - - public void pourOil() { - System.out.println("倒油"); - } - - //第二步:热油是一样的,所以直接实现 - public void heatOil() { - System.out.println("热油"); - } - - //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心) - public abstract void pourVegetable(); - - //第四步:倒调味料是不一样 - public abstract void pourSauce(); - - - //第五步:翻炒是一样的,所以直接实现 - public void fry(){ - System.out.println("炒啊炒啊炒到熟啊"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/Client.java b/src/main/java/com/fangpeng/design/pattern/template/Client.java deleted file mode 100644 index ab5f9bf0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/Client.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * @author 方鹏 - * @date 2022年02月08日 3:11 下午 - */ -public class Client { - - public static void main(String[] args) { - //炒包菜 - //创建对象 - ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai(); - //调用炒菜的功能 - baoCai.cookProcess(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java b/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java deleted file mode 100644 index 5e7e5b20..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 炒包菜类 - * @author 方鹏 - * @date 2022年02月08日 3:10 下午 - */ -public class ConcreteClass_BaoCai extends AbstractClass { - - @Override - public void pourVegetable() { - System.out.println("下锅的蔬菜是包菜"); - } - - @Override - public void pourSauce() { - System.out.println("下锅的酱料是辣椒"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java b/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java deleted file mode 100644 index 2d04ea21..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 炒菜心类 - * @author 方鹏 - * @date 2022年02月08日 3:10 下午 - */ -public class ConcreteClass_CaiXin extends AbstractClass { - - @Override - public void pourVegetable() { - System.out.println("下锅的蔬菜是菜心"); - } - - @Override - public void pourSauce() { - System.out.println("下锅的酱料是蒜蓉"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java b/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java deleted file mode 100644 index 8fef8490..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - - -/** - * 抽象元素角色类 - * @author 方鹏 - * @date 2022年02月08日 10:05 下午 - */ -public interface Animal { - - //接受访问者访问的功能 - void accept(Person person); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java b/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java deleted file mode 100644 index da5bbaba..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体元素角色类(宠物猫) - * @author 方鹏 - * @date 2022年02月08日 10:07 下午 - */ -public class Cat implements Animal { - - @Override - public void accept(Person person) { - person.feed(this); //访问者给宠物猫喂食 - System.out.println("好好吃,喵喵喵。。。"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Client.java b/src/main/java/com/fangpeng/design/pattern/visitor/Client.java deleted file mode 100644 index b0762181..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * @author 方鹏 - * @date 2022年02月08日 10:11 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建Home对象 - Home home = new Home(); - //添加元素到Home对象中 - home.add(new Dog()); - home.add(new Cat()); - - //创建主人对象 - Owner owner = new Owner(); - //让主人喂食所有的宠物 - home.action(owner); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java b/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java deleted file mode 100644 index c9e0c5e4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体元素角色类(宠物狗) - * @author 方鹏 - * @date 2022年02月08日 10:07 下午 - */ -public class Dog implements Animal { - - @Override - public void accept(Person person) { - person.feed(this); //访问者给宠物猫喂食 - System.out.println("好好吃,汪汪汪。。。"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Home.java b/src/main/java/com/fangpeng/design/pattern/visitor/Home.java deleted file mode 100644 index 28a86104..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Home.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -import java.util.ArrayList; -import java.util.List; - -/** - * 对象结构类 - * @author 方鹏 - * @date 2022年02月08日 10:10 下午 - */ -public class Home { - - //声明一个集合对象,用来存储元素对象 - private List nodeList = new ArrayList(); - - //添加元素功能 - public void add(Animal animal) { - nodeList.add(animal); - } - - public void action(Person person) { - //遍历集合,获取每一个元素,让访问者访问每一个元素 - for (Animal animal : nodeList) { - animal.accept(person); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java b/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java deleted file mode 100644 index 599b10b3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体访问者角色类(自己) - * @author 方鹏 - * @date 2022年02月08日 10:08 下午 - */ -public class Owner implements Person { - @Override - public void feed(Cat cat) { - System.out.println("主人喂食猫"); - } - - @Override - public void feed(Dog dog) { - System.out.println("主人喂食狗"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Person.java b/src/main/java/com/fangpeng/design/pattern/visitor/Person.java deleted file mode 100644 index 78efa099..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Person.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/* - * 抽象访问者角色类 - * @author 方鹏 - * @date 2022/2/8 10:06 下午 - */ -public interface Person { - - //喂食宠物狗 - void feed(Cat cat); - - //喂食宠物猫 - void feed(Dog dog); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java b/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java deleted file mode 100644 index 1a1dac03..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体访问者角色类(其他人) - * @author 方鹏 - * @date 2022年02月08日 10:09 下午 - */ -public class Someone implements Person { - - @Override - public void feed(Cat cat) { - System.out.println("其他人喂食猫"); - } - - @Override - public void feed(Dog dog) { - System.out.println("其他人喂食狗"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java b/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java deleted file mode 100644 index 43e3957e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 抽象皮肤类 - */ -public abstract class AbstractSkin { - - // 显示的方法 - public abstract void display(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/Client.java b/src/main/java/com/fangpeng/design/principles/demo1/Client.java deleted file mode 100644 index 37ad361e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -public class Client { - - public static void main(String[] args) { - // 1.创建搜狗输入法对象 - SougouInput input = new SougouInput(); - // 2.创建皮肤对象 - DefaultSkin skin = new DefaultSkin(); - // 3.将皮肤设置到输入法中 - input.setSkin(skin); - // 4.显示皮肤 - input.display(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java b/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java deleted file mode 100644 index e336896f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 默认皮肤类 - */ -public class DefaultSkin extends AbstractSkin { - - - @Override - public void display() { - System.out.println("默认皮肤"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java b/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java deleted file mode 100644 index fa880221..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 我的自定义皮肤 - */ -public class MySkin extends AbstractSkin { - @Override - public void display() { - System.out.println("我的自定义皮肤"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java b/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java deleted file mode 100644 index 7e789579..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 搜狗输入法 - */ -public class SougouInput { - - private AbstractSkin skin; - - public void setSkin(AbstractSkin skin) { - this.skin = skin; - } - - public void display() { - skin.display(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java deleted file mode 100644 index 422c6ded..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 四边形接口 - */ -public interface Quadrilateral { - - //获取长 - double getLength(); - - //获取宽 - double getWidth(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java deleted file mode 100644 index 4b7f1dd7..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 长方形类 - */ -public class Rectangle implements Quadrilateral { - - private double length; - private double width; - - public void setLength(double length) { - this.length = length; - } - - public void setWidth(double width) { - this.width = width; - } - - public double getLength() { - return length; - } - - public double getWidth() { - return width; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java b/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java deleted file mode 100644 index 99ce45e4..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -import com.fangpeng.design.principles.demo2.after.Square; - -public class RectangleDemo { - - public static void main(String[] args) { - //创建长方形对象 - Rectangle r = new Rectangle(); - r.setLength(20); - r.setWidth(10); - //调用方法进行扩宽操作 - resize(r); - - printLengthAndWidth(r); - - System.out.println("=================="); - //创建正方形对象 - Square s = new Square(); - //设置长和宽 - s.setSide(10); - //调用resize方法进行扩宽 - printLengthAndWidth(s); - } - - //扩宽的方法 - public static void resize(Rectangle rectangle) { - //判断宽如果比长小,进行扩宽的操作 - while (rectangle.getWidth() <= rectangle.getLength()) { - rectangle.setWidth(rectangle.getWidth() + 1); - } - } - - //打印长和宽 - public static void printLengthAndWidth(Quadrilateral quadrilateral) { - System.out.println(quadrilateral.getLength()); - System.out.println(quadrilateral.getWidth()); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java deleted file mode 100644 index 914e08ce..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 正方形类 - */ -public class Square implements Quadrilateral { - - private double side; - - @Override - public double getLength() { - return side; - } - - @Override - public double getWidth() { - return side; - } - - public double getSide() { - return side; - } - - public void setSide(double side) { - this.side = side; - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java b/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java deleted file mode 100644 index e994edd9..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -/* - 长方形类 - */ -public class Rectangle { - - private double length; - private double width; - - public double getLength() { - return length; - } - - public void setLength(double length) { - this.length = length; - } - - public double getWidth() { - return width; - } - - public void setWidth(double width) { - this.width = width; - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java b/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java deleted file mode 100644 index c1244280..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -public class RectangleDemo { - - public static void main(String[] args) { - //创建长方形对象 - Rectangle r = new Rectangle(); - //设置长和宽 - r.setLength(20); - r.setWidth(10); - //调用resize方法进行扩宽 - resize(r); - printLengthAndWidth(r); - - System.out.println("=================="); - //创建正方形对象 - Square s = new Square(); - //设置长和宽 - s.setLength(10); - //调用resize方法进行扩宽 - resize(s); - printLengthAndWidth(s); - } - - //扩宽方法 - public static void resize(Rectangle rectangle) { - //判断宽如果比长小,进行扩宽的操作 - while(rectangle.getWidth() <= rectangle.getLength()) { - rectangle.setWidth(rectangle.getWidth() + 1); - } - } - - //打印长和宽 - public static void printLengthAndWidth(Rectangle rectangle) { - System.out.println(rectangle.getLength()); - System.out.println(rectangle.getWidth()); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java b/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java deleted file mode 100644 index aa63cdc3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -/* - 正方形类 - */ -public class Square extends Rectangle { - @Override - public void setLength(double length) { - super.setLength(length); - super.setWidth(length); - } - - @Override - public void setWidth(double width) { - super.setWidth(width); - super.setLength(width); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java deleted file mode 100644 index 07dcd309..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class Computer { - - private HardDisk hardDisk; - private Cpu cpu; - private Memory memory; - - public HardDisk getHardDisk() { - return hardDisk; - } - - public void setHardDisk(HardDisk hardDisk) { - this.hardDisk = hardDisk; - } - - public Cpu getCpu() { - return cpu; - } - - public void setCpu(Cpu cpu) { - this.cpu = cpu; - } - - public Memory getMemory() { - return memory; - } - - public void setMemory(Memory memory) { - this.memory = memory; - } - - //运行计算机 - public void run() { - System.out.println("运行计算机"); - String data = hardDisk.get(); - System.out.println("从硬盘上获取的数据是:" + data); - cpu.run(); - memory.save(); - } -} - diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java b/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java deleted file mode 100644 index 45efda0b..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class ComputerDemo { - - public static void main(String[] args) { - - //创建计算机的组件对象 - HardDisk hardDisk = new XiJieHardDisk(); - Cpu cpu = new IntelCpu(); - Memory memory = new KingstonMemory(); - - //创建计算机对象 - Computer c = new Computer(); - //组装计算机 - c.setCpu(cpu); - c.setHardDisk(hardDisk); - c.setMemory(memory); - - //运行计算机 - c.run(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java deleted file mode 100644 index 2f61d956..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface Cpu { - //运行cpu - public void run(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java deleted file mode 100644 index 525d662c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface HardDisk { - - //存储数据 - public void save(String data); - - //获取数据 - public String get(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java b/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java deleted file mode 100644 index 0c7101d2..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class IntelCpu implements Cpu { - - public void run() { - System.out.println("使用Intel处理器"); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java b/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java deleted file mode 100644 index ee5446b7..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class KingstonMemory implements Memory { - - public void save() { - System.out.println("使用金士顿内存条"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java deleted file mode 100644 index ba81b535..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface Memory { - - public void save(); -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java deleted file mode 100644 index 6147d5d0..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class XiJieHardDisk implements HardDisk{ - - //存储数据的方法 - @Override - public void save(String data) { - System.out.println("使用希捷硬盘存储数据为:" + data); - } - - //获取数据的方法 - @Override - public String get() { - System.out.println("使用希捷希捷硬盘取数据"); - return "数据"; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java b/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java deleted file mode 100644 index 8fb0805a..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -public class Computer { - - private XiJieHardDisk hardDisk; - private IntelCpu cpu; - private KingstonMemory memory; - - public XiJieHardDisk getHardDisk() { - return hardDisk; - } - - public void setHardDisk(XiJieHardDisk hardDisk) { - this.hardDisk = hardDisk; - } - - public IntelCpu getCpu() { - return cpu; - } - - public void setCpu(IntelCpu cpu) { - this.cpu = cpu; - } - - public KingstonMemory getMemory() { - return memory; - } - - public void setMemory(KingstonMemory memory) { - this.memory = memory; - } - - public void run() { - System.out.println("运行计算机"); - String data = hardDisk.get(); - System.out.println("从硬盘上获取的数据是:" + data); - cpu.run(); - memory.save(); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java b/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java deleted file mode 100644 index 8ec0ca59..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -public class ComputerDemo { - - public static void main(String[] args) { - //创建组件对象 - XiJieHardDisk hardDisk = new XiJieHardDisk(); - IntelCpu cpu = new IntelCpu(); - KingstonMemory memory = new KingstonMemory(); - - //创建计算机对象 - Computer c = new Computer(); - //组装计算机 - c.setCpu(cpu); - c.setHardDisk(hardDisk); - c.setMemory(memory); - - //运行计算机 - c.run(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java b/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java deleted file mode 100644 index 6b5c621e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - Intel cpu - */ -public class IntelCpu { - - public void run() { - System.out.println("使用Intel处理器"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java b/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java deleted file mode 100644 index 4e83a085..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - 金士顿内存条类 - */ -public class KingstonMemory { - - public void save() { - System.out.println("使用金士顿内存条"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java deleted file mode 100644 index 41c2f977..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - 希捷硬盘 - */ -public class XiJieHardDisk { - - //存储数据的方法 - public void save(String data) { - System.out.println("使用希捷硬盘存储数据为:" + data); - } - - //获取数据的方法 - public String get() { - System.out.println("使用希捷希捷硬盘取数据"); - return "数据"; - } -} - diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java b/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java deleted file mode 100644 index 4aa713d3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防盗接口 - */ -public interface AntiTheft { - void antiTheft(); -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java deleted file mode 100644 index 1a13f4d5..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class Client { - - public static void main(String[] args) { - //创建黑马安全门对象 - MySafetyDoor door = new MySafetyDoor(); - //调用功能 - door.antiTheft(); - door.fireproof(); - door.waterproof(); - - System.out.println("============"); - //创建传智安全门对象 - CustomSafetyDoor door1 = new CustomSafetyDoor(); - //调用功能 - door1.antiTheft(); - door1.fireproof(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java deleted file mode 100644 index fe28297e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class CustomSafetyDoor implements AntiTheft,Fireproof{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireproof() { - System.out.println("防火"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java deleted file mode 100644 index 86199979..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防火接口 - */ -public interface Fireproof { - void fireproof(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java deleted file mode 100644 index 60affe1c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class MySafetyDoor implements AntiTheft,Fireproof,Waterproof{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireproof() { - System.out.println("防火"); - } - - @Override - public void waterproof() { - System.out.println("防水"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java deleted file mode 100644 index 41417d74..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防水接口 - */ -public interface Waterproof { - void waterproof(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java b/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java deleted file mode 100644 index 9a39dd3c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -public class Client { - public static void main(String[] args) { - MySafetyDoor door = new MySafetyDoor(); - door.antiTheft(); - door.fireProof(); - door.waterProof(); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java deleted file mode 100644 index 89824297..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -/* - 自定义品牌的安全门 - */ -public class MySafetyDoor implements SafetyDoor{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireProof() { - System.out.println("防火"); - } - - @Override - public void waterProof() { - System.out.println("防水"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java deleted file mode 100644 index d230d380..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -/* - 安全门接口 - */ -public interface SafetyDoor { - - //防盗 - void antiTheft(); - - //防火 - void fireProof(); - - //防水 - void waterProof(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Agent.java b/src/main/java/com/fangpeng/design/principles/demo5/Agent.java deleted file mode 100644 index 694b3d1f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Agent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 经纪人类 - */ -public class Agent { - - private Star star; - private Fans fans; - private Company company; - - public void setStar(Star star) { - this.star = star; - } - - public void setFans(Fans fans) { - this.fans = fans; - } - - public void setCompany(Company company) { - this.company = company; - } - - //和粉丝见面的方法 - public void meeting() { - System.out.println(star.getName() + "和粉丝" + fans.getName() + "见面"); - } - - //和媒体公司洽谈的方法 - public void business() { - System.out.println(star.getName() + "和" + company.getName() + "洽谈"); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Client.java b/src/main/java/com/fangpeng/design/principles/demo5/Client.java deleted file mode 100644 index 1d81385f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -public class Client { - - public static void main(String[] args) { - //创建经纪人类 - Agent agent = new Agent(); - //创建明星对象 - Star star = new Star("林青霞"); - agent.setStar(star); - //创建粉丝对象 - Fans fans = new Fans("李四"); - agent.setFans(fans); - //创建媒体公司对象 - Company company = new Company("黑马媒体公司"); - agent.setCompany(company); - - agent.meeting();//和粉丝见面 - agent.business();//和媒体公司洽谈业务 - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Company.java b/src/main/java/com/fangpeng/design/principles/demo5/Company.java deleted file mode 100644 index dc3305af..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Company.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 媒体公司类 - */ -public class Company { - private String name; - - public String getName() { - return name; - } - - public Company(String name) { - this.name = name; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Fans.java b/src/main/java/com/fangpeng/design/principles/demo5/Fans.java deleted file mode 100644 index 0407a0e0..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Fans.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 粉丝类 - */ -public class Fans { - - private String name; - - public String getName() { - return name; - } - - public Fans(String name) { - this.name = name; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Star.java b/src/main/java/com/fangpeng/design/principles/demo5/Star.java deleted file mode 100644 index 2e8931a3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Star.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 明星类 - */ -public class Star { - private String name; - - public Star(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} - diff --git a/src/main/java/com/fangpeng/globalid/IdWorker.java b/src/main/java/com/fangpeng/globalid/IdWorker.java deleted file mode 100644 index 2b10f83f..00000000 --- a/src/main/java/com/fangpeng/globalid/IdWorker.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.fangpeng.globalid; - -/** - * @Description: 官方推出,Scala编程语言来实现的 - * Java前辈用Java语言实现了雪花算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:33 下午 - */ -public class IdWorker { - - //下面两个每个5位,加起来就是10位的工作机器id - private long workerId; //工作id - private long datacenterId; //数据id - //12位的序列号 - private long sequence; - - public IdWorker(long workerId, long datacenterId, long sequence){ - // sanity check for workerId - if (workerId > maxWorkerId || workerId < 0) { - throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId)); - } - if (datacenterId > maxDatacenterId || datacenterId < 0) { - throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId)); - } - System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d", - timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId); - - this.workerId = workerId; - this.datacenterId = datacenterId; - this.sequence = sequence; - } - - //初始时间戳 - private long twepoch = 1288834974657L; - - //长度为5位 - private long workerIdBits = 5L; - private long datacenterIdBits = 5L; - //最大值 - private long maxWorkerId = -1L ^ (-1L << workerIdBits); - private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - //序列号id长度 - private long sequenceBits = 12L; - //序列号最大值 - private long sequenceMask = -1L ^ (-1L << sequenceBits); - - //工作id需要左移的位数,12位 - private long workerIdShift = sequenceBits; - //数据id需要左移位数 12+5=17位 - private long datacenterIdShift = sequenceBits + workerIdBits; - //时间戳需要左移位数 12+5+5=22位 - private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - - //上次时间戳,初始值为负数 - private long lastTimestamp = -1L; - - public long getWorkerId(){ - return workerId; - } - - public long getDatacenterId(){ - return datacenterId; - } - - public long getTimestamp(){ - return System.currentTimeMillis(); - } - - //下一个ID生成算法 - public synchronized long nextId() { - long timestamp = timeGen(); - - //获取当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常 - if (timestamp < lastTimestamp) { - System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp); - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", - lastTimestamp - timestamp)); - } - - //获取当前时间戳如果等于上次时间戳 - //说明:还处在同一毫秒内,则在序列号加1;否则序列号赋值为0,从0开始。 - if (lastTimestamp == timestamp) { // 0 - 4095 - sequence = (sequence + 1) & sequenceMask; - if (sequence == 0) { - timestamp = tilNextMillis(lastTimestamp); - } - } else { - sequence = 0; - } - - //将上次时间戳值刷新 - lastTimestamp = timestamp; - - /** - * 返回结果: - * (timestamp - twepoch) << timestampLeftShift) 表示将时间戳减去初始时间戳,再左移相应位数 - * (datacenterId << datacenterIdShift) 表示将数据id左移相应位数 - * (workerId << workerIdShift) 表示将工作id左移相应位数 - * | 是按位或运算符,例如:x | y,只有当x,y都为0的时候结果才为0,其它情况结果都为1。 - * 因为个部分只有相应位上的值有意义,其它位上都是0,所以将各部分的值进行 | 运算就能得到最终拼接好的id - */ - return ((timestamp - twepoch) << timestampLeftShift) | - (datacenterId << datacenterIdShift) | - (workerId << workerIdShift) | - sequence; - } - - //获取时间戳,并与上次时间戳比较 - private long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - //获取系统时间戳 - private long timeGen(){ - return System.currentTimeMillis(); - } - - - - public static void main(String[] args) { - IdWorker worker = new IdWorker(21,10,0); - for (int i = 0; i < 100; i++) { - System.out.println(worker.nextId()); - } - } - - -} diff --git a/src/main/java/com/fangpeng/globalid/RedisGenerator.java b/src/main/java/com/fangpeng/globalid/RedisGenerator.java deleted file mode 100644 index f371a3f2..00000000 --- a/src/main/java/com/fangpeng/globalid/RedisGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.globalid; - -import redis.clients.jedis.Jedis; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:45 下午 - */ -public class RedisGenerator { - - public static void main(String[] args) { - Jedis jedis = new Jedis("127.0.0.1",6379); - for (int i = 0; i < 100; i++) { - Long id = jedis.incr("id");// - System.out.println(id); - } - } - -} diff --git a/src/main/java/com/fangpeng/globalid/UuidTest.java b/src/main/java/com/fangpeng/globalid/UuidTest.java deleted file mode 100644 index 89f7cf77..00000000 --- a/src/main/java/com/fangpeng/globalid/UuidTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.globalid; - -import java.util.UUID; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:13 下午 - */ -public class UuidTest { - - public static void main(String[] args) { - String uuid = UUID.randomUUID().toString(); - System.out.println(uuid); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java deleted file mode 100644 index 734a74b1..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.fangpeng.io.aio.chatroom.client; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.charset.Charset; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -/** - * @author 方鹏 - * @date 2022年01月19日 9:15 下午 - */ -public class ChatClient { - - private static final String LOCALHOST = "localhost"; - private String host; - private static final int DEFAULT_PORT = 8888; - private int port; - - private static final int BUFFER_SIZE = 1024; - - private static final String QUIT = "\\quit"; - private Charset charset = Charset.forName("UTF-8"); - - private AsynchronousSocketChannel clientChannel; - - public ChatClient() { - this(LOCALHOST, DEFAULT_PORT); - } - - public ChatClient (String host, int port) { - this.host = host; - this.port = port; - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 创建客户端channel - clientChannel = AsynchronousSocketChannel.open(); - // 连接服务端,异步调用 - Future future = clientChannel.connect(new InetSocketAddress(host, port)); - future.get(); - - // 处理用户输入 - new Thread(new UserInputHandler(this)).start(); - - ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); - - while (true) { - Future readResult = clientChannel.read(buffer); - int result = readResult.get(); - if (result <= 0) { - // 说明出现异常,无法再从服务器得到有效信息 - System.out.println("服务器断开"); - close(clientChannel); - System.exit(1); - - } else { - buffer.flip(); - String msg = String.valueOf(charset.decode(buffer)); - buffer.clear(); - System.out.println(msg); - } - } - - } catch (IOException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public void send(String msg) { - if (msg.isEmpty()) { - return; - } - ByteBuffer buffer = charset.encode(msg); - Future writeResult = clientChannel.write(buffer); - - try { - writeResult.get(); - } catch (InterruptedException | ExecutionException e) { - System.out.println("发送消息失败"); - e.printStackTrace(); - } - } - - - public static void main(String[] args) { - ChatClient chatClient = new ChatClient(); - chatClient.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 4b6e683d..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.io.aio.chatroom.client; - - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java deleted file mode 100644 index 17639d58..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.fangpeng.io.aio.chatroom.server; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.channels.*; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author 方鹏 - * @date 2022年01月19日 4:04 下午 - */ -public class ChatServer { - - private static final String LOCALHOST = "localhost"; - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - private static final int BUFFER = 1024; - private static final int THREADPOOL_SIZE = 8; - - private AsynchronousServerSocketChannel serverChannel; - private AsynchronousChannelGroup channelGroup; - private List connectedClients; - private Charset charset = Charset.forName("UTF-8"); - private int port; - - public ChatServer() { - this(DEFAULT_PORT); - } - - public ChatServer(int port) { - this.port = port; - this.connectedClients = new ArrayList<>(); - } - - private boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private String getClientName(AsynchronousSocketChannel clientChannel) { - int clientPort = -1; - try { - InetSocketAddress address = (InetSocketAddress) clientChannel.getRemoteAddress(); - clientPort = address.getPort(); - } catch (IOException e) { - e.printStackTrace(); - } - - return "客户端[" + clientPort + "]"; - } - - private void addClient(ClientHandler handler) { - connectedClients.add(handler); - System.out.println(getClientName(handler.clientChannel) + "已连接"); - } - - private synchronized void removeClient(ClientHandler handler) { - connectedClients.remove(handler); - System.out.println(getClientName(handler.clientChannel) + "已断开"); - close(handler.clientChannel); - } - - private String receive(ByteBuffer buffer) { - CharBuffer charbuffer = charset.decode(buffer); - return String.valueOf(charbuffer); - } - - private void forwardMessage(AsynchronousSocketChannel clientChannel, String fwdMsg) { - - for (ClientHandler handler : connectedClients) { - if (!clientChannel.equals(handler.clientChannel)) { - try { - ByteBuffer buffer = charset.encode(getClientName(clientChannel) + ": " + fwdMsg); - handler.clientChannel.write(buffer, null, handler); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - } - - private void start() { - try { - ExecutorService executorService = Executors.newFixedThreadPool(THREADPOOL_SIZE); - channelGroup = AsynchronousChannelGroup.withThreadPool(executorService); - serverChannel = AsynchronousServerSocketChannel.open(channelGroup); - serverChannel.bind(new InetSocketAddress(LOCALHOST, port)); - System.out.println("启动服务器,监听端口:" + port + "..."); - - while (true) { - serverChannel.accept(null, new AcceptHandler()); - System.in.read(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(serverChannel); - } - } - - private class AcceptHandler implements CompletionHandler { - - @Override - public void completed(AsynchronousSocketChannel clientChannel, Object attachment) { - // 等待新的客户端连接 - if (serverChannel.isOpen()) { - serverChannel.accept(null, this); - } - - if (clientChannel != null && clientChannel.isOpen()) { - ClientHandler handler = new ClientHandler(clientChannel); - ByteBuffer buffer = ByteBuffer.allocate(BUFFER); - // 将新用户添加到在线用户列表 - addClient(handler); - clientChannel.read(buffer, buffer, handler); - } - - } - - @Override - public void failed(Throwable exc, Object attachment) { - System.out.println("连接失败:" + exc); - } - } - - - private class ClientHandler implements CompletionHandler { - - private AsynchronousSocketChannel clientChannel; - - public ClientHandler(AsynchronousSocketChannel clientChannel) { - this.clientChannel = clientChannel; - } - - @Override - public void completed(Integer result, Object attachment) { - ByteBuffer buffer = (ByteBuffer) attachment; - if (buffer != null) { - if (result <= 0) { - // 客户端异常 - // 将该客户端从在线用户列表当中移除 - System.out.println("客户端异常"); - removeClient(this); - - } else { - buffer.flip(); - String fwdMsg = receive(buffer); - System.out.println(getClientName(clientChannel) + ":" + fwdMsg); - forwardMessage(clientChannel, fwdMsg); - buffer.clear(); - - if (readyToQuit(fwdMsg)) { - // 将该客户端从在线用户列表当中移除 - removeClient(this); - return; - } - - // 持续监听该客户端channel的输入 - clientChannel.read(buffer, buffer, this); - } - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - System.out.println("服务器读取或转发信息失败:" + exc); - } - } - - public static void main(String[] args) { - ChatServer chatServer = new ChatServer(); - chatServer.start(); - } - - -} diff --git a/src/main/java/com/fangpeng/io/aio/demo/Client.java b/src/main/java/com/fangpeng/io/aio/demo/Client.java deleted file mode 100644 index 45c88a40..00000000 --- a/src/main/java/com/fangpeng/io/aio/demo/Client.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.fangpeng.io.aio.demo; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.charset.StandardCharsets; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -/** - * @author 方鹏 - * @date 2022年01月19日 1:43 下午 - */ -public class Client { - - final String LOCALHOST = "localhost"; - final int DEFAULT_PORT = 8888; - AsynchronousSocketChannel clientChannel; - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - System.out.println("关闭" + closable); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - - public void start() { - - try { - // 创建channel - clientChannel = AsynchronousSocketChannel.open(); - Future future = clientChannel.connect(new InetSocketAddress(LOCALHOST, DEFAULT_PORT)); - future.get(); // 阻塞式的调用 - - // 等待用户的输入 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - - while (true) { - String input = consoleReader.readLine(); - - byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8); - ByteBuffer buffer = ByteBuffer.wrap(inputBytes); - Future writeResult = clientChannel.write(buffer); - - writeResult.get(); - buffer.flip(); - Future readResult = clientChannel.read(buffer); - - readResult.get(); - String echo = new String(buffer.array()); - buffer.clear(); - - System.out.println(echo); - - } - - } catch (IOException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - close(clientChannel); - } - } - - public static void main(String[] args) { - Client client = new Client(); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/demo/Server.java b/src/main/java/com/fangpeng/io/aio/demo/Server.java deleted file mode 100644 index 74e13bea..00000000 --- a/src/main/java/com/fangpeng/io/aio/demo/Server.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.fangpeng.io.aio.demo; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousServerSocketChannel; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.channels.CompletionHandler; -import java.util.HashMap; -import java.util.Map; - -/** - * @author 方鹏 - * @date 2022年01月19日 1:43 下午 - */ -public class Server { - - private static final String LOCALHOST = "localhost"; - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - AsynchronousServerSocketChannel serverChannel; - - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 绑定监听端口 - // 使用默认的AsynchronousChannelGroup - serverChannel = AsynchronousServerSocketChannel.open(); - serverChannel.bind(new InetSocketAddress(LOCALHOST, DEFAULT_PORT)); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT); - - while (true) { - serverChannel.accept(null, new AcceptHandler()); - System.in.read(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(serverChannel); - } - } - - private class AcceptHandler implements CompletionHandler { - - @Override - public void completed(AsynchronousSocketChannel result, Object attachment) { - if (serverChannel.isOpen()) { - serverChannel.accept(null, this); - } - - AsynchronousSocketChannel clientChannel = result; - - if (clientChannel != null && clientChannel.isOpen()) { - ClientHandler handler = new ClientHandler(clientChannel); - - ByteBuffer buffer = ByteBuffer.allocate(1024); - Map info = new HashMap<>(); - info.put("type", "read"); - info.put("buffer", buffer); - - clientChannel.read(buffer, info, handler); - System.out.println("接收到客户端发送的信息"); - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - // 处理错误 - } - } - - private class ClientHandler implements CompletionHandler { - - private AsynchronousSocketChannel clientChannel; - - public ClientHandler(AsynchronousSocketChannel clientChannel) { - this.clientChannel = clientChannel; - } - - @Override - public void completed(Integer result, Object attachment) { - Map info = (Map) attachment; - String type = (String) info.get("type"); - - if ("read".equals(type)) { - ByteBuffer buffer = (ByteBuffer) info.get("buffer"); - buffer.flip(); - info.put("type", "write"); - clientChannel.write(buffer, info, this); - buffer.clear(); - } else if ("write".equals(type)) { - ByteBuffer buffer = ByteBuffer.allocate(1024); - - info.put("type", "read"); - info.put("buffer", buffer); - - clientChannel.read(buffer, info, this); - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - // 处理错误 - } - } - - public static void main(String[] args) { - Server server = new Server(); - server.start(); - } -} diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java deleted file mode 100644 index 31123ce1..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.fangpeng.io.bio.chatroom.client; - -import java.io.*; -import java.net.Socket; - -public class ChatClient { - - private final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private final int DEFAULT_SERVER_PORT = 8888; - private final String QUIT = "quit"; - - private Socket socket; - private BufferedReader reader; - private BufferedWriter writer; - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (!socket.isOutputShutdown()) { - writer.write(msg + "\n"); - writer.flush(); - } - } - - // 从服务器接收消息 - public String receive() throws IOException { - String msg = null; - if (!socket.isInputShutdown()) { - msg = reader.readLine(); - } - return msg; - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close() { - if (writer != null) { - try { - System.out.println("关闭socket"); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - reader = new BufferedReader( - new InputStreamReader(socket.getInputStream()) - ); - writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream()) - ); - - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - - // 读取服务器转发的消息 - String msg = null; - while ((msg = receive()) != null) { - System.out.println(msg); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public static void main(String[] args) { - ChatClient chatClient = new ChatClient(); - chatClient.start(); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 35ba090e..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fangpeng.io.bio.chatroom.client; - - -import java.io.*; - -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = - new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java b/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java deleted file mode 100644 index c349f2e7..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.io.bio.chatroom.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatHandler implements Runnable { - - private ChatServer server; - private Socket socket; - - public ChatHandler(ChatServer server, Socket socket) { - this.server = server; - this.socket = socket; - } - - @Override - public void run() { - - try { - // 存储新上线用户 - server.addClient(socket); - - // 读取用户发送的消息 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - String msg = null; - - while ((msg = reader.readLine()) != null) { - String fwdMsg = "客户端[" + socket.getPort() + "]: " + msg + "\n"; - System.out.print(fwdMsg); - - server.forwardMessage(socket, fwdMsg); - - // 检查用户是否准备退出 - if (server.readyToQuit(msg)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - server.removeClient(socket); - } catch (IOException e) { - e.printStackTrace(); - } - } - - } -} diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java deleted file mode 100644 index 09ba9a28..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.fangpeng.io.bio.chatroom.server; - -import java.io.*; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatServer { - - private int DEFAULT_PORT = 8888; - private final String QUIT = "quit"; - - private ServerSocket serverSocket; - private ExecutorService executorService; - private Map connectedClients; - - public ChatServer() { - executorService = Executors.newFixedThreadPool(10); - connectedClients = new HashMap<>(); - } - - public synchronized void addClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - connectedClients.put(port, writer); - System.out.println("客户端[" + port + "]已连接到服务器"); - } - } - - public synchronized void removeClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - if (connectedClients.containsKey(port)) { - connectedClients.get(port).close(); - } - connectedClients.remove(port); - System.out.println("客户端[" + port + "]已断开连接"); - } - } - - public synchronized void forwardMessage(Socket socket, String fwdMsg) throws IOException { - for (Integer id : connectedClients.keySet()) { - if (!id.equals(socket.getPort())) { - Writer writer = connectedClients.get(id); - writer.write(fwdMsg); - writer.flush(); - } - } - } - - public synchronized void close() { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT + "..."); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - // 创建ChatHandler线程 - executorService.execute(new ChatHandler(this, socket)); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public static void main(String[] args) { - ChatServer server = new ChatServer(); - server.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java deleted file mode 100644 index 6026b8d4..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.client; - -import java.io.*; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class ChatClient { - - private final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private final int DEFAULT_SERVER_PORT = 8888; - private final String QUIT = "quit"; - - private Socket socket; - private BufferedWriter writer; - private BufferedReader reader; - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (!socket.isOutputShutdown()) { - writer.write(msg + "\n"); - writer.flush(); - } - } - - // 从服务器接收消息 - public String receive() throws IOException { - String msg = null; - if (!socket.isInputShutdown()) { - msg = reader.readLine(); - } - return msg; - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close() { - if (writer != null) { - try { - System.out.println("关闭socket"); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - reader = new BufferedReader( - new InputStreamReader(socket.getInputStream()) - ); - writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream()) - ); - - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - - // 读取服务器转发的消息 - String msg = null; - while ((msg = receive()) != null) { - System.out.println(msg); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public static void main(String[] args) { - ChatClient client = new ChatClient(); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java deleted file mode 100644 index 61945815..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.client; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java deleted file mode 100644 index f3dfadb9..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatHandler implements Runnable { - - private ChatServer server; - private Socket socket; - - public ChatHandler(ChatServer server, Socket socket) { - this.server = server; - this.socket = socket; - } - - @Override - public void run() { - - try { - // 存储新上线用户 - server.addClient(socket); - - // 读取用户发送的消息 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - String msg = null; - - while ((msg = reader.readLine()) != null) { - String fwdMsg = "客户端[" + socket.getPort() + "]: " + msg + "\n"; - System.out.print(fwdMsg); - - server.forwardMessage(socket, fwdMsg); - - // 检查用户是否准备退出 - if (server.readyToQuit(msg)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - server.removeClient(socket); - } catch (IOException e) { - e.printStackTrace(); - } - } - - } -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java deleted file mode 100644 index f1a9e3c5..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.server; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatServer { - - private int DEFAULT_PORT = 8888; - private final String QUIT = "quit"; - - private ServerSocket serverSocket; - private Map connectedClients; - - public ChatServer() { - connectedClients = new HashMap<>(); - } - - public synchronized void addClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - connectedClients.put(port, writer); - System.out.println("客户端[" + port + "]已连接到服务器"); - } - } - - public synchronized void removeClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - if (connectedClients.containsKey(port)) { - connectedClients.get(port).close(); - } - connectedClients.remove(port); - System.out.println("客户端[" + port + "]已断开连接"); - } - } - - public synchronized void forwardMessage(Socket socket, String fwdMsg) throws IOException { - for (Integer id : connectedClients.keySet()) { - if (!id.equals(socket.getPort())) { - Writer writer = connectedClients.get(id); - writer.write(fwdMsg); - writer.flush(); - } - } - } - - public synchronized void close() { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT + "..."); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - // 创建ChatHandler线程 - new Thread(new ChatHandler(this, socket)).start(); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public static void main(String[] args) { - ChatServer server = new ChatServer(); - server.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/Client.java b/src/main/java/com/fangpeng/io/demo/Client.java deleted file mode 100644 index 4eea6505..00000000 --- a/src/main/java/com/fangpeng/io/demo/Client.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author 方鹏 - * @date 2022年01月17日 10:32 下午 - */ -public class Client { - - public static void main(String[] args) { - - final String QUIT = "quit"; - final String DEFAULT_SERVER_HOST = "127.0.0.1"; - final int DEFAULT_SERVER_PORT = 8888; - Socket socket = null; - BufferedWriter writer = null; - - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); - - // 等待用户输入信息 - BufferedReader consoleReader = - new BufferedReader(new InputStreamReader(System.in)); - - while (true) { - String input = consoleReader.readLine(); - - // 发送消息给服务器 - writer.write(input + "\n"); - writer.flush(); - - // 读取服务器返回的消息 - String msg = reader.readLine(); - System.out.println(msg); - - // 查看用户是否退出 - if (QUIT.equals(input)) { - break; - } - } - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - try { - writer.close(); - System.out.println("关闭socket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/IOClient.java b/src/main/java/com/fangpeng/io/demo/IOClient.java deleted file mode 100644 index e50d2666..00000000 --- a/src/main/java/com/fangpeng/io/demo/IOClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.IOException; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -/** - * 客户端的代码相对简单,连接上服务端 8000 端口之后,每隔 2 秒,我们向服务端写一个带有时间戳的 "hello world" - * - * @author 方鹏 - * @date 2022年01月14日 4:34 下午 - */ -public class IOClient { - - public static void main(String[] args) { - new Thread(() -> { - try { - Socket socket = new Socket("127.0.0.1", 8000); - while (true) { - try { - socket.getOutputStream().write((new Date() + ": hello world").getBytes()); - TimeUnit.MILLISECONDS.sleep(2000); - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/IOServer.java b/src/main/java/com/fangpeng/io/demo/IOServer.java deleted file mode 100644 index 66882860..00000000 --- a/src/main/java/com/fangpeng/io/demo/IOServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.IOException; -import java.io.InputStream; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * Server 端首先创建了一个serverSocket来监听 8000 端口,然后创建一个线程,线程里面不断调用阻塞方法 serversocket.accept(); - * 获取新的连接,当获取到新的连接之后,给每条连接创建一个新的线程,这个线程负责从该连接中读取数据, - * 然后读取数据是以字节流的方式 - * @author 方鹏 - * @date 2022年01月14日 4:16 下午 - */ -public class IOServer { - - public static void main(String[] args) throws IOException { - ServerSocket serverSocket = new ServerSocket(8000); - - // 接收新连接线程 - new Thread(() -> { - while (true) { - // 阻塞方法获取新的连接 - try { - Socket socket = serverSocket.accept(); - - // 每一个新的连接都创建一个线程,负责读取数据 - new Thread(() -> { - try { - int len; - byte[] data = new byte[1024]; - InputStream inputStream = socket.getInputStream(); - // 按字节流方式读取数据 - while ((len = inputStream.read(data)) != -1) { - System.out.println(new String(data, 0, len)); - } - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); - } catch (IOException e) { - e.printStackTrace(); - } - } - }).start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/Server.java b/src/main/java/com/fangpeng/io/demo/Server.java deleted file mode 100644 index 6a1a0a7c..00000000 --- a/src/main/java/com/fangpeng/io/demo/Server.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 10:32 下午 - */ -public class Server { - - public static void main(String[] args) { - final String QUIT = "quit"; - final int DEFAULT_PORT = 8888; - ServerSocket serverSocket = null; - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口" + DEFAULT_PORT); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - System.out.println("客户端[" + socket.getPort() + "]已连接"); - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - // 读取客户端发送的消息 - String msg = null; - while ((msg = reader.readLine()) != null) { - // 读取客户端发送的消息 - System.out.println("客户端[" + socket.getPort() + "]: " + msg); - - // 回复客户发送的消息 - writer.write("服务器: " + msg + "\n"); - writer.flush(); - - // 查看客户端是否退出 - if (QUIT.equals(msg)) { - System.out.println("客户端[" + socket.getPort() + "]已断开连接"); - break; - } - } - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java deleted file mode 100644 index 0600ab91..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.fangpeng.io.nio.chatroom.client; - -import java.io.*; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.channels.ClosedSelectorException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Map; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class ChatClient { - - private static final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private static final int DEFAULT_SERVER_PORT = 8888; - private static final String QUIT = "quit"; - - private static final int BUFFER = 1024; - private String host; - private int port; - private SocketChannel client; - private ByteBuffer rBuffer = ByteBuffer.allocate(BUFFER); - private ByteBuffer wBuffer = ByteBuffer.allocate(BUFFER); - private Selector selector; - private Charset charset = Charset.forName("UTF-8"); - - public ChatClient() { - this(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - } - - public ChatClient(String host, int port) { - this.host = host; - this.port = port; - } - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (msg.isEmpty()) { - return; - } - - wBuffer.clear(); - wBuffer.put(charset.encode(msg)); - wBuffer.flip(); - - while (wBuffer.hasRemaining()) { - client.write(wBuffer); - } - - // 检查用户是否准备退出 - if (readyToQuit(msg)) { - close(selector); - } - - } - - // 从服务器接收消息 - public String receive(SocketChannel client) throws IOException { - rBuffer.clear(); - while (client.read(rBuffer) > 0); - rBuffer.flip(); - return String.valueOf(charset.decode(rBuffer)); - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - client = SocketChannel.open(); - client.configureBlocking(false); - - selector = Selector.open(); - client.register(selector, SelectionKey.OP_CONNECT); - client.connect(new InetSocketAddress(host, port)); - - while (true) { - selector.select(); - Set selectionKeys = selector.selectedKeys(); - - for (SelectionKey key : selectionKeys) { - handles(key); - } - selectionKeys.clear(); - } - } catch (IOException e) { - e.printStackTrace(); - } catch (ClosedSelectorException e) { - // 用户正常退出 - } finally { - close(selector); - } - } - - private void handles(SelectionKey key) throws IOException { - - // CONNECT事件 - 连接就绪事件 - if (key.isConnectable()) { - SocketChannel client = (SocketChannel) key.channel(); - if (client.isConnectionPending()) { - client.finishConnect(); - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - } - client.register(selector, SelectionKey.OP_READ); - } - - // READ事件 - 服务器转发消息 - else if (key.isReadable()) { - SocketChannel client = (SocketChannel) key.channel(); - String msg = receive(client); - if (msg.isEmpty()) { - // 服务器异常 - close(selector); - } else { - System.out.println(msg); - } - } - } - - public static void main(String[] args) { - ChatClient client = new ChatClient("127.0.0.1", 7777); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 79618daf..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.io.nio.chatroom.client; - -import java.io.*; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java deleted file mode 100644 index 90ce4069..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.fangpeng.io.nio.chatroom.server; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.*; -import java.nio.charset.Charset; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月19日 10:04 上午 - */ -public class ChatServer { - - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - private static final int BUFFER = 1024; - - private ServerSocketChannel server; - private Selector selector; - private ByteBuffer rBuffer = ByteBuffer.allocate(BUFFER); - private ByteBuffer wBuffer = ByteBuffer.allocate(BUFFER); - private Charset charset = Charset.forName("UTF-8"); - private int port; - - public ChatServer() { - this(DEFAULT_PORT); - } - - public ChatServer(int port) { - this.port = port; - } - - private void start() { - try { - server = ServerSocketChannel.open(); - // 默认是阻塞的,设置成非阻塞 - server.configureBlocking(false); - server.socket().bind(new InetSocketAddress(port)); - - selector = Selector.open(); - server.register(selector, SelectionKey.OP_ACCEPT); - System.out.println("启动服务器, 监听端口:" + port + "..."); - - // select是阻塞的 - while (true) { - selector.select(); - Set selectionKeys = selector.selectedKeys(); - for (SelectionKey key : selectionKeys) { - // 处理被触发的事件 - handles(key); - } - selectionKeys.clear(); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(selector); - } - } - - private void handles(SelectionKey key) throws IOException { - - // ACCEPT事件 - 和客户端建立了连接 - if (key.isAcceptable()) { - ServerSocketChannel server = (ServerSocketChannel) key.channel(); - // 获取客户端的连接Channel - SocketChannel client = server.accept(); - client.configureBlocking(false); - client.register(selector, SelectionKey.OP_READ); - System.out.println(getClientName(client) + "已连接"); - } - - // READ事件 - 客户端发送了消息 - else if (key.isReadable()) { - SocketChannel client = (SocketChannel) key.channel(); - String fwdMsg = receive(client); - if (fwdMsg.isEmpty()) { - // 客户端异常 - key.cancel(); - selector.wakeup(); - } else { - System.out.println(getClientName(client) + ":" + fwdMsg); - forwardMessage(client, fwdMsg); - - // 检查用户是否退出 - if (readyToQuit(fwdMsg)) { - key.cancel(); - selector.wakeup(); - System.out.println(getClientName(client) + "已断开"); - } - } - - } - } - - private void forwardMessage(SocketChannel client, String fwdMsg) throws IOException { - for (SelectionKey key : selector.keys()) { - Channel connectedClient = key.channel(); - if (connectedClient instanceof ServerSocketChannel) { - continue; - } - - if (key.isValid() && !client.equals(connectedClient)) { - wBuffer.clear(); - wBuffer.put(charset.encode(getClientName(client) + ":" + fwdMsg)); - wBuffer.flip(); - while (wBuffer.hasRemaining()) { - ((SocketChannel)connectedClient).write(wBuffer); - } - } - } - } - - private String receive(SocketChannel client) throws IOException { - rBuffer.clear(); - while (client.read(rBuffer) > 0); - rBuffer.flip(); - return String.valueOf(charset.decode(rBuffer)); - } - - - private boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private String getClientName(SocketChannel client) { - return "客户端[" + client.socket().getPort() + "]"; - } - - public static void main(String[] args) { - ChatServer chatServer = new ChatServer(7777); - chatServer.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java b/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java deleted file mode 100644 index 576a3e95..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.fangpeng.io.nio.demo; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月20日 10:51 下午 - */ -public class NIOServer { - public static void main(String[] args) throws IOException { - Selector serverSelector = Selector.open(); - Selector clientSelector = Selector.open(); - - new Thread(() -> { - try { - // 对应IO编程中服务端启动 - ServerSocketChannel listenerChannel = ServerSocketChannel.open(); - listenerChannel.socket().bind(new InetSocketAddress(8000)); - listenerChannel.configureBlocking(false); - listenerChannel.register(serverSelector, SelectionKey.OP_ACCEPT); - - while (true) { - // 监测是否有新的连接,这里的1指的是阻塞的时间为 1ms - if (serverSelector.select(1) > 0) { - Set set = serverSelector.selectedKeys(); - Iterator keyIterator = set.iterator(); - - while (keyIterator.hasNext()) { - SelectionKey key = keyIterator.next(); - - if (key.isAcceptable()) { - try { - // (1) 每来一个新连接,不需要创建一个线程,而是直接注册到clientSelector - SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept(); - clientChannel.configureBlocking(false); - clientChannel.register(clientSelector, SelectionKey.OP_READ); - } finally { - keyIterator.remove(); - } - } - - } - } - } - } catch (IOException ignored) { - } - - }).start(); - - - new Thread(() -> { - try { - while (true) { - // (2) 批量轮询是否有哪些连接有数据可读,这里的1指的是阻塞的时间为 1ms - if (clientSelector.select(1) > 0) { - Set set = clientSelector.selectedKeys(); - Iterator keyIterator = set.iterator(); - - while (keyIterator.hasNext()) { - SelectionKey key = keyIterator.next(); - - if (key.isReadable()) { - try { - SocketChannel clientChannel = (SocketChannel) key.channel(); - ByteBuffer byteBuffer = ByteBuffer.allocate(1024); - // (3) 面向 Buffer - clientChannel.read(byteBuffer); - byteBuffer.flip(); - System.out.println(Charset.defaultCharset().newDecoder().decode(byteBuffer) - .toString()); - } finally { - keyIterator.remove(); - key.interestOps(SelectionKey.OP_READ); - } - } - - } - } - } - } catch (IOException ignored) { - } - }).start(); - - - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java deleted file mode 100644 index 381fbc94..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:33 下午 - */ -public class ByteBufferAllocate { - - public static void main(String[] args) { - System.out.println(ByteBuffer.allocate(16).getClass()); - System.out.println(ByteBuffer.allocateDirect(16).getClass()); - /* - class java.nio.HeapByteBuffer - java 堆内存,读写效率较低,受到 GC 的影响 - class java.nio.DirectByteBuffer - 直接内存,读写效率高(少一次拷贝),不会受 GC 影响,分配的效率低 - */ - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java deleted file mode 100644 index 7a246054..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import lombok.extern.slf4j.Slf4j; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:25 下午 - */ -@Slf4j -public class ByteBufferDemo { - - public static void main(String[] args) { - // FileChannel - // 1. 输入输出流, 2. RandomAccessFile - try (FileChannel channel = new FileInputStream("data.txt").getChannel()) { - // 准备缓冲区 - ByteBuffer buffer = ByteBuffer.allocate(10); - while(true) { - // 从 channel 读取数据,向 buffer 写入 - int len = channel.read(buffer); - log.debug("读取到的字节数 {}", len); - if(len == -1) { // 没有内容了 - break; - } - // 打印 buffer 的内容 - buffer.flip(); // 切换至读模式 - while(buffer.hasRemaining()) { // 是否还有剩余未读数据 - byte b = buffer.get(); - log.debug("实际字节 {}", (char) b); - } - buffer.clear(); // 切换为写模式 - } - } catch (IOException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java deleted file mode 100644 index ab4cf412..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:07 下午 - */ -public class ByteBufferExam { - - /* - * 网络上有多条数据发送给服务端,数据之间使用 \n 进行分隔 - * 但由于某种原因这些数据在接收时,被进行了重新组合,例如原始数据有3条为 - * Hello,world\n - * I'm zhangsan\n - * How are you?\n - * 变成了下面的两个 byteBuffer (黏包,半包) - * Hello,world\nI'm zhangsan\nHo - * w are you?\n - * 现在要求你编写程序,将错乱的数据恢复成原始的按 \n 分隔的数据 - * @author 方鹏 - * @date 2022/1/23 6:08 下午 - * @param args - */ - public static void main(String[] args) { - ByteBuffer source = ByteBuffer.allocate(32); - source.put("Hello,world\nI'm zhangsan\nHo".getBytes()); - split(source); - source.put("w are you?\n".getBytes()); - split(source); - } - - private static void split(ByteBuffer source) { - source.flip(); - for (int i = 0; i < source.limit(); i++) { - // 找到一条完整消息 - if (source.get(i) == '\n') { - int length = i + 1 - source.position(); - // 把这条完整消息存入新的 ByteBuffer - ByteBuffer target = ByteBuffer.allocate(length); - // 从 source 读,向 target 写 - for (int j = 0; j < length; j++) { - target.put(source.get()); - } - debugAll(target); - } - } - source.compact(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java deleted file mode 100644 index b2fb0ad9..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:43 下午 - */ -public class ByteBufferRead { - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put(new byte[]{'a', 'b', 'c', 'd'}); - buffer.flip(); - - // rewind 从头开始读 - //buffer.get(new byte[4]); - //debugAll(buffer); - //buffer.rewind(); - //System.out.println((char)buffer.get()); - - // mark & reset - // mark 做一个标记,记录 position 位置, reset 是将 position 重置到 mark 的位置 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - //buffer.mark(); // 加标记,索引2 的位置 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - //buffer.reset(); // 将 position 重置到索引 2 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - - // get(i) 不会改变读索引的位置 - System.out.println((char) buffer.get(3)); - debugAll(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java deleted file mode 100644 index cd851bab..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:27 下午 - */ -public class ByteBufferReadWrite { - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put((byte) 0x61); // 'a' - debugAll(buffer); - buffer.put(new byte[]{0x62, 0x63, 0x64}); // b c d - debugAll(buffer); -// System.out.println(buffer.get()); - buffer.flip(); - System.out.println(buffer.get()); - debugAll(buffer); - buffer.compact(); - debugAll(buffer); - buffer.put(new byte[]{0x65, 0x66}); - debugAll(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java deleted file mode 100644 index 361c4b4b..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:55 下午 - */ -public class ByteBufferString { - - public static void main(String[] args) { - // 1. 字符串转为 ByteBuffer - ByteBuffer buffer1 = ByteBuffer.allocate(16); - buffer1.put("hello".getBytes()); - debugAll(buffer1); - - // 2. Charset - ByteBuffer buffer2 = StandardCharsets.UTF_8.encode("hello"); - debugAll(buffer2); - - // 3. wrap - ByteBuffer buffer3 = ByteBuffer.wrap("hello".getBytes()); - debugAll(buffer3); - - // 4. 转为字符串 - String str1 = StandardCharsets.UTF_8.decode(buffer2).toString(); - System.out.println(str1); - - buffer1.flip(); - String str2 = StandardCharsets.UTF_8.decode(buffer1).toString(); - System.out.println(str2); - - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java deleted file mode 100644 index 0baf397e..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import io.netty.util.internal.StringUtil; - -import java.nio.ByteBuffer; -import static io.netty.util.internal.MathUtil.isOutOfBounds; -import static io.netty.util.internal.StringUtil.NEWLINE; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:26 下午 - */ -public class ByteBufferUtil { - - private static final char[] BYTE2CHAR = new char[256]; - private static final char[] HEXDUMP_TABLE = new char[256 * 4]; - private static final String[] HEXPADDING = new String[16]; - private static final String[] HEXDUMP_ROWPREFIXES = new String[65536 >>> 4]; - private static final String[] BYTE2HEX = new String[256]; - private static final String[] BYTEPADDING = new String[16]; - - static { - final char[] DIGITS = "0123456789abcdef".toCharArray(); - for (int i = 0; i < 256; i++) { - HEXDUMP_TABLE[i << 1] = DIGITS[i >>> 4 & 0x0F]; - HEXDUMP_TABLE[(i << 1) + 1] = DIGITS[i & 0x0F]; - } - - int i; - - // Generate the lookup table for hex dump paddings - for (i = 0; i < HEXPADDING.length; i++) { - int padding = HEXPADDING.length - i; - StringBuilder buf = new StringBuilder(padding * 3); - for (int j = 0; j < padding; j++) { - buf.append(" "); - } - HEXPADDING[i] = buf.toString(); - } - - // Generate the lookup table for the start-offset header in each row (up to 64KiB). - for (i = 0; i < HEXDUMP_ROWPREFIXES.length; i++) { - StringBuilder buf = new StringBuilder(12); - buf.append(NEWLINE); - buf.append(Long.toHexString(i << 4 & 0xFFFFFFFFL | 0x100000000L)); - buf.setCharAt(buf.length() - 9, '|'); - buf.append('|'); - HEXDUMP_ROWPREFIXES[i] = buf.toString(); - } - - // Generate the lookup table for byte-to-hex-dump conversion - for (i = 0; i < BYTE2HEX.length; i++) { - BYTE2HEX[i] = ' ' + StringUtil.byteToHexStringPadded(i); - } - - // Generate the lookup table for byte dump paddings - for (i = 0; i < BYTEPADDING.length; i++) { - int padding = BYTEPADDING.length - i; - StringBuilder buf = new StringBuilder(padding); - for (int j = 0; j < padding; j++) { - buf.append(' '); - } - BYTEPADDING[i] = buf.toString(); - } - - // Generate the lookup table for byte-to-char conversion - for (i = 0; i < BYTE2CHAR.length; i++) { - if (i <= 0x1f || i >= 0x7f) { - BYTE2CHAR[i] = '.'; - } else { - BYTE2CHAR[i] = (char) i; - } - } - } - - /** - * 打印所有内容 - * @param buffer - */ - public static void debugAll(ByteBuffer buffer) { - int oldlimit = buffer.limit(); - buffer.limit(buffer.capacity()); - StringBuilder origin = new StringBuilder(256); - appendPrettyHexDump(origin, buffer, 0, buffer.capacity()); - System.out.println("+--------+-------------------- all ------------------------+----------------+"); - System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), oldlimit); - System.out.println(origin); - buffer.limit(oldlimit); - } - - /** - * 打印可读取内容 - * @param buffer - */ - public static void debugRead(ByteBuffer buffer) { - StringBuilder builder = new StringBuilder(256); - appendPrettyHexDump(builder, buffer, buffer.position(), buffer.limit() - buffer.position()); - System.out.println("+--------+-------------------- read -----------------------+----------------+"); - System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), buffer.limit()); - System.out.println(builder); - } - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put(new byte[]{97, 98, 99, 100}); - debugAll(buffer); - } - - private static void appendPrettyHexDump(StringBuilder dump, ByteBuffer buf, int offset, int length) { - if (isOutOfBounds(offset, length, buf.capacity())) { - throw new IndexOutOfBoundsException( - "expected: " + "0 <= offset(" + offset + ") <= offset + length(" + length - + ") <= " + "buf.capacity(" + buf.capacity() + ')'); - } - if (length == 0) { - return; - } - dump.append( - " +-------------------------------------------------+" + - NEWLINE + " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |" + - NEWLINE + "+--------+-------------------------------------------------+----------------+"); - - final int startIndex = offset; - final int fullRows = length >>> 4; - final int remainder = length & 0xF; - - // Dump the rows which have 16 bytes. - for (int row = 0; row < fullRows; row++) { - int rowStartIndex = (row << 4) + startIndex; - - // Per-row prefix. - appendHexDumpRowPrefix(dump, row, rowStartIndex); - - // Hex dump - int rowEndIndex = rowStartIndex + 16; - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); - } - dump.append(" |"); - - // ASCII dump - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); - } - dump.append('|'); - } - - // Dump the last row which has less than 16 bytes. - if (remainder != 0) { - int rowStartIndex = (fullRows << 4) + startIndex; - appendHexDumpRowPrefix(dump, fullRows, rowStartIndex); - - // Hex dump - int rowEndIndex = rowStartIndex + remainder; - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); - } - dump.append(HEXPADDING[remainder]); - dump.append(" |"); - - // Ascii dump - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); - } - dump.append(BYTEPADDING[remainder]); - dump.append('|'); - } - - dump.append(NEWLINE + - "+--------+-------------------------------------------------+----------------+"); - } - - private static void appendHexDumpRowPrefix(StringBuilder dump, int row, int rowStartIndex) { - if (row < HEXDUMP_ROWPREFIXES.length) { - dump.append(HEXDUMP_ROWPREFIXES[row]); - } else { - dump.append(NEWLINE); - dump.append(Long.toHexString(rowStartIndex & 0xFFFFFFFFL | 0x100000000L)); - dump.setCharAt(dump.length() - 9, '|'); - dump.append('|'); - } - } - - public static short getUnsignedByte(ByteBuffer buffer, int index) { - return (short) (buffer.get(index) & 0xFF); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java deleted file mode 100644 index 28faa0db..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; - -/** - * 多个buffer数据写到一个文件中 - * @author 方鹏 - * @date 2022年01月23日 6:05 下午 - */ -public class GatheringWrites { - - public static void main(String[] args) { - ByteBuffer b1 = StandardCharsets.UTF_8.encode("hello"); - ByteBuffer b2 = StandardCharsets.UTF_8.encode("world"); - ByteBuffer b3 = StandardCharsets.UTF_8.encode("你好"); - - try (FileChannel channel = new RandomAccessFile("words2.txt", "rw").getChannel()) { - channel.write(new ByteBuffer[]{b1, b2, b3}); - } catch (IOException e) { - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java deleted file mode 100644 index 7968bf57..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * 数据分散读取 - * @author 方鹏 - * @date 2022年01月23日 6:03 下午 - */ -public class ScatteringReads { - - public static void main(String[] args) { - try (FileChannel channel = new RandomAccessFile("words.txt", "r").getChannel()) { - ByteBuffer b1 = ByteBuffer.allocate(3); - ByteBuffer b2 = ByteBuffer.allocate(3); - ByteBuffer b3 = ByteBuffer.allocate(5); - channel.read(new ByteBuffer[]{b1, b2, b3}); - b1.flip(); - b2.flip(); - b3.flip(); - debugAll(b1); - debugAll(b2); - debugAll(b3); - } catch (IOException e) { - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java b/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java deleted file mode 100644 index 6d00435c..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.channels.FileChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:26 下午 - */ -public class FileChannelTransferTo { - - public static void main(String[] args) { - try ( - FileChannel from = new FileInputStream("data.txt").getChannel(); - FileChannel to = new FileOutputStream("to.txt").getChannel(); - ) { - // 效率高,底层会利用操作系统的零拷贝进行优化, 大于2g 数据分批次传输 - long size = from.size(); - // left 变量代表还剩余多少字节 - for (long left = size; left > 0; ) { - System.out.println("position:" + (size - left) + " left:" + left); - left -= from.transferTo((size - left), left, to); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java b/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java deleted file mode 100644 index c4bdfc2e..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:36 下午 - */ -public class FilesCopy { - - public static void main(String[] args) throws IOException { - long start = System.currentTimeMillis(); - String source = "D:\\Snipaste-1.16.2-x64"; - String target = "D:\\Snipaste-1.16.2-x64aaa"; - - Files.walk(Paths.get(source)).forEach(path -> { - try { - String targetName = path.toString().replace(source, target); - // 是目录 - if (Files.isDirectory(path)) { - Files.createDirectory(Paths.get(targetName)); - } - // 是普通文件 - else if (Files.isRegularFile(path)) { - Files.copy(path, Paths.get(targetName)); - } - } catch (IOException e) { - e.printStackTrace(); - } - }); - long end = System.currentTimeMillis(); - System.out.println(end - start); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java b/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java deleted file mode 100644 index d619610d..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * 遍历文件夹 - * @author 方鹏 - * @date 2022年01月23日 6:37 下午 - */ -public class FilesWalkFileTree { - - public static void main(String[] args) throws IOException { -// Files.delete(Paths.get("/Users/fangpeng/Downloads/netty-demo")); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return super.visitFile(file, attrs); - } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return super.postVisitDirectory(dir, exc); - } - }); - } - - private static void m2() throws IOException { - AtomicInteger javaCount = new AtomicInteger(); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor(){ - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (file.toString().endsWith(".java")) { - System.out.println(file); - javaCount.incrementAndGet(); - } - return super.visitFile(file, attrs); - } - }); - System.out.println("java count:" + javaCount); - } - - private static void m1() throws IOException { - AtomicInteger dirCount = new AtomicInteger(); - AtomicInteger fileCount = new AtomicInteger(); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor(){ - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - System.out.println("====>"+dir); - dirCount.incrementAndGet(); - return super.preVisitDirectory(dir, attrs); - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - System.out.println(file); - fileCount.incrementAndGet(); - return super.visitFile(file, attrs); - } - }); - System.out.println("dir count:" +dirCount); - System.out.println("file count:" +fileCount); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/Client.java b/src/main/java/com/fangpeng/io/nio/demo/net/Client.java deleted file mode 100644 index 05ec1295..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.channels.SocketChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 9:39 下午 - */ -public class Client { - - public static void main(String[] args) throws IOException { - SocketChannel sc = SocketChannel.open(); - sc.connect(new InetSocketAddress("localhost", 8080)); - SocketAddress address = sc.getLocalAddress(); - System.out.println("waiting..."); -// sc.close(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java b/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java deleted file mode 100644 index 7835cf02..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.util.Iterator; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:52 下午 - */ -@Slf4j -public class MultiThreadServer { - - public static void main(String[] args) throws IOException { - Thread.currentThread().setName("boss"); - ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.configureBlocking(false); - Selector boss = Selector.open(); - SelectionKey bossKey = ssc.register(boss, 0, null); - bossKey.interestOps(SelectionKey.OP_ACCEPT); - ssc.bind(new InetSocketAddress(8080)); - // 1. 创建固定数量的 worker 并初始化 - Worker[] workers = new Worker[Runtime.getRuntime().availableProcessors()]; - for (int i = 0; i < workers.length; i++) { - workers[i] = new Worker("worker-" + i); - } - AtomicInteger index = new AtomicInteger(); - - while (true) { - boss.select(); - Iterator iter = boss.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isAcceptable()) { - SocketChannel sc = ssc.accept(); - sc.configureBlocking(false); - log.debug("connected...{}", sc.getRemoteAddress()); - // 2. 关联 selector - log.debug("before register...{}", sc.getRemoteAddress()); - // round robin 轮询 - workers[index.getAndIncrement() % workers.length].register(sc); // boss 调用 初始化 selector , 启动 worker-0 - log.debug("after register...{}", sc.getRemoteAddress()); - } - } - } - } - - static class Worker implements Runnable { - - private Thread thread; - private Selector selector; - private String name; - private volatile boolean start = false; // 还未初始化 - private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); - public Worker(String name) { - this.name = name; - } - - // 初始化线程,和 selector - public void register(SocketChannel sc) throws IOException { - if(!start) { - selector = Selector.open(); - thread = new Thread(this, name); - thread.start(); - start = true; - } - selector.wakeup(); // 唤醒 select 方法 boss - sc.register(selector, SelectionKey.OP_READ, null); // boss - } - - @Override - public void run() { - while (true) { - try { - selector.select(); - - Iterator iter = selector.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isReadable()) { - ByteBuffer buffer = ByteBuffer.allocate(16); - SocketChannel channel = (SocketChannel) key.channel(); - log.debug("read...{}", channel.getRemoteAddress()); - channel.read(buffer); - buffer.flip(); - debugAll(buffer); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/Server.java b/src/main/java/com/fangpeng/io/nio/demo/net/Server.java deleted file mode 100644 index 146795e8..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/Server.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:50 下午 - */ -@Slf4j -public class Server { - - public static void main(String[] args) throws IOException { - // 1. 创建 selector, 管理多个 channel - Selector selector = Selector.open(); - ServerSocketChannel server = ServerSocketChannel.open(); - server.configureBlocking(false); - - // 2. 建立 selector 和 channel 的联系(注册) - // SelectionKey 就是将来事件发生后,通过它可以知道事件和哪个channel的事件 - // key 只关注 accept 事件 - SelectionKey selectionKey = server.register(selector, SelectionKey.OP_ACCEPT); - - log.debug("selectionKey:{}", selectionKey); - server.bind(new InetSocketAddress(8080)); - - while (true) { - // 3. select 方法, 没有事件发生,线程阻塞,有事件,线程才会恢复运行 - // select 在事件未处理时,它不会阻塞, 事件发生后要么处理,要么取消,不能置之不理 - selector.select(); - - // 4. 处理事件, selectedKeys 内部包含了所有发生的事件 - Iterator iterator = selector.selectedKeys().iterator(); - - while (iterator.hasNext()) { - SelectionKey key = iterator.next(); - - // 处理key 时,要从 selectedKeys 集合中删除,否则下次处理就会有问题 - iterator.remove(); - log.debug("key: {}", key); - // 5. 区分事件类型 - if (key.isAcceptable()) { // 如果是 accept - ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); - SocketChannel sc = serverChannel.accept(); - sc.configureBlocking(false); - ByteBuffer buffer = ByteBuffer.allocate(16); - // 将一个ByteBuffer作为附件关联到selectionKey - SelectionKey scKey = sc.register(selector, 0, buffer); - scKey.interestOps(SelectionKey.OP_READ); - log.debug("{}", sc); - log.debug("scKey:{}", scKey); - } else if (key.isReadable()) { // 如果是 read - try { - SocketChannel channel = (SocketChannel) key.channel(); // 拿到触发事件的channel - ByteBuffer buffer = (ByteBuffer) key.attachment(); - int read = channel.read(buffer); // 如果是正常断开,read 的方法的返回值是 -1 - if (read == -1) { - key.cancel(); - } else { - buffer.flip(); -// debugAll(buffer); - System.out.println(Charset.defaultCharset().decode(buffer)); - } - } catch (IOException e) { - e.printStackTrace(); - key.cancel(); // 因为客户端断开了,因此需要将 key 取消(从 selector 的 keys 集合中真正删除 key) - } - } - } - - - } - - - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java b/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java deleted file mode 100644 index 74a61e57..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:36 下午 - */ -public class WriteClient { - - public static void main(String[] args) throws IOException { - SocketChannel sc = SocketChannel.open(); - sc.connect(new InetSocketAddress("localhost", 8080)); - - // 3. 接收数据 - int count = 0; - while (true) { - ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); - count += sc.read(buffer); - System.out.println(count); - buffer.clear(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java b/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java deleted file mode 100644 index 818d20e3..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:36 下午 - */ -public class WriteServer { - - public static void main(String[] args) throws IOException { - ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.configureBlocking(false); - Selector selector = Selector.open(); - ssc.register(selector, SelectionKey.OP_ACCEPT); - ssc.bind(new InetSocketAddress(8080)); - while (true) { - selector.select(); - Iterator iter = selector.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isAcceptable()) { - SocketChannel sc = ssc.accept(); - sc.configureBlocking(false); - SelectionKey sckey = sc.register(selector, 0, null); - sckey.interestOps(SelectionKey.OP_READ); - // 1. 向客户端发送大量数据 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 5000000; i++) { - sb.append("a"); - } - ByteBuffer buffer = Charset.defaultCharset().encode(sb.toString()); - - // 2. 返回值代表实际写入的字节数 - int write = sc.write(buffer); - System.out.println(write); - - // 3. 判断是否有剩余内容 - if (buffer.hasRemaining()) { - // 4. 关注可写事件 1 4 - sckey.interestOps(sckey.interestOps() + SelectionKey.OP_WRITE); -// sckey.interestOps(sckey.interestOps() | SelectionKey.OP_WRITE); - // 5. 把未写完的数据挂到 sckey 上 - sckey.attach(buffer); - } - } else if (key.isWritable()) { - ByteBuffer buffer = (ByteBuffer) key.attachment(); - SocketChannel sc = (SocketChannel) key.channel(); - int write = sc.write(buffer); - System.out.println(write); - // 6. 清理操作 - if (!buffer.hasRemaining()) { - key.attach(null); // 需要清除buffer - key.interestOps(key.interestOps() - SelectionKey.OP_WRITE);//不需关注可写事件 - } - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java b/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java deleted file mode 100644 index 7a0d4792..00000000 --- a/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.fangpeng.io.nio.file; - -import java.io.*; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -/** - * 文件拷贝 - * @author 方鹏 - * @date 2022年01月18日 10:52 下午 - */ -interface FileCopyRunner { - - void copyFile(File source, File target); - -} - -public class FileCopyDemo { - - private static final int ROUNDS = 5; - - private static void benchmark(FileCopyRunner test, File source, File target) { - long elapsed = 0L; - for (int i = 0; i < ROUNDS; i++) { - long startTime = System.currentTimeMillis(); - test.copyFile(source, target); - elapsed += System.currentTimeMillis() - startTime; - target.delete(); - } - System.out.println(test + ": " + elapsed / ROUNDS); - } - - private static void close(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static void main(String[] args) { - - FileCopyRunner noBufferStreamCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - InputStream fin = null; - OutputStream fout = null; - - try { - fin = new FileInputStream(source); - fout = new FileOutputStream(target); - - int result; - while ((result = fin.read()) != -1) { - fout.write(result); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "noBufferStreamCopy"; - } - }; - - FileCopyRunner bufferedStreamCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - InputStream fin = null; - OutputStream fout = null; - - - try { - fin = new BufferedInputStream(new FileInputStream(source)); - fout = new BufferedOutputStream(new FileOutputStream(target)); - - byte[] buffer = new byte[1024]; - - int result; - - while ((result = fin.read(buffer)) != -1) { - fout.write(buffer, 0, result); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "bufferedStreamCopy"; - } - }; - - FileCopyRunner nioBufferCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - FileChannel fin = null; - FileChannel fout = null; - - try { - fin = new FileInputStream(source).getChannel(); - fout = new FileOutputStream(target).getChannel(); - - ByteBuffer buffer = ByteBuffer.allocate(1024); - while (fin.read(buffer) != -1) { - buffer.flip(); - while (buffer.hasRemaining()) { - fout.write(buffer); - } - buffer.clear(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "nioBufferCopy"; - } - }; - - FileCopyRunner nioTransferCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - FileChannel fin = null; - FileChannel fout = null; - - try { - fin = new FileInputStream(source).getChannel(); - fout = new FileOutputStream(target).getChannel(); - - long transferred = 0L; - long size = fin.size(); - while (transferred != size) { - transferred += fin.transferTo(0, size, fout); - } - - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "nioTransferCopy"; - } - }; - - File smallFile = new File("/Users/fangpeng/test/smallFile"); - File smallFileCopy = new File("/Users/fangpeng/test/smallFile-copy"); - - System.out.println("---Copying small file---"); - benchmark(noBufferStreamCopy, smallFile, smallFileCopy); - benchmark(bufferedStreamCopy, smallFile, smallFileCopy); - benchmark(nioBufferCopy, smallFile, smallFileCopy); - benchmark(nioTransferCopy, smallFile, smallFileCopy); - - File bigFile = new File("/Users/fangpeng/test/bigFile"); - File bigFileCopy = new File("/Users/fangpeng/test/bigFile-copy"); - - System.out.println("---Copying big file---"); - benchmark(noBufferStreamCopy, bigFile, bigFileCopy); - benchmark(bufferedStreamCopy, bigFile, bigFileCopy); - benchmark(nioBufferCopy, bigFile, bigFileCopy); - benchmark(nioTransferCopy, bigFile, bigFileCopy); - - File hugeFile = new File("/Users/fangpeng/test/hugeFile"); - File hugeFileCopy = new File("/Users/fangpeng/test/hugeFile-copy"); - - System.out.println("---Copying huge file---"); - benchmark(noBufferStreamCopy, hugeFile, hugeFileCopy); - benchmark(bufferedStreamCopy, hugeFile, hugeFileCopy); - benchmark(nioBufferCopy, hugeFile, hugeFileCopy); - benchmark(nioTransferCopy, hugeFile, hugeFileCopy); - - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client1.java b/src/main/java/com/fangpeng/netty/advance/Client1.java deleted file mode 100644 index 8c46a6a8..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client1.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:55 下午 - */ -public class Client1 { - - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - send(); - } - System.out.println("finish"); - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(16); - buf.writeBytes(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}); - ctx.writeAndFlush(buf); - ctx.channel().close(); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client2.java b/src/main/java/com/fangpeng/netty/advance/Client2.java deleted file mode 100644 index 084591f9..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client2.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.Random; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:57 下午 - */ -public class Client2 { - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - send(); - System.out.println("finish"); - } - - public static byte[] fill10Bytes(char c, int len) { - byte[] bytes = new byte[10]; - Arrays.fill(bytes, (byte) '_'); - for (int i = 0; i < len; i++) { - bytes[i] = (byte) c; - } - System.out.println(new String(bytes)); - return bytes; - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - char c = '0'; - Random r = new Random(); - for (int i = 0; i < 10; i++) { - byte[] bytes = fill10Bytes(c, r.nextInt(10) + 1); - c++; - buf.writeBytes(bytes); - } - ctx.writeAndFlush(buf); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client3.java b/src/main/java/com/fangpeng/netty/advance/Client3.java deleted file mode 100644 index 2fa8befd..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client3.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Random; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:58 下午 - */ -public class Client3 { - - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - send(); - System.out.println("finish"); - } - - public static StringBuilder makeString(char c, int len) { - StringBuilder sb = new StringBuilder(len + 2); - for (int i = 0; i < len; i++) { - sb.append(c); - } - sb.append("\n"); - return sb; - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - char c = '0'; - Random r = new Random(); - for (int i = 0; i < 10; i++) { - StringBuilder sb = makeString(c, r.nextInt(256) + 1); - c++; - buf.writeBytes(sb.toString().getBytes()); - } - ctx.writeAndFlush(buf); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/HttpTest.java b/src/main/java/com/fangpeng/netty/advance/HttpTest.java deleted file mode 100644 index 92676cd9..00000000 --- a/src/main/java/com/fangpeng/netty/advance/HttpTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponseStatus; -import io.netty.handler.codec.http.HttpServerCodec; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:25 下午 - */ -@Slf4j -public class HttpTest { - - public static void main(String[] args) { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new HttpServerCodec()); - ch.pipeline().addLast(new SimpleChannelInboundHandler() { - @Override - protected void channelRead0(ChannelHandlerContext ctx, HttpRequest msg) throws Exception { - // 获取请求 - log.debug(msg.uri()); - - // 返回响应 - DefaultFullHttpResponse response = - new DefaultFullHttpResponse(msg.protocolVersion(), HttpResponseStatus.OK); - - byte[] bytes = "

Hello, world!

".getBytes(); - - response.headers().setInt(CONTENT_LENGTH, bytes.length); - response.content().writeBytes(bytes); - - // 写回响应 - ctx.writeAndFlush(response); - } - }); - /*ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("{}", msg.getClass()); - - if (msg instanceof HttpRequest) { // 请求行,请求头 - - } else if (msg instanceof HttpContent) { //请求体 - - } - } - });*/ - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java b/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java deleted file mode 100644 index cf03a615..00000000 --- a/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.embedded.EmbeddedChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:09 下午 - */ -public class LengthFieldDecoderTest { - - public static void main(String[] args) { - EmbeddedChannel channel = new EmbeddedChannel( - new LengthFieldBasedFrameDecoder( - 1024, 0, 4, 1,4), - new LoggingHandler(LogLevel.DEBUG) - ); - - // 4 个字节的内容长度, 实际内容 - ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(); - send(buffer, "Hello, world"); - send(buffer, "Hi!"); - channel.writeInbound(buffer); - } - - private static void send(ByteBuf buffer, String content) { - byte[] bytes = content.getBytes(); // 实际内容 - int length = bytes.length; // 实际内容长度 - buffer.writeInt(length); - buffer.writeByte(1); - buffer.writeBytes(bytes); - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/RedisTest.java b/src/main/java/com/fangpeng/netty/advance/RedisTest.java deleted file mode 100644 index a4474d29..00000000 --- a/src/main/java/com/fangpeng/netty/advance/RedisTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:20 下午 - */ -@Slf4j -public class RedisTest { - - /* - set name zhangsan - *3 - $3 - set - $4 - name - $8 - zhangsan - */ - public static void main(String[] args) { - final byte[] LINE = {13, 10}; - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler()); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - buf.writeBytes("*3".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$3".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("set".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$4".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("name".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$8".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("zhangsan".getBytes()); - buf.writeBytes(LINE); - ctx.writeAndFlush(buf); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - System.out.println(buf.toString(Charset.defaultCharset())); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("localhost", 6379).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Server1.java b/src/main/java/com/fangpeng/netty/advance/Server1.java deleted file mode 100644 index 02d8e95b..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server1.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:56 下午 - */ -@Slf4j -public class Server1 { - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲器(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server1().start(); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/netty/advance/Server2.java b/src/main/java/com/fangpeng/netty/advance/Server2.java deleted file mode 100644 index c7298af7..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server2.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.FixedLengthFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:58 下午 - */ -@Slf4j -public class Server2 { - - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲区(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new FixedLengthFrameDecoder(10)); - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server2().start(); - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Server3.java b/src/main/java/com/fangpeng/netty/advance/Server3.java deleted file mode 100644 index 8a35f0dd..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server3.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:59 下午 - */ -@Slf4j -public class Server3 { - - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲区(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server3().start(); - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java b/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java deleted file mode 100644 index b8a73667..00000000 --- a/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.fangpeng.netty.chat.client; - -import com.fangpeng.netty.chat.message.*; -import com.fangpeng.netty.chat.protocol.MessageCodecSharable; -import com.fangpeng.netty.chat.protocol.ProcotolFrameDecoder; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.handler.timeout.IdleStateHandler; -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Scanner; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:14 下午 - */ -@Slf4j -public class ChatClient { - - public static void main(String[] args) { - NioEventLoopGroup group = new NioEventLoopGroup(); - LoggingHandler LOGGING_HANDLER = new LoggingHandler(LogLevel.DEBUG); - MessageCodecSharable MESSAGE_CODEC = new MessageCodecSharable(); - CountDownLatch WAIT_FOR_LOGIN = new CountDownLatch(1); - AtomicBoolean LOGIN = new AtomicBoolean(false); - AtomicBoolean EXIT = new AtomicBoolean(false); - Scanner scanner = new Scanner(System.in); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(group); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new ProcotolFrameDecoder()); - ch.pipeline().addLast(MESSAGE_CODEC); - // 用来判断是不是 读空闲时间过长,或 写空闲时间过长 - // 3s 内如果没有向服务器写数据,会触发一个 IdleState#WRITER_IDLE 事件 - ch.pipeline().addLast(new IdleStateHandler(0, 3, 0)); - // ChannelDuplexHandler 可以同时作为入站和出站处理器 - ch.pipeline().addLast(new ChannelDuplexHandler() { - // 用来触发特殊事件 - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{ - IdleStateEvent event = (IdleStateEvent) evt; - // 触发了写空闲事件 - if (event.state() == IdleState.WRITER_IDLE) { -// log.debug("3s 没有写数据了,发送一个心跳包"); - ctx.writeAndFlush(new PingMessage()); - } - } - }); - ch.pipeline().addLast("Client handler", new ChannelInboundHandlerAdapter() { - // 接收响应消息 - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("msg: {}", msg); - if ((msg instanceof LoginResponseMessage)) { - LoginResponseMessage response = (LoginResponseMessage) msg; - if (response.isSuccess()) { - // 如果登录成功 - LOGIN.set(true); - } - // 唤醒 system in 线程 - WAIT_FOR_LOGIN.countDown(); - } - } - - // 在连接建立后触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - // 负责接收用户在控制台的输入,负责向服务器发送各种消息 - new Thread(() -> { - System.out.println("请输入用户名:"); - String username = scanner.nextLine(); - if(EXIT.get()){ - return; - } - System.out.println("请输入密码:"); - String password = scanner.nextLine(); - if(EXIT.get()){ - return; - } - // 构造消息对象 - LoginRequestMessage message = new LoginRequestMessage(username, password, username); - System.out.println(message); - // 发送消息 - ctx.writeAndFlush(message); - System.out.println("等待后续操作..."); - try { - WAIT_FOR_LOGIN.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - // 如果登录失败 - if (!LOGIN.get()) { - ctx.channel().close(); - return; - } - while (true) { - System.out.println("=================================="); - System.out.println("send [username] [content]"); - System.out.println("gsend [group name] [content]"); - System.out.println("gcreate [group name] [m1,m2,m3...]"); - System.out.println("gmembers [group name]"); - System.out.println("gjoin [group name]"); - System.out.println("gquit [group name]"); - System.out.println("quit"); - System.out.println("=================================="); - String command = null; - try { - command = scanner.nextLine(); - } catch (Exception e) { - break; - } - if(EXIT.get()){ - return; - } - String[] s = command.split(" "); - switch (s[0]){ - case "send": - ctx.writeAndFlush(new ChatRequestMessage(username, s[1], s[2])); - break; - case "gsend": - ctx.writeAndFlush(new GroupChatRequestMessage(username, s[1], s[2])); - break; - case "gcreate": - Set set = new HashSet<>(Arrays.asList(s[2].split(","))); - set.add(username); // 加入自己 - ctx.writeAndFlush(new GroupCreateRequestMessage(s[1], set)); - break; - case "gmembers": - ctx.writeAndFlush(new GroupMembersRequestMessage(s[1])); - break; - case "gjoin": - ctx.writeAndFlush(new GroupJoinRequestMessage(username, s[1])); - break; - case "gquit": - ctx.writeAndFlush(new GroupQuitRequestMessage(username, s[1])); - break; - case "quit": - ctx.channel().close(); - return; - } - } - }, "system in").start(); - } - - // 在连接断开时触发 - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.debug("连接已经断开,按任意键退出.."); - EXIT.set(true); - } - - // 在出现异常时触发 - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - log.debug("连接已经断开,按任意键退出..{}", cause.getMessage()); - EXIT.set(true); - } - }); - } - }); - Channel channel = bootstrap.connect("localhost", 8080).sync().channel(); - channel.closeFuture().sync(); - } catch (Exception e) { - log.error("Client error", e); - } finally { - group.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java deleted file mode 100644 index 8d9fcc7a..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public abstract class AbstractResponseMessage extends Message { - private boolean success; - private String reason; - - public AbstractResponseMessage() { - } - - public AbstractResponseMessage(boolean success, String reason) { - this.success = success; - this.reason = reason; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java deleted file mode 100644 index 3bf305e9..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class ChatRequestMessage extends Message { - private String content; - private String to; - private String from; - - public ChatRequestMessage() { - } - - public ChatRequestMessage(String from, String to, String content) { - this.from = from; - this.to = to; - this.content = content; - } - - @Override - public int getMessageType() { - return ChatRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java deleted file mode 100644 index f1bae30d..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class ChatResponseMessage extends AbstractResponseMessage { - - private String from; - private String content; - - public ChatResponseMessage(boolean success, String reason) { - super(success, reason); - } - - public ChatResponseMessage(String from, String content) { - this.from = from; - this.content = content; - } - - @Override - public int getMessageType() { - return ChatResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java deleted file mode 100644 index b626c4ef..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupChatRequestMessage extends Message { - private String content; - private String groupName; - private String from; - - public GroupChatRequestMessage(String from, String groupName, String content) { - this.content = content; - this.groupName = groupName; - this.from = from; - } - - @Override - public int getMessageType() { - return GroupChatRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java deleted file mode 100644 index d70f206e..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupChatResponseMessage extends AbstractResponseMessage { - private String from; - private String content; - - public GroupChatResponseMessage(boolean success, String reason) { - super(success, reason); - } - - public GroupChatResponseMessage(String from, String content) { - this.from = from; - this.content = content; - } - @Override - public int getMessageType() { - return GroupChatResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java deleted file mode 100644 index 88fd623b..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -import java.util.Set; - -@Data -@ToString(callSuper = true) -public class GroupCreateRequestMessage extends Message { - private String groupName; - private Set members; - - public GroupCreateRequestMessage(String groupName, Set members) { - this.groupName = groupName; - this.members = members; - } - - @Override - public int getMessageType() { - return GroupCreateRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java deleted file mode 100644 index 5c10e822..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupCreateResponseMessage extends AbstractResponseMessage { - - public GroupCreateResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupCreateResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java deleted file mode 100644 index d5e97219..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupJoinRequestMessage extends Message { - private String groupName; - - private String username; - - public GroupJoinRequestMessage(String username, String groupName) { - this.groupName = groupName; - this.username = username; - } - - @Override - public int getMessageType() { - return GroupJoinRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java deleted file mode 100644 index 2825f148..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupJoinResponseMessage extends AbstractResponseMessage { - - public GroupJoinResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupJoinResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java deleted file mode 100644 index 39b269ce..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupMembersRequestMessage extends Message { - private String groupName; - - public GroupMembersRequestMessage(String groupName) { - this.groupName = groupName; - } - - @Override - public int getMessageType() { - return GroupMembersRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java deleted file mode 100644 index 74d99c75..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -import java.util.Set; - -@Data -@ToString(callSuper = true) -public class GroupMembersResponseMessage extends Message { - - private Set members; - - public GroupMembersResponseMessage(Set members) { - this.members = members; - } - - @Override - public int getMessageType() { - return GroupMembersResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java deleted file mode 100644 index cec0a6df..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupQuitRequestMessage extends Message { - private String groupName; - - private String username; - - public GroupQuitRequestMessage(String username, String groupName) { - this.groupName = groupName; - this.username = username; - } - - @Override - public int getMessageType() { - return GroupQuitRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java deleted file mode 100644 index 984d7df4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupQuitResponseMessage extends AbstractResponseMessage { - public GroupQuitResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupQuitResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java deleted file mode 100644 index 8d33b2f4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class LoginRequestMessage extends Message { - private String username; - private String password; - private String nickname; - - public LoginRequestMessage() { - } - - public LoginRequestMessage(String username, String password, String nickname) { - this.username = username; - this.password = password; - this.nickname = nickname; - } - - @Override - public int getMessageType() { - return LoginRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java deleted file mode 100644 index ad2242cd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class LoginResponseMessage extends AbstractResponseMessage { - public LoginResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return LoginResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/Message.java b/src/main/java/com/fangpeng/netty/chat/message/Message.java deleted file mode 100644 index 1200f515..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/Message.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -@Data -public abstract class Message implements Serializable { - - public static Class getMessageClass(int messageType) { - return messageClasses.get(messageType); - } - - private int sequenceId; - - private int messageType; - - public abstract int getMessageType(); - - public static final int LoginRequestMessage = 0; - public static final int LoginResponseMessage = 1; - public static final int ChatRequestMessage = 2; - public static final int ChatResponseMessage = 3; - public static final int GroupCreateRequestMessage = 4; - public static final int GroupCreateResponseMessage = 5; - public static final int GroupJoinRequestMessage = 6; - public static final int GroupJoinResponseMessage = 7; - public static final int GroupQuitRequestMessage = 8; - public static final int GroupQuitResponseMessage = 9; - public static final int GroupChatRequestMessage = 10; - public static final int GroupChatResponseMessage = 11; - public static final int GroupMembersRequestMessage = 12; - public static final int GroupMembersResponseMessage = 13; - public static final int PingMessage = 14; - public static final int PongMessage = 15; - private static final Map> messageClasses = new HashMap<>(); - - static { - messageClasses.put(LoginRequestMessage, LoginRequestMessage.class); - messageClasses.put(LoginResponseMessage, LoginResponseMessage.class); - messageClasses.put(ChatRequestMessage, ChatRequestMessage.class); - messageClasses.put(ChatResponseMessage, ChatResponseMessage.class); - messageClasses.put(GroupCreateRequestMessage, GroupCreateRequestMessage.class); - messageClasses.put(GroupCreateResponseMessage, GroupCreateResponseMessage.class); - messageClasses.put(GroupJoinRequestMessage, GroupJoinRequestMessage.class); - messageClasses.put(GroupJoinResponseMessage, GroupJoinResponseMessage.class); - messageClasses.put(GroupQuitRequestMessage, GroupQuitRequestMessage.class); - messageClasses.put(GroupQuitResponseMessage, GroupQuitResponseMessage.class); - messageClasses.put(GroupChatRequestMessage, GroupChatRequestMessage.class); - messageClasses.put(GroupChatResponseMessage, GroupChatResponseMessage.class); - messageClasses.put(GroupMembersRequestMessage, GroupMembersRequestMessage.class); - messageClasses.put(GroupMembersResponseMessage, GroupMembersResponseMessage.class); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java b/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java deleted file mode 100644 index 431406dd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.netty.chat.message; - -/** - * @author 方鹏 - * @date 2022年01月26日 9:25 下午 - */ -public class PingMessage extends Message { - @Override - public int getMessageType() { - return PingMessage; - } -} - diff --git a/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java b/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java deleted file mode 100644 index 62666727..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.netty.chat.message; - -/** - * @author 方鹏 - * @date 2022年01月26日 9:26 下午 - */ -public class PongMessage extends Message { - @Override - public int getMessageType() { - return PongMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java b/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java deleted file mode 100644 index 5c534385..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import com.fangpeng.netty.chat.message.Message; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageCodec; -import lombok.extern.slf4j.Slf4j; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:18 下午 - */ -@Slf4j -public class MessageCodec extends ByteToMessageCodec { - - - @Override - public void encode(ChannelHandlerContext ctx, Message message, ByteBuf byteBuf) throws Exception { - // 1. 4 字节的魔数 - byteBuf.writeBytes(new byte[]{1, 2, 3, 4}); - // 2. 1 字节的版本, - byteBuf.writeByte(1); - // 3. 1 字节的序列化方式 jdk 0 , json 1 - byteBuf.writeByte(0); - // 4. 1 字节的指令类型(什么类型的消息) - byteBuf.writeByte(message.getMessageType()); - // 5. 请求序号,4 个字节 - byteBuf.writeInt(message.getSequenceId()); - // 无意义,对齐填充 - byteBuf.writeByte(0xff); - // 6. 获取内容的字节数组 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(message); - - byte[] bytes = bos.toByteArray(); - // 7. 长度 - byteBuf.writeInt(bytes.length); - // 8. 写入内容 - byteBuf.writeBytes(bytes); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List list) throws Exception { - int magicNum = byteBuf.readInt(); - byte version = byteBuf.readByte(); - byte serializerType = byteBuf.readByte(); - byte messageType = byteBuf.readByte(); - int sequenceId = byteBuf.readInt(); - byteBuf.readByte(); - int length = byteBuf.readInt(); - byte[] bytes = new byte[length]; - byteBuf.readBytes(bytes, 0, length); - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); - Message message = (Message) ois.readObject(); - log.debug("{}, {}, {}, {}, {}, {}", magicNum, version, serializerType, messageType, sequenceId, length); - log.debug("{}", message); - list.add(message); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java b/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java deleted file mode 100644 index 3c73732c..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import com.fangpeng.netty.chat.message.Message; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageCodec; -import lombok.extern.slf4j.Slf4j; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:07 下午 - */ -@Slf4j -@ChannelHandler.Sharable -/** - * 必须和 LengthFieldBasedFrameDecoder 一起使用,确保接到的 ByteBuf 消息是完整的 - */ -public class MessageCodecSharable extends MessageToMessageCodec { - @Override - protected void encode(ChannelHandlerContext ctx, Message msg, List outList) throws Exception { - ByteBuf out = ctx.alloc().buffer(); - // 1. 4 字节的魔数 - out.writeBytes(new byte[]{1, 2, 3, 4}); - // 2. 1 字节的版本, - out.writeByte(1); - // 3. 1 字节的序列化方式 jdk 0 , json 1 - out.writeByte(0); - // 4. 1 字节的指令类型 - out.writeByte(msg.getMessageType()); - // 5. 4 个字节 - out.writeInt(msg.getSequenceId()); - // 无意义,对齐填充 - out.writeByte(0xff); - // 6. 获取内容的字节数组 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(msg); - byte[] bytes = bos.toByteArray(); - // 7. 长度 - out.writeInt(bytes.length); - // 8. 写入内容 - out.writeBytes(bytes); - outList.add(out); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - int magicNum = in.readInt(); - byte version = in.readByte(); - byte serializerType = in.readByte(); - byte messageType = in.readByte(); - int sequenceId = in.readInt(); - in.readByte(); - int length = in.readInt(); - byte[] bytes = new byte[length]; - in.readBytes(bytes, 0, length); - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); - Message message = (Message) ois.readObject(); - log.debug("{}, {}, {}, {}, {}, {}", magicNum, version, serializerType, messageType, sequenceId, length); - log.debug("{}", message); - out.add(message); - } -} - diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java b/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java deleted file mode 100644 index 346f39fd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:19 下午 - */ -public class ProcotolFrameDecoder extends LengthFieldBasedFrameDecoder { - - public ProcotolFrameDecoder() { - this(1024, 12, 4, 0, 0); - } - - public ProcotolFrameDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip); - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java b/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java deleted file mode 100644 index cac15b7c..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.chat.server; - -import com.fangpeng.netty.chat.protocol.MessageCodecSharable; -import com.fangpeng.netty.chat.protocol.ProcotolFrameDecoder; -import com.fangpeng.netty.chat.server.handler.*; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.handler.timeout.IdleStateHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:54 下午 - */ -@Slf4j -public class ChatServer { - - public static void main(String[] args) { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - LoggingHandler LOGGING_HANDLER = new LoggingHandler(LogLevel.DEBUG); - MessageCodecSharable MESSAGE_CODEC = new MessageCodecSharable(); - LoginRequestMessageHandler LOGIN_HANDLER = new LoginRequestMessageHandler(); - ChatRequestMessageHandler CHAT_HANDLER = new ChatRequestMessageHandler(); - GroupCreateRequestMessageHandler GROUP_CREATE_HANDLER = new GroupCreateRequestMessageHandler(); - GroupJoinRequestMessageHandler GROUP_JOIN_HANDLER = new GroupJoinRequestMessageHandler(); - GroupMembersRequestMessageHandler GROUP_MEMBERS_HANDLER = new GroupMembersRequestMessageHandler(); - GroupQuitRequestMessageHandler GROUP_QUIT_HANDLER = new GroupQuitRequestMessageHandler(); - GroupChatRequestMessageHandler GROUP_CHAT_HANDLER = new GroupChatRequestMessageHandler(); - QuitHandler QUIT_HANDLER = new QuitHandler(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new ProcotolFrameDecoder()); - ch.pipeline().addLast(LOGGING_HANDLER); - ch.pipeline().addLast(MESSAGE_CODEC); - // 用来判断是不是 读空闲时间过长,或 写空闲时间过长 - // 5s 内如果没有收到 channel 的数据,会触发一个 IdleState#READER_IDLE 事件 - ch.pipeline().addLast(new IdleStateHandler(5, 0, 0)); - // ChannelDuplexHandler 可以同时作为入站和出站处理器 - ch.pipeline().addLast(new ChannelDuplexHandler() { - // 用来触发特殊事件 - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{ - IdleStateEvent event = (IdleStateEvent) evt; - // 触发了读空闲事件 - if (event.state() == IdleState.READER_IDLE) { - log.debug("已经 5s 没有读到数据了"); - ctx.channel().close(); - } - } - }); - ch.pipeline().addLast(LOGIN_HANDLER); - ch.pipeline().addLast(CHAT_HANDLER); - ch.pipeline().addLast(GROUP_CREATE_HANDLER); - ch.pipeline().addLast(GROUP_JOIN_HANDLER); - ch.pipeline().addLast(GROUP_MEMBERS_HANDLER); - ch.pipeline().addLast(GROUP_QUIT_HANDLER); - ch.pipeline().addLast(GROUP_CHAT_HANDLER); - ch.pipeline().addLast(QUIT_HANDLER); - } - }); - Channel channel = serverBootstrap.bind(8080).sync().channel(); - channel.closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java deleted file mode 100644 index 299e7be8..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.ChatRequestMessage; -import com.fangpeng.netty.chat.message.ChatResponseMessage; -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class ChatRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, ChatRequestMessage msg) throws Exception { - String to = msg.getTo(); - Channel channel = SessionFactory.getSession().getChannel(to); - // 在线 - if (channel != null) { - channel.writeAndFlush(new ChatResponseMessage(msg.getFrom(), msg.getContent())); - } - // 不在线 - else { - ctx.writeAndFlush(new ChatResponseMessage(false, "对方用户不存在或者不在线")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java deleted file mode 100644 index 5aa648c9..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupChatRequestMessage; -import com.fangpeng.netty.chat.message.GroupChatResponseMessage; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.List; - -@ChannelHandler.Sharable -public class GroupChatRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupChatRequestMessage msg) throws Exception { - List channels = GroupSessionFactory.getGroupSession() - .getMembersChannel(msg.getGroupName()); - - for (Channel channel : channels) { - channel.writeAndFlush(new GroupChatResponseMessage(msg.getFrom(), msg.getContent())); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java deleted file mode 100644 index 0fa6b5d3..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupCreateRequestMessage; -import com.fangpeng.netty.chat.message.GroupCreateResponseMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSession; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.List; -import java.util.Set; - -@ChannelHandler.Sharable -public class GroupCreateRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupCreateRequestMessage msg) throws Exception { - String groupName = msg.getGroupName(); - Set members = msg.getMembers(); - // 群管理器 - GroupSession groupSession = GroupSessionFactory.getGroupSession(); - Group group = groupSession.createGroup(groupName, members); - if (group == null) { - // 发生成功消息 - ctx.writeAndFlush(new GroupCreateResponseMessage(true, groupName + "创建成功")); - // 发送拉群消息 - List channels = groupSession.getMembersChannel(groupName); - for (Channel channel : channels) { - channel.writeAndFlush(new GroupCreateResponseMessage(true, "您已被拉入" + groupName)); - } - } else { - ctx.writeAndFlush(new GroupCreateResponseMessage(false, groupName + "已经存在")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java deleted file mode 100644 index f8e42957..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupJoinRequestMessage; -import com.fangpeng.netty.chat.message.GroupJoinResponseMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class GroupJoinRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupJoinRequestMessage msg) throws Exception { - Group group = GroupSessionFactory.getGroupSession().joinMember(msg.getGroupName(), msg.getUsername()); - if (group != null) { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群加入成功")); - } else { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群不存在")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java deleted file mode 100644 index 75a75c54..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.GroupMembersRequestMessage; -import com.fangpeng.netty.chat.message.GroupMembersResponseMessage; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.Set; - -@ChannelHandler.Sharable -public class GroupMembersRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupMembersRequestMessage msg) throws Exception { - Set members = GroupSessionFactory.getGroupSession() - .getMembers(msg.getGroupName()); - ctx.writeAndFlush(new GroupMembersResponseMessage(members)); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java deleted file mode 100644 index ba9c11e4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupQuitRequestMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import static com.fangpeng.netty.chat.message.Message.GroupJoinResponseMessage; - -@ChannelHandler.Sharable -public class GroupQuitRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupQuitRequestMessage msg) throws Exception { - Group group = GroupSessionFactory.getGroupSession().removeMember(msg.getGroupName(), msg.getUsername()); - /*if (group != null) { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, "已退出群" + msg.getGroupName())); - } else { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群不存在")); - }*/ - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java deleted file mode 100644 index 08fb310e..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.LoginRequestMessage; -import com.fangpeng.netty.chat.message.LoginResponseMessage; -import com.fangpeng.netty.chat.server.service.UserServiceFactory; -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class LoginRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, LoginRequestMessage msg) throws Exception { - String username = msg.getUsername(); - String password = msg.getPassword(); - boolean login = UserServiceFactory.getUserService().login(username, password); - LoginResponseMessage message; - if (login) { - SessionFactory.getSession().bind(ctx.channel(), username); - message = new LoginResponseMessage(true, "登录成功"); - } else { - message = new LoginResponseMessage(false, "用户名或密码不正确"); - } - ctx.writeAndFlush(message); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java deleted file mode 100644 index cfb37e59..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@ChannelHandler.Sharable -public class QuitHandler extends ChannelInboundHandlerAdapter { - - // 当连接断开时触发 inactive 事件 - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - SessionFactory.getSession().unbind(ctx.channel()); - log.debug("{} 已经断开", ctx.channel()); - } - - // 当出现异常时触发 - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - SessionFactory.getSession().unbind(ctx.channel()); - log.debug("{} 已经异常断开 异常是{}", ctx.channel(), cause.getMessage()); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java deleted file mode 100644 index 48f0eaaa..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -/** - * 用户管理接口 - */ -public interface UserService { - - /** - * 登录 - * @param username 用户名 - * @param password 密码 - * @return 登录成功返回 true, 否则返回 false - */ - boolean login(String username, String password); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java deleted file mode 100644 index d4ad6a19..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -public abstract class UserServiceFactory { - - private static UserService userService = new UserServiceMemoryImpl(); - - public static UserService getUserService() { - return userService; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java deleted file mode 100644 index ae0e4cb4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class UserServiceMemoryImpl implements UserService { - private Map allUserMap = new ConcurrentHashMap<>(); - - { - allUserMap.put("zhangsan", "123"); - allUserMap.put("lisi", "123"); - allUserMap.put("wangwu", "123"); - allUserMap.put("zhaoliu", "123"); - allUserMap.put("qianqi", "123"); - allUserMap.put("kobe", "123456"); - } - - @Override - public boolean login(String username, String password) { - String pass = allUserMap.get(username); - if (pass == null) { - return false; - } - return pass.equals(password); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/Group.java b/src/main/java/com/fangpeng/netty/chat/server/session/Group.java deleted file mode 100644 index 736fa838..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/Group.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import lombok.Data; - -import java.util.Collections; -import java.util.Set; - -@Data -/** - * 聊天组,即聊天室 - */ -public class Group { - // 聊天室名称 - private String name; - // 聊天室成员 - private Set members; - - public static final Group EMPTY_GROUP = new Group("empty", Collections.emptySet()); - - public Group(String name, Set members) { - this.name = name; - this.members = members; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java deleted file mode 100644 index 38fd5e47..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.List; -import java.util.Set; - -/** - * 聊天组会话管理接口 - */ -public interface GroupSession { - - /** - * 创建一个聊天组, 如果不存在才能创建成功, 否则返回 null - * @param name 组名 - * @param members 成员 - * @return 成功时返回组对象, 失败返回 null - */ - Group createGroup(String name, Set members); - - /** - * 加入聊天组 - * @param name 组名 - * @param member 成员名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group joinMember(String name, String member); - - /** - * 移除组成员 - * @param name 组名 - * @param member 成员名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group removeMember(String name, String member); - - /** - * 移除聊天组 - * @param name 组名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group removeGroup(String name); - - /** - * 获取组成员 - * @param name 组名 - * @return 成员集合, 没有成员会返回 empty set - */ - Set getMembers(String name); - - /** - * 获取组成员的 channel 集合, 只有在线的 channel 才会返回 - * @param name 组名 - * @return 成员 channel 集合 - */ - List getMembersChannel(String name); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java deleted file mode 100644 index d4d65547..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -public abstract class GroupSessionFactory { - - private static GroupSession session = new GroupSessionMemoryImpl(); - - public static GroupSession getGroupSession() { - return session; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java deleted file mode 100644 index df9d0fae..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -public class GroupSessionMemoryImpl implements GroupSession { - private final Map groupMap = new ConcurrentHashMap<>(); - - @Override - public Group createGroup(String name, Set members) { - Group group = new Group(name, members); - return groupMap.putIfAbsent(name, group); - } - - @Override - public Group joinMember(String name, String member) { - return groupMap.computeIfPresent(name, (key, value) -> { - value.getMembers().add(member); - return value; - }); - } - - @Override - public Group removeMember(String name, String member) { - return groupMap.computeIfPresent(name, (key, value) -> { - value.getMembers().remove(member); - return value; - }); - } - - @Override - public Group removeGroup(String name) { - return groupMap.remove(name); - } - - @Override - public Set getMembers(String name) { - return groupMap.getOrDefault(name, Group.EMPTY_GROUP).getMembers(); - } - - @Override - public List getMembersChannel(String name) { - return getMembers(name).stream() - .map(member -> SessionFactory.getSession().getChannel(member)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/Session.java b/src/main/java/com/fangpeng/netty/chat/server/session/Session.java deleted file mode 100644 index 331ae989..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/Session.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - - -import io.netty.channel.Channel; - -/** - * 会话管理接口 - */ -public interface Session { - - /** - * 绑定会话 - * @param channel 哪个 channel 要绑定会话 - * @param username 会话绑定用户 - */ - void bind(Channel channel, String username); - - /** - * 解绑会话 - * @param channel 哪个 channel 要解绑会话 - */ - void unbind(Channel channel); - - /** - * 获取属性 - * @param channel 哪个 channel - * @param name 属性名 - * @return 属性值 - */ - Object getAttribute(Channel channel, String name); - - /** - * 设置属性 - * @param channel 哪个 channel - * @param name 属性名 - * @param value 属性值 - */ - void setAttribute(Channel channel, String name, Object value); - - /** - * 根据用户名获取 channel - * @param username 用户名 - * @return channel - */ - Channel getChannel(String username); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java b/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java deleted file mode 100644 index 4891467d..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -public abstract class SessionFactory { - - private static Session session = new SessionMemoryImpl(); - - public static Session getSession() { - return session; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java deleted file mode 100644 index 9d081099..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class SessionMemoryImpl implements Session { - - private final Map usernameChannelMap = new ConcurrentHashMap<>(); - private final Map channelUsernameMap = new ConcurrentHashMap<>(); - private final Map> channelAttributesMap = new ConcurrentHashMap<>(); - - @Override - public void bind(Channel channel, String username) { - usernameChannelMap.put(username, channel); - channelUsernameMap.put(channel, username); - channelAttributesMap.put(channel, new ConcurrentHashMap<>()); - } - - @Override - public void unbind(Channel channel) { - String username = channelUsernameMap.remove(channel); - usernameChannelMap.remove(username); - channelAttributesMap.remove(channel); - } - - @Override - public Object getAttribute(Channel channel, String name) { - return channelAttributesMap.get(channel).get(name); - } - - @Override - public void setAttribute(Channel channel, String name, Object value) { - channelAttributesMap.get(channel).put(name, value); - } - - @Override - public Channel getChannel(String username) { - return usernameChannelMap.get(username); - } - - @Override - public String toString() { - return usernameChannelMap.toString(); - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java b/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java deleted file mode 100644 index 4b88bc80..00000000 --- a/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -/** - * @author 方鹏 - * @date 2022年01月21日 12:31 上午 - */ -public class ByteBufTest { - public static void main(String[] args) { - ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100); - - print("allocate ByteBuf(9, 100)", buffer); - - // write 方法改变写指针,写完之后写指针未到 capacity 的时候,buffer 仍然可写 - buffer.writeBytes(new byte[]{1, 2, 3, 4}); - print("writeBytes(1,2,3,4)", buffer); - - // write 方法改变写指针,写完之后写指针未到 capacity 的时候,buffer 仍然可写, 写完 int 类型之后,写指针增加4 - buffer.writeInt(12); - print("writeInt(12)", buffer); - - // write 方法改变写指针, 写完之后写指针等于 capacity 的时候,buffer 不可写 - buffer.writeBytes(new byte[]{5}); - print("writeBytes(5)", buffer); - - // write 方法改变写指针,写的时候发现 buffer 不可写则开始扩容,扩容之后 capacity 随即改变 - buffer.writeBytes(new byte[]{6}); - print("writeBytes(6)", buffer); - - // get 方法不改变读写指针 - System.out.println("getByte(3) return: " + buffer.getByte(3)); - System.out.println("getShort(3) return: " + buffer.getShort(3)); - System.out.println("getInt(3) return: " + buffer.getInt(3)); - print("getByte()", buffer); - - - // set 方法不改变读写指针 - buffer.setByte(buffer.readableBytes() + 1, 0); - print("setByte()", buffer); - - // read 方法改变读指针 - byte[] dst = new byte[buffer.readableBytes()]; - buffer.readBytes(dst); - print("readBytes(" + dst.length + ")", buffer); - - } - - private static void print(String action, ByteBuf buffer) { - System.out.println("after ===========" + action + "============"); - System.out.println("capacity(): " + buffer.capacity()); - System.out.println("maxCapacity(): " + buffer.maxCapacity()); - System.out.println("readerIndex(): " + buffer.readerIndex()); - System.out.println("readableBytes(): " + buffer.readableBytes()); - System.out.println("isReadable(): " + buffer.isReadable()); - System.out.println("writerIndex(): " + buffer.writerIndex()); - System.out.println("writableBytes(): " + buffer.writableBytes()); - System.out.println("isWritable(): " + buffer.isWritable()); - System.out.println("maxWritableBytes(): " + buffer.maxWritableBytes()); - System.out.println(); - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java b/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java deleted file mode 100644 index 92d5da50..00000000 --- a/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static io.netty.buffer.ByteBufUtil.appendPrettyHexDump; -import static io.netty.util.internal.StringUtil.NEWLINE; - -/** - * @author 方鹏 - * @date 2022年01月26日 12:03 上午 - */ -public class ByteBufTest2 { - - public static void main(String[] args) { - - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(); - System.out.println(buf.getClass()); - System.out.println(buf.maxCapacity()); - log(buf); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 32; i++) { - sb.append("a"); - } - buf.writeBytes(sb.toString().getBytes()); - log(buf); - } - - public static void log(ByteBuf buffer) { - int length = buffer.readableBytes(); - int rows = length / 16 + (length % 15 == 0 ? 0 : 1) + 4; - StringBuilder buf = new StringBuilder(rows * 80 * 2) - .append("read index:").append(buffer.readerIndex()) - .append(" write index:").append(buffer.writerIndex()) - .append(" capacity:").append(buffer.capacity()) - .append(NEWLINE); - appendPrettyHexDump(buf, buffer); - System.out.println(buf.toString()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java b/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java deleted file mode 100644 index f77805c1..00000000 --- a/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import lombok.extern.slf4j.Slf4j; - -import java.net.InetSocketAddress; -import java.util.Scanner; - -/** - * @author 方鹏 - * @date 2022年01月25日 10:35 下午 - */ -@Slf4j -public class CloseFutureClient { - - public static void main(String[] args) throws InterruptedException { - NioEventLoopGroup group = new NioEventLoopGroup(); - ChannelFuture channelFuture = new Bootstrap() - .group(group) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { -// ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new StringEncoder()); - } - }) - .connect(new InetSocketAddress("localhost", 8080)); - System.out.println(channelFuture.getClass()); - Channel channel = channelFuture.sync().channel(); - log.debug("{}", channel); - new Thread(()->{ - Scanner scanner = new Scanner(System.in); - while (true) { - String line = scanner.nextLine(); - if ("q".equals(line)) { - channel.close(); // close 异步操作 1s 之后 -// log.debug("处理关闭之后的操作"); // 不能在这里善后 - break; - } - channel.writeAndFlush(line); - } - }, "input").start(); - - // 获取 CloseFuture 对象, 1) 同步处理关闭, 2) 异步处理关闭 - ChannelFuture closeFuture = channel.closeFuture(); - /*log.debug("waiting close..."); - closeFuture.sync(); - log.debug("处理关闭之后的操作");*/ - System.out.println(closeFuture.getClass()); - closeFuture.addListener((ChannelFutureListener) future -> { - log.debug("处理关闭之后的操作"); - group.shutdownGracefully(); - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java b/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java deleted file mode 100644 index 6edc8ce9..00000000 --- a/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static com.fangpeng.netty.demo.ByteBufTest2.log; - -/** - * 组合buffer - * @author 方鹏 - * @date 2022年01月26日 12:43 上午 - */ -public class CompositeByteBuf { - - public static void main(String[] args) { - ByteBuf buf1 = ByteBufAllocator.DEFAULT.buffer(); - buf1.writeBytes(new byte[]{1, 2, 3, 4, 5}); - - ByteBuf buf2 = ByteBufAllocator.DEFAULT.buffer(); - buf2.writeBytes(new byte[]{6, 7, 8, 9, 10}); - - - /*ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(); - buffer.writeBytes(buf1).writeBytes(buf2); - log(buffer);*/ - - io.netty.buffer.CompositeByteBuf buffer = ByteBufAllocator.DEFAULT.compositeBuffer(); - buffer.addComponents(true, buf1, buf2); - log(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java b/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java deleted file mode 100644 index 601fde8c..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelOutboundHandlerAdapter; -import io.netty.channel.ChannelPromise; -import io.netty.channel.embedded.EmbeddedChannel; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:59 下午 - */ -@Slf4j -public class EmbeddedChannelTest { - - public static void main(String[] args) { - ChannelInboundHandlerAdapter h1 = new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("1"); - super.channelRead(ctx, msg); - } - }; - ChannelInboundHandlerAdapter h2 = new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("2"); - super.channelRead(ctx, msg); - } - }; - ChannelOutboundHandlerAdapter h3 = new ChannelOutboundHandlerAdapter() { - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("3"); - super.write(ctx, msg, promise); - } - }; - ChannelOutboundHandlerAdapter h4 = new ChannelOutboundHandlerAdapter() { - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("4"); - super.write(ctx, msg, promise); - } - }; - EmbeddedChannel channel = new EmbeddedChannel(h1, h2, h3, h4); - // 模拟入站操作 -// channel.writeInbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("hello".getBytes())); - // 模拟出站操作 - channel.writeOutbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("world".getBytes())); - - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java b/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java deleted file mode 100644 index 453d3691..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import lombok.extern.slf4j.Slf4j; - -import java.net.InetSocketAddress; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:16 下午 - */ -@Slf4j -public class EventLoopClient { - - public static void main(String[] args) throws InterruptedException { - // 2. 带有 Future,Promise 的类型都是和异步方法配套使用,用来处理结果 - ChannelFuture channelFuture = new Bootstrap() - .group(new NioEventLoopGroup()) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast(new StringEncoder()); - } - }) - // 1. 连接到服务器 - // 异步非阻塞, main 发起了调用,真正执行 connect 是 nio 线程 - .connect(new InetSocketAddress("localhost", 8080)); // 1s 秒后 - - // 2.1 使用 sync 方法同步处理结果 - /*channelFuture.sync(); // 阻塞住当前线程,直到nio线程连接建立完毕 - Channel channel = channelFuture.channel(); - log.debug("{}", channel); - channel.writeAndFlush("hello, world");*/ - - // 2.2 使用 addListener(回调对象) 方法异步处理结果 - channelFuture.addListener(new ChannelFutureListener() { - @Override - // 在 nio 线程连接建立好之后,会调用 operationComplete - public void operationComplete(ChannelFuture future) throws Exception { - Channel channel = future.channel(); - log.debug("{}", channel); - channel.writeAndFlush("hello, world"); - } - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java b/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java deleted file mode 100644 index 2525da4e..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:14 下午 - */ -@Slf4j -public class EventLoopServer { - - public static void main(String[] args) { - // 细分2:创建一个独立的 EventLoopGroup - EventLoopGroup group = new DefaultEventLoopGroup(); - new ServerBootstrap() - // boss 和 worker - // 细分1:boss 只负责 ServerSocketChannel 上 accept 事件 worker 只负责 socketChannel 上的读写 - .group(new NioEventLoopGroup(), new NioEventLoopGroup(2)) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast("handler1", new ChannelInboundHandlerAdapter() { - @Override // ByteBuf - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - log.debug(buf.toString(Charset.defaultCharset())); - ctx.fireChannelRead(msg); // 让消息传递给下一个handler - } - }); - /*.addLast(group, "handler2", new ChannelInboundHandlerAdapter() { - @Override // ByteBuf - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - log.debug(buf.toString(Charset.defaultCharset())); - } - });*/ - } - }) - .bind(8080); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java b/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java deleted file mode 100644 index 9170faff..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.TimeUnit; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:09 下午 - */ -@Slf4j -public class EventLoopTest { - - public static void main(String[] args) { - // 1. 创建事件循环组 - EventLoopGroup group = new NioEventLoopGroup(2); // io 事件,普通任务,定时任务 -// EventLoopGroup group = new DefaultEventLoopGroup(); // 普通任务,定时任务 - // 2. 获取下一个事件循环对象 - System.out.println(group.next()); - System.out.println(group.next()); - System.out.println(group.next()); - System.out.println(group.next()); - - // 3. 执行普通任务 - /*group.next().execute(() -> { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - log.debug("ok"); - });*/ - - // 4. 执行定时任务 - group.next().scheduleAtFixedRate(() -> { - log.debug("ok"); - }, 0, 1, TimeUnit.SECONDS); - - log.debug("main"); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/HelloClient.java b/src/main/java/com/fangpeng/netty/demo/HelloClient.java deleted file mode 100644 index 23d5b971..00000000 --- a/src/main/java/com/fangpeng/netty/demo/HelloClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; - -import java.net.InetSocketAddress; - -/** - * @author 方鹏 - * @date 2022年01月24日 4:36 下午 - */ -public class HelloClient { - - public static void main(String[] args) throws InterruptedException { - // 1. 启动类 - new Bootstrap() - // 2. 添加 EventLoop - .group(new NioEventLoopGroup()) - // 3. 选择客户端 channel 实现 - .channel(NioSocketChannel.class) - // 4. 添加处理器 - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast(new StringEncoder()); - } - }) - // 5. 连接到服务器 - .connect(new InetSocketAddress("localhost", 8080)) - .sync() // 阻塞方法,直到连接建立 - .channel() - // 6. 向服务器发送数据 - .writeAndFlush("hello, world"); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/HelloServer.java b/src/main/java/com/fangpeng/netty/demo/HelloServer.java deleted file mode 100644 index f521ea36..00000000 --- a/src/main/java/com/fangpeng/netty/demo/HelloServer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月24日 4:31 下午 - */ -public class HelloServer { - - public static void main(String[] args) { - // 1. 启动器,负责组装 netty 组件,启动服务器 - new ServerBootstrap() - // 2. BossEventLoop, WorkerEventLoop(selector,thread), group 组 - .group(new NioEventLoopGroup()) - // 3. 选择 服务器的 ServerSocketChannel 实现 - .channel(NioServerSocketChannel.class) // OIO BIO - // 4. boss 负责处理连接 worker(child) 负责处理读写,决定了 worker(child) 能执行哪些操作(handler) - .childHandler( - // 5. channel 代表和客户端进行数据读写的通道 Initializer 初始化,负责添加别的 handler - new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - // 6. 添加具体 handler - ch.pipeline().addLast(new LoggingHandler()); - ch.pipeline().addLast(new StringDecoder()); // 将 ByteBuf 转换为字符串 - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { // 自定义 handler - @Override // 读事件 - public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception { - System.out.println(msg); // 打印上一步转换好的字符串 - } - }); - } - }) - // 7. 绑定监听端口 - .bind(8080); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/JdkFuture.java b/src/main/java/com/fangpeng/netty/demo/JdkFuture.java deleted file mode 100644 index 3c792520..00000000 --- a/src/main/java/com/fangpeng/netty/demo/JdkFuture.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.netty.demo; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.*; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:11 下午 - */ -@Slf4j -public class JdkFuture { - - public static void main(String[] args) throws ExecutionException, InterruptedException { - // 1. 线程池 - ExecutorService service = Executors.newFixedThreadPool(2); - // 2. 提交任务 - Future future = service.submit(new Callable() { - @Override - public Integer call() throws Exception { - log.debug("执行计算"); - Thread.sleep(1000); - return 50; - } - }); - // 3. 主线程通过 future 来获取结果 - log.debug("等待结果"); - log.debug("结果是 {}", future.get()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyClient.java b/src/main/java/com/fangpeng/netty/demo/NettyClient.java deleted file mode 100644 index d9b20458..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyClient.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import io.netty.util.concurrent.EventExecutorGroup; - -import java.nio.charset.Charset; -import java.util.Date; - -/** - * @author 方鹏 - * @date 2022年01月20日 11:03 下午 - */ -public class NettyClient { - - public static void main(String[] args) throws InterruptedException { - Bootstrap bootstrap = new Bootstrap(); - NioEventLoopGroup group = new NioEventLoopGroup(); - - bootstrap.group(group) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) { - // 指定连接数据读写逻辑 - ch.pipeline().addLast(new FirstClientHandler()); - } - }); - - Channel channel = bootstrap.connect("127.0.0.1", 8000).channel(); - - //while (true) { - // channel.writeAndFlush(new Date() + ": hello world!"); - // Thread.sleep(2000); - //} - } - - private static class FirstClientHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelActive(ChannelHandlerContext ctx) { - System.out.println(new Date() + ": 客户端写出数据"); - - // 1. 获取数据 - ByteBuf buffer = getByteBuf(ctx); - - // 2. 写数据 - ctx.channel().writeAndFlush(buffer); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - ByteBuf byteBuf = (ByteBuf) msg; - - System.out.println(new Date() + ": 客户端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); - } - - private ByteBuf getByteBuf(ChannelHandlerContext ctx) { - // 1. 获取二进制抽象 ByteBuf - ByteBuf buffer = ctx.alloc().buffer(); - - // 2. 准备数据,指定字符串的字符集为 utf-8 - byte[] bytes = "你好,Lemon!".getBytes(Charset.forName("utf-8")); - - // 3. 填充数据到 ByteBuf - buffer.writeBytes(bytes); - - return buffer; - } - - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyFuture.java b/src/main/java/com/fangpeng/netty/demo/NettyFuture.java deleted file mode 100644 index ad602232..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyFuture.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.EventLoop; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:19 下午 - */ -@Slf4j -public class NettyFuture { - - public static void main(String[] args) { - NioEventLoopGroup group = new NioEventLoopGroup(2); - EventLoop eventLoop = group.next(); - - Future future = eventLoop.submit(new Callable() { - @Override - public Integer call() throws Exception { - log.debug("执行计算"); - TimeUnit.SECONDS.sleep(1); - return 70; - } - }); - // log.debug("等待结果"); - // log.debug("结果是 {}", future.get()); - - future.addListener(new GenericFutureListener>() { - @Override - public void operationComplete(Future future) throws Exception { - log.debug("接收结果:{}", future.getNow()); - } - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyPromise.java b/src/main/java/com/fangpeng/netty/demo/NettyPromise.java deleted file mode 100644 index 4da09505..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyPromise.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.EventLoop; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.util.concurrent.DefaultPromise; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutionException; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:24 下午 - */ -@Slf4j -public class NettyPromise { - - public static void main(String[] args) throws ExecutionException, InterruptedException { - // 1. 准备 EventLoop 对象 - EventLoop eventLoop = new NioEventLoopGroup().next(); - // 2. 可以主动创建 promise, 结果容器 - DefaultPromise promise = new DefaultPromise<>(eventLoop); - new Thread(() -> { - // 3. 任意一个线程执行计算,计算完毕后向 promise 填充结果 - log.debug("开始计算..."); - try { - int i = 1 / 0; - Thread.sleep(1000); - promise.setSuccess(80); - } catch (Exception e) { - e.printStackTrace(); - promise.setFailure(e); - } - - }).start(); - // 4. 接收结果的线程 - log.debug("等待结果..."); - log.debug("结果是: {}", promise.get()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyServer.java b/src/main/java/com/fangpeng/netty/demo/NettyServer.java deleted file mode 100644 index 51e46eef..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyServer.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -/** - * @author 方鹏 - * @date 2022年01月20日 10:59 下午 - */ -public class NettyServer { - - public static void main(String[] args) { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - serverBootstrap - .group(boss, worker) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) { - // 指定连接数据读写逻辑 - ch.pipeline().addLast(new FirstServerHandler()); - //ch.pipeline().addLast(new StringDecoder()); - //ch.pipeline().addLast(new SimpleChannelInboundHandler() { - // @Override - // protected void channelRead0(ChannelHandlerContext ctx, String msg) { - // System.out.println(msg); - // } - //}); - } - }); - - bind(serverBootstrap, 8000); - - //serverBootstrap.bind(8000).addListener(new GenericFutureListener>() { - // public void operationComplete(Future future) { - // if (future.isSuccess()) { - // System.out.println("端口绑定成功!"); - // } else { - // System.err.println("端口绑定失败!"); - // } - // } - //}); - } - - private static void bind(final ServerBootstrap serverBootstrap, final int port) { - serverBootstrap.bind(port).addListener(new GenericFutureListener>() { - @Override - public void operationComplete(Future future) { - if (future.isSuccess()) { - System.out.println("端口[" + port + "]绑定成功!"); - } else { - System.err.println("端口[" + port + "]绑定失败!"); - bind(serverBootstrap, port + 1); - } - } - }); - } - - private static class FirstServerHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - ByteBuf byteBuf = (ByteBuf) msg; - - System.out.println(new Date() + ": 服务端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); - - // 回复数据到客户端 - System.out.println(new Date() + ": 服务端写出数据"); - - ByteBuf out = getByteBuf(ctx); - ctx.channel().writeAndFlush(out); - } - - private ByteBuf getByteBuf(ChannelHandlerContext ctx) { - byte[] bytes = "你好,欢迎来到Lemon-CS".getBytes(StandardCharsets.UTF_8); - - ByteBuf byteBuf = ctx.alloc().buffer(); - - byteBuf.writeBytes(bytes); - return byteBuf; - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/PipelineTest.java b/src/main/java/com/fangpeng/netty/demo/PipelineTest.java deleted file mode 100644 index 650e11eb..00000000 --- a/src/main/java/com/fangpeng/netty/demo/PipelineTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:32 下午 - */ -@Slf4j -public class PipelineTest { - - public static void main(String[] args) { - new ServerBootstrap() - .group(new NioEventLoopGroup()) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - // 1. 通过 channel 拿到 pipeline - ChannelPipeline pipeline = ch.pipeline(); - // 2. 添加处理器 head -> h1 -> h2 -> h4 -> h3 -> h5 -> h6 -> tail - pipeline.addLast("h1", new ChannelInboundHandlerAdapter() { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("1"); - super.channelRead(ctx, msg); - } - }); - pipeline.addLast("h2", new ChannelInboundHandlerAdapter(){ - @Override - public void channelRead(ChannelHandlerContext ctx, Object name) throws Exception { - log.debug("2"); - super.channelRead(ctx, name); // 将数据传递给下个 handler,如果不调用,调用链会断开 或者调用 ctx.fireChannelRead(student); - } - }); - - pipeline.addLast("h3", new ChannelInboundHandlerAdapter(){ - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("3"); - ctx.writeAndFlush(ctx.alloc().buffer().writeBytes("server...".getBytes())); -// ch.writeAndFlush(ctx.alloc().buffer().writeBytes("server...".getBytes())); - } - }); - pipeline.addLast("h4", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("4"); - super.write(ctx, msg, promise); - } - }); - pipeline.addLast("h5", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("5"); - super.write(ctx, msg, promise); - } - }); - pipeline.addLast("h6", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("6"); - super.write(ctx, msg, promise); - } - }); - } - }) - .bind(8080); - } - - @Data - @AllArgsConstructor - static class Student { - private String name; - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/SliceTest.java b/src/main/java/com/fangpeng/netty/demo/SliceTest.java deleted file mode 100644 index 7db17d9e..00000000 --- a/src/main/java/com/fangpeng/netty/demo/SliceTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static com.fangpeng.netty.demo.ByteBufTest2.log; - -/** - * @author 方鹏 - * @date 2022年01月26日 12:35 上午 - */ -public class SliceTest { - - public static void main(String[] args) { - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(10); - buf.writeBytes(new byte[]{'a','b','c','d','e','f','g','h','i','j'}); - log(buf); - - // 在切片过程中,没有发生数据复制 - ByteBuf f1 = buf.slice(0, 5); - f1.retain(); - // 'a','b','c','d','e', 'x' - ByteBuf f2 = buf.slice(5, 5); - f2.retain(); - log(f1); - log(f2); - - System.out.println("释放原有 byteBuf 内存"); - buf.release(); - log(f1); - - - f1.release(); - f2.release(); - /*System.out.println("========================"); - f1.setByte(0, 'b'); - log(f1); - log(buf);*/ - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java b/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java deleted file mode 100644 index f53497df..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -/** - * @Description: 用来封装bean标签数据 - * 1. id属性 - * 2. class属性 - * 3. property子标签的数据 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:35 下午 - */ -public class BeanDefinition { - - private String id; - private String className; - - private MutablePropertyValues propertyValues; - - public BeanDefinition() { - propertyValues = new MutablePropertyValues(); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public MutablePropertyValues getPropertyValues() { - return propertyValues; - } - - public void setPropertyValues(MutablePropertyValues propertyValues) { - this.propertyValues = propertyValues; - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java b/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java deleted file mode 100644 index 530b537d..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @author : Lemon-CS - * @description: 用户存储和管理多个PropertyValue对象 - * @date : 2022年02月10日 5:05 下午 - */ -public class MutablePropertyValues implements Iterable { - - //定义list集合对象,用来存储PropertyValue对象 - private final List propertyValueList; - - public MutablePropertyValues() { - this.propertyValueList = new ArrayList<>(); - } - - public MutablePropertyValues(List propertyValueList) { - if (propertyValueList == null) { - this.propertyValueList = new ArrayList<>(); - } else { - this.propertyValueList = propertyValueList; - } - } - - //获取所有的PropertyValue对象,返回以数组的形式 - public PropertyValue[] getPropertyValues() { - //将集合转换为数组并返回 - return propertyValueList.toArray(new PropertyValue[0]); - } - - //根据name属性值获取PropertyValue对象 - public PropertyValue getPropertyValue(String propertyName) { - //遍历集合对象 - for (PropertyValue propertyValue : propertyValueList) { - if (propertyValue.getName().equals(propertyName)) { - return propertyValue; - } - } - return null; - } - - //判断集合是否为空 - public boolean isEmpty() { - return propertyValueList.isEmpty(); - } - - //添加PropertyValue对象 - public MutablePropertyValues addPropertyValue(PropertyValue pv) { - //判断集合中存储的PropertyValue对象是否和传递进行的重复了,如果重复了,进行覆盖 - for (int i = 0; i < propertyValueList.size(); i++) { - //获取集合中每一个PropertyValue对象 - PropertyValue currentPv = propertyValueList.get(i); - - if (currentPv.getName().equals(pv.getName())) { - propertyValueList.set(i, pv); - return this; //目的就是实现链式编程 - } - } - this.propertyValueList.add(pv); - return this; //目的就是实现链式编程 - } - - //判断是否有指定name属性值的对象 - public boolean contains(String propertyName) { - return getPropertyValue(propertyName) != null; - } - - // 获取迭代器对象 - @Override - public Iterator iterator() { - return propertyValueList.iterator(); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java b/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java deleted file mode 100644 index 8c776bbd..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -/** - * @author : Lemon-CS - * @description: 用来封装bean标签下的property标签的属性 - * 1. name属性 - * 2. ref属性 - * 3. value属性: 给基本数据类型及String类型数据赋的值 - * @date : 2022年02月10日 5:02 下午 - */ -public class PropertyValue { - - private String name; - private String ref; - private String value; - - public PropertyValue() { - } - - public PropertyValue(String name, String ref, String value) { - this.name = name; - this.ref = ref; - this.value = value; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getRef() { - return ref; - } - - public void setRef(String ref) { - this.ref = ref; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java deleted file mode 100644 index c5fa2bcf..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory; - -/** - * @Description: IOC容器父接口 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:14 下午 - */ -public interface BeanFactory { - - Object getBean(String name) throws Exception; - - T getBean(String name, Class clazz) throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java deleted file mode 100644 index 4c918007..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -/** - * @Description: 用来解析配置文件的,而该接口只是定义了规范 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:55 下午 - */ -public interface BeanDefinitionReader { - - //获取注册表对象 - BeanDefinitionRegistry getRegistry(); - - //加载配置文件并在注册表中进行注册 - void loadBeanDefinitions(String configLocation) throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java deleted file mode 100644 index 5951de3c..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; - -/** - * @Description: 注册表对象 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:50 下午 - */ -public interface BeanDefinitionRegistry { - - //注册BeanDefinition对象到注册表中 - void registerBeanDefinition(String beanName, BeanDefinition beanDefinition); - - //从注册表中删除指定名称的BeanDefinition对象 - void removeBeanDefinition(String beanName) throws Exception; - - //根据名称从注册表中获取BeanDefinition对象 - BeanDefinition getBeanDefinition(String beanName) throws Exception; - - boolean containsBeanDefinition(String beanName); - - int getBeanDefinitionCount(); - - String[] getBeanDefinitionNames(); - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java deleted file mode 100644 index 3aa42c0e..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Description: 注册表接口的子实现类 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:50 下午 - */ -public class SimpleBeanDefinitionRegistry implements BeanDefinitionRegistry { - - //定义一个容器,用来存储BeanDefinition对象 - private Map beanDefinitionMap = new HashMap<>(); - - @Override - public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) { - beanDefinitionMap.put(beanName, beanDefinition); - } - - @Override - public void removeBeanDefinition(String beanName) throws Exception { - beanDefinitionMap.remove(beanName); - } - - @Override - public BeanDefinition getBeanDefinition(String beanName) throws Exception { - return beanDefinitionMap.get(beanName); - } - - @Override - public boolean containsBeanDefinition(String beanName) { - return beanDefinitionMap.containsKey(beanName); - } - - @Override - public int getBeanDefinitionCount() { - return beanDefinitionMap.size(); - } - - @Override - public String[] getBeanDefinitionNames() { - return beanDefinitionMap.keySet().toArray(new String[0]); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java deleted file mode 100644 index bce38342..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.xml; - -import com.fangpeng.spring.framework.beans.BeanDefinition; -import com.fangpeng.spring.framework.beans.MutablePropertyValues; -import com.fangpeng.spring.framework.beans.PropertyValue; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionReader; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.beans.factory.support.SimpleBeanDefinitionRegistry; -import org.dom4j.Document; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.InputStream; -import java.util.List; - -/** - * @Description: 针对xml配置文件进行解析的类 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:56 下午 - */ -public class XmlBeanDefinitionReader implements BeanDefinitionReader { - - //声明注册表对象 - private BeanDefinitionRegistry registry; - - public XmlBeanDefinitionReader() { - registry = new SimpleBeanDefinitionRegistry(); - } - - @Override - public BeanDefinitionRegistry getRegistry() { - return registry; - } - - @Override - public void loadBeanDefinitions(String configLocation) throws Exception { - //使用dom4j进行xml配置文件的解析 - SAXReader reader = new SAXReader(); - //获取类路径下的配置文件 - InputStream is = XmlBeanDefinitionReader.class.getClassLoader().getResourceAsStream(configLocation); - Document document = reader.read(is); - //根据Document对象获取根标签对象 (beans) - Element rootElement = document.getRootElement(); - //获取根标签下所有的bean标签对象 - List beanElements = rootElement.elements("bean"); - //遍历集合 - for (Element beanElement : beanElements) { - //获取id属性 - String id = beanElement.attributeValue("id"); - //获取id属性 - String className = beanElement.attributeValue("class"); - - //将id属性和class属性封装到BeanDefinition对象中 - //1. 创建BeanDefinition - BeanDefinition beanDefinition = new BeanDefinition(); - beanDefinition.setId(id); - beanDefinition.setClassName(className); - - //2. 创建MutablePropertyValues对象 - MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(); - - //3. 获取bean标签下所有的property标签对象 - List propertyElements = beanElement.elements("property"); - - for (Element propertyElement : propertyElements) { - String name = propertyElement.attributeValue("name"); - String ref = propertyElement.attributeValue("ref"); - String value = propertyElement.attributeValue("value"); - PropertyValue propertyValue = new PropertyValue(name, ref, value); - mutablePropertyValues.addPropertyValue(propertyValue); - } - - //4. 将mutablePropertyValues对象封装到BeanDefinition对象中 - beanDefinition.setPropertyValues(mutablePropertyValues); - - //5. 将beanDefinition对象注册到注册表中 - registry.registerBeanDefinition(id, beanDefinition); - } - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java deleted file mode 100644 index 238a2c17..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.spring.framework.context; - -import com.fangpeng.spring.framework.beans.factory.BeanFactory; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:14 下午 - */ -public interface ApplicationContext extends BeanFactory { - - void refresh() throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java deleted file mode 100644 index e6c102e9..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.fangpeng.spring.framework.context.support; - -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionReader; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.context.ApplicationContext; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @Description: ApplicationContext接口的子实现类,用于立即加载 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:16 下午 - */ -public abstract class AbstractApplicationContext implements ApplicationContext { - - //声明解析器变量 - protected BeanDefinitionReader beanDefinitionReader; - - //定义用于存储bean对象的map容器 - protected Map singletonMap = new HashMap<>(); - - //声明配置文件路径的变量 - protected String configLocation; - - - @Override - public void refresh() throws Exception { - //加载BeanDefinition对象 - beanDefinitionReader.loadBeanDefinitions(configLocation); - //初始化bean - finishBeanInitialization(); - } - - //bean的初始化 - private void finishBeanInitialization() throws Exception { - //获取注册表对象 - BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry(); - - //获取BeanDefinition对象 - String[] beanNames = registry.getBeanDefinitionNames(); - for (String beanName : beanNames) { - //进行bean的初始化 - getBean(beanName); - } - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java deleted file mode 100644 index f6e25340..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.fangpeng.spring.framework.context.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; -import com.fangpeng.spring.framework.beans.MutablePropertyValues; -import com.fangpeng.spring.framework.beans.PropertyValue; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.beans.factory.xml.XmlBeanDefinitionReader; -import com.fangpeng.spring.framework.utils.StringUtils; - -import java.lang.reflect.Method; -import java.rmi.registry.Registry; - -/** - * @Description: IOC容器具体的子实现类 - * 用于加载类路径下的xml格式的配置文件 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:32 下午 - */ -public class ClassPathXmlApplicationContext extends AbstractApplicationContext { - - public ClassPathXmlApplicationContext(String configLocation) { - this.configLocation = configLocation; - //构建解析器对象 - beanDefinitionReader = new XmlBeanDefinitionReader(); - - try { - this.refresh(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - //根据bean对象的名称获取bean对象 - @Override - public Object getBean(String name) throws Exception { - //判断对象容器中是否包含指定名称的bean对象,如果包含,直接返回即可,如果不包含,需要自行创建 - Object obj = singletonMap.get(name); - if (obj != null) { - return obj; - } - - //获取BeanDefinition对象 - BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry(); - BeanDefinition beanDefinition = registry.getBeanDefinition(name); - - //获取bean信息中的className - String className = beanDefinition.getClassName(); - - //通过反射创建对象 - Class clazz = Class.forName(className); - Object beanObj = clazz.newInstance(); - - //进行依赖注入操作 - MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); - for (PropertyValue propertyValue : propertyValues) { - //获取name属性值 - String propertyName = propertyValue.getName(); - //获取value属性 - String value = propertyValue.getValue(); - //获取ref属性 - String ref = propertyValue.getRef(); - - if (ref != null && !"".equals(ref)) { - //获取依赖的bean对象 - Object bean = getBean(ref); - //拼接方法名 - String methodName = StringUtils.getSetterMethodByFieldName(propertyName); - //获取所有的方法对象 - Method[] methods = clazz.getMethods(); - for (Method method : methods) { - if (method.getName().equals(methodName)) { - method.invoke(beanObj, bean); - } - } - } - - if (value != null && !"".equals(value)) { - //拼接方法名 - String methodName = StringUtils.getSetterMethodByFieldName(propertyName); - //获取method对象 - Method method = clazz.getMethod(methodName, String.class); - method.invoke(beanObj, value); - } - } - - //在返回beanObj对象之前,将该对象存储到map容器中 - singletonMap.put(name, beanObj); - - return beanObj; - } - - @Override - public T getBean(String name, Class clazz) throws Exception { - Object bean = getBean(name); - if(bean == null) { - return null; - } - return clazz.cast(bean); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java b/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java deleted file mode 100644 index 67b49665..00000000 --- a/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.spring.framework.utils; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:44 下午 - */ -public class StringUtils { - - private StringUtils() { - - } - - // userDao ==> setUserDao - public static String getSetterMethodByFieldName(String fieldName) { - String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); - return methodName; - } - -} diff --git a/src/main/java/com/fangpeng/test/TestA.java b/src/main/java/com/fangpeng/test/TestA.java deleted file mode 100644 index ccd40b29..00000000 --- a/src/main/java/com/fangpeng/test/TestA.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.test; - -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月11日 10:38 下午 - */ -public class TestA { - -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java b/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java deleted file mode 100644 index 70146a5c..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:07 上午 - */ - -import com.dangdang.ddframe.job.api.ShardingContext; -import com.dangdang.ddframe.job.api.simple.SimpleJob; - -import java.util.List; -import java.util.Map; - -/** - * ElasticJobLite定时任务业务逻辑处理类 - */ -public class ArchivieJob implements SimpleJob { - - /** - * 需求:resume表中未归档的数据归档到resume_bak表中,每次归档1条记录 - * execute方法中写我们的业务逻辑(execute方法每次定时任务执行都会执行一次) - * @param shardingContext - */ - @Override - public void execute(ShardingContext shardingContext) { - int shardingItem = shardingContext.getShardingItem(); - System.out.println("=====>>>>当前分片:" + shardingItem); - - // 获取分片参数 - String shardingParameter = shardingContext.getShardingParameter(); // 0=bachelor,1=master,2=doctor - - - // 1 从resume表中查询出1条记录(未归档) - String selectSql = "select * from resume where state='未归档' and education='"+ shardingParameter +"' limit 1"; - List> list = JdbcUtil.executeQuery(selectSql); - if(list == null || list.size() ==0 ) { - System.out.println("数据已经处理完毕!!!!!!"); - return; - } - // 2 "未归档"更改为"已归档" - Map stringObjectMap = list.get(0); - long id = (long) stringObjectMap.get("id"); - String name = (String) stringObjectMap.get("name"); - String education = (String) stringObjectMap.get("education"); - - System.out.println("=======>>>>id:" + id + " name:" + name + " education:" + education); - - String updateSql = "update resume set state='已归档' where id=?"; - JdbcUtil.executeUpdate(updateSql,id); - - // 3 归档这条记录,把这条记录插入到resume_bak表 - String insertSql = "insert into resume_bak select * from resume where id=?"; - JdbcUtil.executeUpdate(insertSql,id); - } -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java b/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java deleted file mode 100644 index 5f50350e..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import com.dangdang.ddframe.job.api.ShardingContext; -import com.dangdang.ddframe.job.api.simple.SimpleJob; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:08 上午 - */ -public class DemoJob implements SimpleJob { - @Override - public void execute(ShardingContext shardingContext) { - System.out.println("elasticJob -----> 测试任务 "); - } -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java b/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java deleted file mode 100644 index 662ac37a..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import com.dangdang.ddframe.job.config.JobCoreConfiguration; -import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; -import com.dangdang.ddframe.job.lite.api.JobScheduler; -import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration; -import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter; -import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration; -import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:08 上午 - */ -public class ElasticJobMain { - - public static void main(String[] args) { - // 配置分布式协调服务(注册中心)Zookeeper - ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181", "test-elastic-job"); - CoordinatorRegistryCenter coordinatorRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration); - coordinatorRegistryCenter.init(); - - // 配置任务(时间事件、定时任务业务逻辑、调度器) - JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration - .newBuilder("demo-job", "*/2 * * * * ?", 3) - .shardingItemParameters("0=bachelor,1=master,2=doctor").build(); - SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, DemoJob.class.getName()); - JobScheduler jobScheduler = new JobScheduler(coordinatorRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build()); - jobScheduler.init(); - } - -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java b/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java deleted file mode 100644 index ad124c16..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import java.sql.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:06 上午 - */ -public class JdbcUtil { - //url - private static String url = "jdbc:mysql://localhost:3306/job?characterEncoding=utf8&useSSL=false"; - //user - private static String user = "root"; - //password - private static String password = "123456"; - //驱动程序类 - private static String driver = "com.mysql.jdbc.Driver"; - - static { - try { - Class.forName(driver); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - public static Connection getConnection() { - - try { - return DriverManager.getConnection(url, user, password); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - - } - - public static void close(ResultSet rs, PreparedStatement ps, Connection con) { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (ps != null) { - try { - ps.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (con != null) { - try { - con.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - } - } - } - - - /*** - * DML操作(增删改) - * 1.获取连接数据库对象 - * 2.预处理 - * 3.执行更新操作 - * @param sql - * @param obj - */ - //调用者只需传入一个sql语句,和一个Object数组。该数组存储的是SQL语句中的占位符 - public static void executeUpdate(String sql,Object...obj) { - Connection con = getConnection();//调用getConnection()方法连接数据库 - PreparedStatement ps = null; - try { - ps = con.prepareStatement(sql);//预处理 - for (int i = 0; i < obj.length; i++) {//预处理声明占位符 - ps.setObject(i + 1, obj[i]); - } - ps.executeUpdate();//执行更新操作 - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - close(null, ps, con);//调用close()方法关闭资源 - } - } - - - - /*** - * DQL查询 - * Result获取数据集 - * - * @param sql - * @param obj - * @return - */ - public static List> executeQuery(String sql, Object...obj) { - Connection con = getConnection(); - ResultSet rs = null; - PreparedStatement ps = null; - try { - ps = con.prepareStatement(sql); - for (int i = 0; i < obj.length; i++) { - ps.setObject(i + 1, obj[i]); - } - rs = ps.executeQuery(); - //new 一个空的list集合用来存放查询结果 - List> list = new ArrayList<>(); - //获取结果集的列数 - int count = rs.getMetaData().getColumnCount(); - //对结果集遍历每一条数据是一个Map集合,列是k,值是v - while (rs.next()) { - //一个空的map集合,用来存放每一行数据 - Map map = new HashMap(); - for (int i = 0; i < count; i++) { - Object ob = rs.getObject(i + 1);//获取值 - String key = rs.getMetaData().getColumnName(i + 1);//获取k即列名 - map.put(key, ob); - } - list.add(map); - } - return list; - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - - close(rs, ps, con); - } - - return null; - } -} diff --git a/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java b/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java deleted file mode 100644 index 6e443a62..00000000 --- a/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.timejob.quartz; - -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 11:29 下午 - */ -public class DemoJob implements Job { - @Override - public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - System.out.println("我是一个定时任务执行逻辑"); - } -} diff --git a/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java b/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java deleted file mode 100644 index ba9f23f0..00000000 --- a/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.fangpeng.timejob.quartz; - -import org.quartz.*; -import org.quartz.impl.StdSchedulerFactory; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 11:24 下午 - */ -public class QuartzMan { - - // 1、创建任务调度器(好比公交调度站) - public static Scheduler createScheduler() throws SchedulerException { - SchedulerFactory schedulerFactory = new StdSchedulerFactory(); - Scheduler scheduler = schedulerFactory.getScheduler(); - return scheduler; - } - - - // 2、创建一个任务(好比某一个公交车的出行) - public static JobDetail createJob() { - JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class); // 自定义任务类 - jobBuilder.withIdentity("jobName","myJob"); - JobDetail jobDetail = jobBuilder.build(); - return jobDetail; - } - - /** - * 3、创建作业任务时间触发器(类似于公交车出车时间表) - * cron表达式由七个位置组成,空格分隔 - * 1、Seconds(秒) 0~59 - * 2、Minutes(分) 0~59 - * 3、Hours(小时) 0~23 - * 4、Day of Month(天)1~31,注意有的月份不足31天 - * 5、Month(月) 0~11,或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC - * 6、Day of Week(周) 1~7,1=SUN或者 SUN,MON,TUE,WEB,THU,FRI,SAT - * 7、Year(年)1970~2099 可选项 - *示例: - * 0 0 11 * * ? 每天的11点触发执行一次 - * 0 30 10 1 * ? 每月1号上午10点半触发执行一次 - */ - public static Trigger createTrigger() { - // 创建时间触发器 - CronTrigger cronTrigger = TriggerBuilder.newTrigger() - .withIdentity("triggerName","myTrigger") - .startNow() - .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")).build(); - return cronTrigger; - } - - /** - * main函数中开启定时任务 - * @param args - */ - public static void main(String[] args) throws SchedulerException { - // 1、创建任务调度器(好比公交调度站) - Scheduler scheduler = QuartzMan.createScheduler(); - // 2、创建一个任务(好比某一个公交车的出行) - JobDetail job = QuartzMan.createJob(); - // 3、创建任务的时间触发器(好比这个公交车的出行时间表) - Trigger trigger = QuartzMan.createTrigger(); - - // 4、使用任务调度器根据时间触发器执行我们的任务 - scheduler.scheduleJob(job, trigger); - scheduler.start(); - } - -} diff --git a/src/main/resources/bean.properties b/src/main/resources/bean.properties deleted file mode 100644 index 092aa6df..00000000 --- a/src/main/resources/bean.properties +++ /dev/null @@ -1,2 +0,0 @@ -american=com.fangpeng.design.pattern.factory.config_factory.AmericanCoffee -latte=com.fangpeng.design.pattern.factory.config_factory.LatteCoffee \ No newline at end of file diff --git a/src/main/resources/images/bio-chatroom-sequence-diagram.png b/src/main/resources/images/bio-chatroom-sequence-diagram.png deleted file mode 100644 index 48c08dfc..00000000 Binary files a/src/main/resources/images/bio-chatroom-sequence-diagram.png and /dev/null differ diff --git a/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java b/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java deleted file mode 100644 index 5be4d855..00000000 --- a/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.netty.chat; - -import com.fangpeng.netty.chat.message.LoginRequestMessage; -import com.fangpeng.netty.chat.protocol.MessageCodec; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.embedded.EmbeddedChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:36 下午 - */ -public class TestMessageCodec { - - public static void main(String[] args) throws Exception { - EmbeddedChannel channel = new EmbeddedChannel( - new LoggingHandler(), - new LengthFieldBasedFrameDecoder( - 1024, 12, 4, 0, 0), - new MessageCodec() - ); - // encode - LoginRequestMessage message = new LoginRequestMessage("zhangsan", "123", "张三"); -// channel.writeOutbound(message); - // decode - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(); - new MessageCodec().encode(null, message, buf); - - ByteBuf s1 = buf.slice(0, 100); - ByteBuf s2 = buf.slice(100, buf.readableBytes() - 100); - s1.retain(); // 引用计数 2 - channel.writeInbound(s1); // release 1 - channel.writeInbound(s2); - } - -} diff --git a/target/classes/bean.properties b/target/classes/bean.properties deleted file mode 100644 index 092aa6df..00000000 --- a/target/classes/bean.properties +++ /dev/null @@ -1,2 +0,0 @@ -american=com.fangpeng.design.pattern.factory.config_factory.AmericanCoffee -latte=com.fangpeng.design.pattern.factory.config_factory.LatteCoffee \ No newline at end of file diff --git a/target/classes/images/bio-chatroom-sequence-diagram.png b/target/classes/images/bio-chatroom-sequence-diagram.png deleted file mode 100644 index 48c08dfc..00000000 Binary files a/target/classes/images/bio-chatroom-sequence-diagram.png and /dev/null differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties deleted file mode 100644 index 7151291e..00000000 --- a/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Jan 20 22:58:41 CST 2022 -version=1.0-SNAPSHOT -groupId=com.fangpeng -artifactId=study diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index a2a288a0..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -com/fangpeng/io/nio/demo/NIOServer.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index c8c0d9d4..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,22 +0,0 @@ -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/IOClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/demo/Server.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/demo/Client.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/Client.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/IOServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/Server.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29b..00000000