├── .gitignore
├── LICENSE.txt
├── README.md
├── download-demo
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── zhengxl
│ │ │ └── downloaddemo
│ │ │ ├── DownloadDemoApplication.java
│ │ │ ├── controller
│ │ │ ├── DownloadController.java
│ │ │ └── UploadController.java
│ │ │ ├── repository
│ │ │ └── FileRepository.java
│ │ │ └── service
│ │ │ ├── FileService.java
│ │ │ └── impl
│ │ │ └── FileServiceImpl.java
│ └── resources
│ │ ├── application.yml
│ │ └── templates
│ │ ├── error.html
│ │ ├── index.html
│ │ └── upload-success.html
│ └── test
│ └── java
│ └── com
│ └── zhengxl
│ └── downloaddemo
│ └── DownloadDemoApplicationTests.java
├── error-handle-demo
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── zhengxl
│ │ │ └── errorhandledemo
│ │ │ ├── ErrorHandleDemoApplication.java
│ │ │ └── controller
│ │ │ ├── CustomErrorController.java
│ │ │ └── HelloWorldController.java
│ └── resources
│ │ ├── application.yml
│ │ └── templates
│ │ ├── error.html
│ │ ├── hello.html
│ │ ├── my401.html
│ │ ├── my404.html
│ │ └── my500.html
│ └── test
│ └── java
│ └── com
│ └── zhengxl
│ └── errorhandledemo
│ └── ErrorHandleDemoApplicationTests.java
├── filter-demo
├── .idea
│ ├── $CACHE_FILE$
│ ├── $PRODUCT_WORKSPACE_FILE$
│ ├── .gitignore
│ ├── compiler.xml
│ ├── encodings.xml
│ ├── inspectionProfiles
│ │ └── Project_Default.xml
│ ├── libraries
│ │ ├── Maven__ch_qos_logback_logback_classic_1_2_3.xml
│ │ ├── Maven__ch_qos_logback_logback_core_1_2_3.xml
│ │ ├── Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml
│ │ ├── Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml
│ │ ├── Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml
│ │ ├── Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml
│ │ ├── Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml
│ │ ├── Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml
│ │ ├── Maven__com_jayway_jsonpath_json_path_2_4_0.xml
│ │ ├── Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
│ │ ├── Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml
│ │ ├── Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml
│ │ ├── Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml
│ │ ├── Maven__net_bytebuddy_byte_buddy_1_10_11.xml
│ │ ├── Maven__net_bytebuddy_byte_buddy_agent_1_10_11.xml
│ │ ├── Maven__net_minidev_accessors_smart_1_2.xml
│ │ ├── Maven__net_minidev_json_smart_2_3.xml
│ │ ├── Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml
│ │ ├── Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml
│ │ ├── Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_36.xml
│ │ ├── Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_36.xml
│ │ ├── Maven__org_apiguardian_apiguardian_api_1_1_0.xml
│ │ ├── Maven__org_assertj_assertj_core_3_16_1.xml
│ │ ├── Maven__org_glassfish_jakarta_el_3_0_3.xml
│ │ ├── Maven__org_hamcrest_hamcrest_2_2.xml
│ │ ├── Maven__org_junit_jupiter_junit_jupiter_5_6_2.xml
│ │ ├── Maven__org_junit_jupiter_junit_jupiter_api_5_6_2.xml
│ │ ├── Maven__org_junit_jupiter_junit_jupiter_engine_5_6_2.xml
│ │ ├── Maven__org_junit_jupiter_junit_jupiter_params_5_6_2.xml
│ │ ├── Maven__org_junit_platform_junit_platform_commons_1_6_2.xml
│ │ ├── Maven__org_junit_platform_junit_platform_engine_1_6_2.xml
│ │ ├── Maven__org_mockito_mockito_core_3_3_3.xml
│ │ ├── Maven__org_mockito_mockito_junit_jupiter_3_3_3.xml
│ │ ├── Maven__org_objenesis_objenesis_2_6.xml
│ │ ├── Maven__org_opentest4j_opentest4j_1_2_0.xml
│ │ ├── Maven__org_ow2_asm_asm_5_0_4.xml
│ │ ├── Maven__org_skyscreamer_jsonassert_1_5_0.xml
│ │ ├── Maven__org_slf4j_jul_to_slf4j_1_7_30.xml
│ │ ├── Maven__org_slf4j_slf4j_api_1_7_30.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_json_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_logging_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_test_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_starter_web_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_test_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_3_1_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_aop_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_beans_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_context_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_core_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_expression_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_jcl_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_test_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_web_5_2_7_RELEASE.xml
│ │ ├── Maven__org_springframework_spring_webmvc_5_2_7_RELEASE.xml
│ │ ├── Maven__org_xmlunit_xmlunit_core_2_7_0.xml
│ │ └── Maven__org_yaml_snakeyaml_1_26.xml
│ ├── misc.xml
│ ├── modules.xml
│ └── vcs.xml
├── filter-demo.iml
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── zhengxl
│ │ │ │ └── filterdemo
│ │ │ │ ├── FilterDemoApplication.java
│ │ │ │ ├── config
│ │ │ │ └── FilterConfig.java
│ │ │ │ ├── controller
│ │ │ │ └── HelloWorld.java
│ │ │ │ └── filter
│ │ │ │ ├── MyAnotherFilter.java
│ │ │ │ └── MyFilter.java
│ │ └── resources
│ │ │ └── application.properties
│ └── test
│ │ └── java
│ │ └── com
│ │ └── zhengxl
│ │ └── filterdemo
│ │ └── FilterDemoApplicationTests.java
└── target
│ ├── classes
│ ├── application.properties
│ └── com
│ │ └── zhengxl
│ │ └── filterdemo
│ │ ├── FilterDemoApplication.class
│ │ ├── controller
│ │ └── HelloWorld.class
│ │ └── filter
│ │ ├── MyAnotherFilter.class
│ │ └── MyFilter.class
│ └── test-classes
│ └── com
│ └── zhengxl
│ └── filterdemo
│ └── FilterDemoApplicationTests.class
├── freemarker
├── Freemarker.xmind
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── zhengxl
│ │ └── freemarker
│ │ ├── FreemarkerApplication.java
│ │ ├── config
│ │ └── FreemarkerConfig.java
│ │ ├── controller
│ │ ├── IndexController.java
│ │ ├── StaticMethodController.java
│ │ └── UserDefinedDirectiveController.java
│ │ ├── directive
│ │ └── MyDirective.java
│ │ ├── entity
│ │ └── User.java
│ │ ├── properties
│ │ └── FreeMarkerProperties.java
│ │ ├── service
│ │ ├── UserService.java
│ │ └── impl
│ │ │ └── UserServiceImpl.java
│ │ └── tools
│ │ ├── AnotherStaticTool.java
│ │ └── UserStaticTool.java
│ └── resources
│ ├── META-INF
│ └── additional-spring-configuration-metadata.json
│ ├── application.yml
│ └── templates
│ ├── built-ins.ftlh
│ ├── directive.ftlh
│ ├── footer.ftlh
│ ├── index.ftlh
│ ├── inner-method.ftlh
│ ├── lib
│ ├── bbb.ftlh
│ ├── common.ftlh
│ └── example.ftlh
│ └── static-method-view.ftlh
├── interceptor-demo
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── zhengxl
│ └── interceptordemo
│ ├── InterceptorDemoApplication.java
│ ├── config
│ └── WebMVCConfig.java
│ ├── controller
│ └── HelloWorldController.java
│ └── interceptor
│ ├── AnotherInterceptor.java
│ └── MyInterceptor.java
├── mybatis
├── dynamic-multiple-data-sources
│ ├── .gitignore
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── top
│ │ │ │ └── javahelper
│ │ │ │ └── dynamicmultipledatasources
│ │ │ │ ├── DynamicMultipleDataSourcesApplication.java
│ │ │ │ ├── aspect
│ │ │ │ └── DataSourceAspect.java
│ │ │ │ ├── common
│ │ │ │ ├── RoutingDataSource.java
│ │ │ │ ├── RoutingDataSourceContext.java
│ │ │ │ └── WithDataSource.java
│ │ │ │ ├── config
│ │ │ │ ├── H2DataBaseInit.java
│ │ │ │ └── RoutingDataSourcesConfig.java
│ │ │ │ ├── controller
│ │ │ │ └── UserController.java
│ │ │ │ ├── mapper
│ │ │ │ └── UserMapper.java
│ │ │ │ ├── model
│ │ │ │ └── User.java
│ │ │ │ └── service
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl
│ │ │ │ └── UserServiceImpl.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ └── generatorConfig.xml
│ │ └── test
│ │ └── java
│ │ └── top
│ │ └── javahelper
│ │ └── dynamicmultipledatasources
│ │ ├── DynamicMultipleDataSourcesApplicationTests.java
│ │ ├── MBG.java
│ │ └── mapper
│ │ └── UserMapperTest.java
├── multiple-data-sources
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── top
│ │ │ │ └── javahelper
│ │ │ │ └── multipledatasources
│ │ │ │ ├── MultipleDataSourcesApplication.java
│ │ │ │ ├── config
│ │ │ │ ├── FirstDataSourceConfig.java
│ │ │ │ ├── InitData.java
│ │ │ │ └── SecondDataSourceConfig.java
│ │ │ │ ├── controller
│ │ │ │ └── UserController.java
│ │ │ │ ├── entity
│ │ │ │ └── User.java
│ │ │ │ ├── mapper
│ │ │ │ ├── first
│ │ │ │ │ └── FirstUserMapper.java
│ │ │ │ └── second
│ │ │ │ │ └── SecondUserMapper.java
│ │ │ │ └── service
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl
│ │ │ │ └── UserServiceImpl.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── db1.user.sql
│ │ │ ├── db2.user.sql
│ │ │ └── mybatis
│ │ │ ├── first
│ │ │ └── FirstUserMapper.xml
│ │ │ └── second
│ │ │ └── SecondUserMapper.xml
│ │ └── test
│ │ └── java
│ │ └── top
│ │ └── javahelper
│ │ └── multipledatasources
│ │ ├── MultipleDataSourcesApplicationTests.java
│ │ └── mapper
│ │ └── UserMapperTest.java
├── mybatis-cache
│ ├── .gitignore
│ ├── .mvn
│ │ └── wrapper
│ │ │ ├── MavenWrapperDownloader.java
│ │ │ ├── maven-wrapper.jar
│ │ │ └── maven-wrapper.properties
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── zhengxl
│ │ │ │ └── mybatiscache
│ │ │ │ ├── MybatiscacheApplication.java
│ │ │ │ ├── controller
│ │ │ │ └── Hello.java
│ │ │ │ ├── dto
│ │ │ │ └── UserDTO.java
│ │ │ │ ├── entity
│ │ │ │ ├── User.java
│ │ │ │ └── UserOrder.java
│ │ │ │ └── mapper
│ │ │ │ ├── UserMapper.java
│ │ │ │ └── UserOrderMapper.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── data.sql
│ │ │ ├── mybatis
│ │ │ ├── userMapper.xml
│ │ │ └── userOrderMapper.xml
│ │ │ └── schema.sql
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── zhengxl
│ │ └── mybatiscache
│ │ ├── MybatiscacheApplicationTests.java
│ │ ├── UserOrderTest.java
│ │ └── UserTest.java
└── mybatis-sample
│ ├── pom.xml
│ ├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── zhengxl
│ │ │ │ └── mybatissample
│ │ │ │ ├── MybatisSampleApplication.java
│ │ │ │ ├── config
│ │ │ │ └── H2DataBaseInit.java
│ │ │ │ ├── controller
│ │ │ │ └── MyController.java
│ │ │ │ ├── mapper
│ │ │ │ └── UserMapper.java
│ │ │ │ ├── model
│ │ │ │ └── User.java
│ │ │ │ └── service
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl
│ │ │ │ └── UserServiceImpl.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── generatorConfig.xml
│ │ │ └── mybatis
│ │ │ └── UserMapper.xml
│ └── test
│ │ └── java
│ │ └── com
│ │ └── zhengxl
│ │ └── mybatissample
│ │ ├── Mbg.java
│ │ └── MybatisSampleApplicationTests.java
│ └── target
│ └── classes
│ ├── application.yml
│ └── generatorConfig.xml
├── redis-demo
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── zhengxl
│ │ │ └── redisdemo
│ │ │ ├── config
│ │ │ └── RedisConfig.java
│ │ │ ├── controller
│ │ │ └── UserController.java
│ │ │ ├── core
│ │ │ └── ObjectRedisTemplate.java
│ │ │ └── entity
│ │ │ └── User.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── zhengxl
│ └── redisdemo
│ └── redis
│ └── RedisTest.java
├── redis
└── redis-transaction
│ ├── .gitignore
│ ├── .mvn
│ └── wrapper
│ │ ├── MavenWrapperDownloader.java
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── zhengxl
│ │ │ └── redistransaction
│ │ │ ├── RedisTransactionApplication.java
│ │ │ ├── config
│ │ │ └── RedisConfig.java
│ │ │ ├── controller
│ │ │ └── RedisController.java
│ │ │ └── service
│ │ │ └── RedisService.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── zhengxl
│ └── redistransaction
│ └── RedisTransactionApplicationTests.java
├── slf4j
└── logtest
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── zhengxl
│ │ │ └── App.java
│ └── resources
│ │ └── log4j.properties
│ └── test
│ └── java
│ └── zhengxl
│ └── AppTest.java
├── thymeleaf-demo
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── zhengxl
│ │ └── thymeleafdemo
│ │ ├── ThymeleafDemoApplication.java
│ │ ├── controller
│ │ ├── DownloadController.java
│ │ └── UploadController.java
│ │ ├── repository
│ │ └── FileRepository.java
│ │ ├── service
│ │ ├── FileService.java
│ │ └── impl
│ │ │ ├── FileServiceImpl.java
│ │ │ └── MyService.java
│ │ └── utils
│ │ └── HttpUtils.java
│ └── resources
│ ├── application.yml
│ └── templates
│ ├── error.html
│ ├── index.html
│ └── upload-success.html
├── transactional
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── MavenWrapperDownloader.java
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── javahelper
│ │ │ └── top
│ │ │ └── transactional
│ │ │ ├── TransactionalApplication.java
│ │ │ ├── controller
│ │ │ └── UserController.java
│ │ │ ├── exception
│ │ │ └── RollBackException.java
│ │ │ └── service
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ └── UserServiceImpl.java
│ └── resources
│ │ ├── application.yml
│ │ └── schema.sql
│ └── test
│ └── java
│ └── com
│ └── javahelper
│ └── top
│ └── transactional
│ └── TransactionalApplicationTests.java
├── unittest-demo
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── zhengxl
│ │ │ └── unittestdemo
│ │ │ ├── controller
│ │ │ └── UserController.java
│ │ │ ├── utils
│ │ │ └── MathUtils.java
│ │ │ └── vo
│ │ │ └── UserVO.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── zhengxl
│ └── unittestdemo
│ ├── controller
│ └── UserControllerTest.java
│ └── utils
│ └── MathUtilsTest.java
└── validation-demo
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── zhengxl
│ │ └── validationdemo
│ │ ├── ValidationDemoApplication.java
│ │ ├── advice
│ │ └── GlobalControllerAdvice.java
│ │ ├── common
│ │ └── ResultInfo.java
│ │ ├── controller
│ │ └── UserController.java
│ │ ├── validator
│ │ ├── annotation
│ │ │ └── HaveNoBlank.java
│ │ ├── constraint
│ │ │ └── HaveNoBlankValidator.java
│ │ └── validategroup
│ │ │ └── Update.java
│ │ └── vo
│ │ ├── OrderVO.java
│ │ └── UserVO.java
└── resources
│ └── application.yml
└── test
└── java
└── com
└── zhengxl
└── validationdemo
├── UserControllerTest.java
└── ValidationDemoApplicationTests.java
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | *.iml
3 |
4 | # Compiled class file
5 | *.class
6 |
7 | # Log file
8 | *.log
9 |
10 | # BlueJ files
11 | *.ctxt
12 |
13 | # Mobile Tools for Java (J2ME)
14 | .mtj.tmp/
15 |
16 | # Package Files #
17 | *.jar
18 | *.war
19 | *.nar
20 | *.ear
21 | *.zip
22 | *.tar.gz
23 | *.rar
24 |
25 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
26 | hs_err_pid*
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 zhengxl5566
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/download-demo/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.3.2.RELEASE
9 |
10 |
11 | com.zhengxl
12 | download-demo
13 | 0.0.1-SNAPSHOT
14 | download-demo
15 | Demo project for Spring Boot
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-thymeleaf
25 |
26 |
27 | org.springframework.boot
28 | spring-boot-starter-validation
29 |
30 |
31 | org.springframework.boot
32 | spring-boot-starter-web
33 |
34 |
35 |
36 | commons-io
37 | commons-io
38 | 2.7
39 |
40 |
41 |
42 |
43 | org.springframework.boot
44 | spring-boot-starter-test
45 | test
46 |
47 |
48 | org.junit.vintage
49 | junit-vintage-engine
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | org.springframework.boot
59 | spring-boot-maven-plugin
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/download-demo/src/main/java/com/zhengxl/downloaddemo/DownloadDemoApplication.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.downloaddemo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class DownloadDemoApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(DownloadDemoApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/download-demo/src/main/java/com/zhengxl/downloaddemo/service/FileService.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.downloaddemo.service;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 |
6 | /**
7 | * @description:
8 | * @projectName:thymeleaf-demo
9 | * @see:com.zhengxl.thymeleafdemo.service
10 | * @author:郑晓龙
11 | * @createTime:2020/8/8 10:40
12 | * @version:1.0
13 | */
14 | public interface FileService {
15 |
16 | /**
17 | * @param clientFileName 客户端上传的文件名
18 | * @param inputStream 输入流
19 | * @return java.lang.String 服务端保存的文件名
20 | * @description
21 | * @author 郑晓龙
22 | * @createTime 2020/8/10 16:05
23 | **/
24 | String saveInputStream(String clientFileName, InputStream inputStream) throws IOException;
25 |
26 | /**
27 | * @param serverFileName 服务端文件名
28 | * @return 文件输入流
29 | * @description 根据文件名获取文件
30 | * @author 郑晓龙
31 | * @createTime 2020/8/8 10:44
32 | **/
33 | InputStream getInputStream(String serverFileName) throws IOException;
34 |
35 | /**
36 | * @param serverFileName 服务端文件名
37 | * @return java.lang.String 客户端文件名
38 | * @description 根据服务端文件名获取客户端文件名
39 | * @author 郑晓龙
40 | * @createTime 2020/8/10 16:09
41 | **/
42 | String getClientFileName(String serverFileName);
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/download-demo/src/main/java/com/zhengxl/downloaddemo/service/impl/FileServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.downloaddemo.service.impl;
2 |
3 |
4 | import com.zhengxl.downloaddemo.repository.FileRepository;
5 | import com.zhengxl.downloaddemo.service.FileService;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.stereotype.Service;
8 |
9 | import java.io.IOException;
10 | import java.io.InputStream;
11 |
12 | /**
13 | * @description:
14 | * @projectName:thymeleaf-demo
15 | * @see:com.zhengxl.thymeleafdemo.service
16 | * @author:郑晓龙
17 | * @createTime:2020/8/7 13:47
18 | * @version:1.0
19 | */
20 | @Service
21 | public class FileServiceImpl implements FileService {
22 |
23 | @Autowired
24 | FileRepository fileRepository;
25 |
26 | @Override
27 | public String saveInputStream(String clientFileName, InputStream inputStream) throws IOException {
28 | return fileRepository.saveFile(clientFileName, inputStream);
29 |
30 | }
31 |
32 | @Override
33 | public InputStream getInputStream(String serverFileName) throws IOException {
34 | return fileRepository.getInputStream(serverFileName);
35 | }
36 |
37 | @Override
38 | public String getClientFileName(String serverFileName) {
39 | return fileRepository.getClientFileName(serverFileName);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/download-demo/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 | spring:
4 | thymeleaf:
5 | cache: false
6 | servlet:
7 | multipart:
8 | enabled: true
9 | max-file-size: 20MB
10 | max-request-size: 20MB
11 | file:
12 | storage:
13 | # windows D:/upload/
14 | #linux /home/upload/
15 | path: "D:/upload/"
--------------------------------------------------------------------------------
/download-demo/src/main/resources/templates/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Document
9 |
10 |
11 | 操作失败!
12 |
13 | 返回
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/download-demo/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 文件上传
7 |
13 |
14 |
15 |
16 |
17 | 文件上传页面
18 |
30 |
31 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/download-demo/src/main/resources/templates/upload-success.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Document
9 |
15 |
16 |
17 | 操作成功!
18 |
21 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/download-demo/src/test/java/com/zhengxl/downloaddemo/DownloadDemoApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.downloaddemo;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class DownloadDemoApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/error-handle-demo/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.3.3.RELEASE
9 |
10 |
11 | com.zhengxl
12 | error-handle-demo
13 | 0.0.1-SNAPSHOT
14 | error-handle-demo
15 | Demo project for Spring Boot
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-thymeleaf
25 |
26 |
27 | org.springframework.boot
28 | spring-boot-starter-web
29 |
30 |
31 |
32 | org.springframework.boot
33 | spring-boot-starter-test
34 | test
35 |
36 |
37 | org.junit.vintage
38 | junit-vintage-engine
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | org.springframework.boot
48 | spring-boot-maven-plugin
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/java/com/zhengxl/errorhandledemo/ErrorHandleDemoApplication.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.errorhandledemo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class ErrorHandleDemoApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(ErrorHandleDemoApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/java/com/zhengxl/errorhandledemo/controller/CustomErrorController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.errorhandledemo.controller;
2 |
3 | import org.springframework.boot.web.servlet.error.ErrorController;
4 | import org.springframework.http.HttpStatus;
5 | import org.springframework.stereotype.Controller;
6 | import org.springframework.web.bind.annotation.RequestMapping;
7 |
8 | import javax.servlet.RequestDispatcher;
9 | import javax.servlet.http.HttpServletRequest;
10 |
11 | /**
12 | * @description:
13 | * @projectName:error-handle-demo
14 | * @see:com.zhengxl.errorhandledemo.controller
15 | * @author:郑晓龙
16 | * @createTime:2020/8/24 18:08
17 | * @version:1.0
18 | */
19 | @Controller
20 | public class CustomErrorController implements ErrorController {
21 |
22 | @RequestMapping("/error")
23 | public String handleError(HttpServletRequest request) {
24 | Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
25 | if (status != null) {
26 | Integer statusCode = Integer.valueOf(status.toString());
27 |
28 | if (statusCode == HttpStatus.NOT_FOUND.value()) {
29 | return "my404";
30 | } else if (statusCode == HttpStatus.UNAUTHORIZED.value()) {
31 | return "my401";
32 | } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
33 | return "my500";
34 | }
35 | // 这里后期可以扩展其他错误页面
36 | }
37 | return "my404";
38 | }
39 |
40 | @Override
41 | public String getErrorPath() {
42 | return null;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/java/com/zhengxl/errorhandledemo/controller/HelloWorldController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.errorhandledemo.controller;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.web.bind.annotation.GetMapping;
5 |
6 | /**
7 | * @description:
8 | * @projectName:error-handle-demo
9 | * @see:com.zhengxl.errorhandledemo.controller
10 | * @author:郑晓龙
11 | * @createTime:2020/8/24 17:05
12 | * @version:1.0
13 | */
14 | @Controller
15 | public class HelloWorldController {
16 | @GetMapping("hello")
17 | public String hello() {
18 | // 制造一个 500 错误
19 | // int error= 1/0;
20 | return "hello";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | error:
3 | # 使用默认的 /error
4 | path: /error
5 | whitelabel:
6 | enabled: false
7 | spring:
8 | thymeleaf:
9 | cache: false
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/templates/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | My Error Page
5 |
6 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/templates/hello.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | helloPage
6 |
7 |
8 | Hello,World!
9 |
10 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/templates/my401.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | My 401 Unauthorized Page
5 |
6 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/templates/my404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | My 404 Not Found Page
5 |
6 |
--------------------------------------------------------------------------------
/error-handle-demo/src/main/resources/templates/my500.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | My 500 Internal Server Error Page
5 |
6 |
--------------------------------------------------------------------------------
/error-handle-demo/src/test/java/com/zhengxl/errorhandledemo/ErrorHandleDemoApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.errorhandledemo;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ErrorHandleDemoApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/filter-demo/.idea/$CACHE_FILE$:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Ali-Check
10 |
11 |
12 | Java
13 |
14 |
15 | Serialization issuesJava
16 |
17 |
18 |
19 |
20 | SerializableHasSerialVersionUIDField
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/filter-demo/.idea/$PRODUCT_WORKSPACE_FILE$:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 1.8
8 |
9 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/filter-demo/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /workspace.xml
--------------------------------------------------------------------------------
/filter-demo/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/filter-demo/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/filter-demo/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_11.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_10_11.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_36.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_36.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_assertj_assertj_core_3_16_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_glassfish_jakarta_el_3_0_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_hamcrest_hamcrest_2_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_5_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_params_5_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_6_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_mockito_mockito_core_3_3_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_mockito_mockito_junit_jupiter_3_3_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_3_1_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_aop_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_beans_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_context_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_core_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_expression_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_test_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_web_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_springframework_spring_webmvc_5_2_7_RELEASE.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_7_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/filter-demo/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/filter-demo/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/filter-demo/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.3.1.RELEASE
9 |
10 |
11 | com.zhengxl
12 | filter-demo
13 | 0.0.1-SNAPSHOT
14 | filter-demo
15 | Demo project for Spring Boot
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-web
25 |
26 |
27 |
28 | org.springframework.boot
29 | spring-boot-starter-test
30 | test
31 |
32 |
33 | org.junit.vintage
34 | junit-vintage-engine
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | org.springframework.boot
44 | spring-boot-maven-plugin
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/filter-demo/src/main/java/com/zhengxl/filterdemo/FilterDemoApplication.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.boot.web.servlet.ServletComponentScan;
6 |
7 | @SpringBootApplication
8 | @ServletComponentScan("com.zhengxl.filterdemo.filter")
9 | public class FilterDemoApplication {
10 |
11 | public static void main(String[] args) {
12 | SpringApplication.run(FilterDemoApplication.class, args);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/filter-demo/src/main/java/com/zhengxl/filterdemo/config/FilterConfig.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo.config;
2 |
3 | import com.zhengxl.filterdemo.filter.MyAnotherFilter;
4 | import com.zhengxl.filterdemo.filter.MyFilter;
5 | import org.springframework.boot.web.servlet.FilterRegistrationBean;
6 | import org.springframework.context.annotation.Bean;
7 | import org.springframework.context.annotation.Configuration;
8 |
9 | @Configuration
10 | public class FilterConfig {
11 | @Bean
12 | public FilterRegistrationBean registerMyFilter(){
13 | FilterRegistrationBean bean = new FilterRegistrationBean<>();
14 | bean.setOrder(1);
15 | bean.setFilter(new MyFilter());
16 | // 匹配"/hello/"下面的所有url
17 | bean.addUrlPatterns("/hello/*");
18 | return bean;
19 | }
20 | @Bean
21 | public FilterRegistrationBean registerMyAnotherFilter(){
22 | FilterRegistrationBean bean = new FilterRegistrationBean<>();
23 | bean.setOrder(2);
24 | bean.setFilter(new MyAnotherFilter());
25 | // 匹配所有url
26 | bean.addUrlPatterns("/*");
27 | return bean;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/filter-demo/src/main/java/com/zhengxl/filterdemo/controller/HelloWorld.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo.controller;
2 |
3 | import org.springframework.web.bind.annotation.GetMapping;
4 | import org.springframework.web.bind.annotation.RequestMapping;
5 | import org.springframework.web.bind.annotation.RestController;
6 |
7 | @RestController
8 | public class HelloWorld {
9 | @GetMapping("hello")
10 | public String helloWorld(){
11 | return "Hello world!";
12 | }
13 | @GetMapping("hi")
14 | public String helloChina(){
15 | return "Hi world!";
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/filter-demo/src/main/java/com/zhengxl/filterdemo/filter/MyAnotherFilter.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo.filter;
2 |
3 | import org.springframework.core.annotation.Order;
4 | import org.springframework.stereotype.Component;
5 |
6 | import javax.servlet.*;
7 | import javax.servlet.annotation.WebFilter;
8 | import java.io.IOException;
9 |
10 | //@Component
11 | //@Order(2)
12 | //@WebFilter(urlPatterns = "/*")
13 | public class MyAnotherFilter implements Filter {
14 | @Override
15 | public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
16 | System.out.println("my another filter in");
17 | filterChain.doFilter(servletRequest,servletResponse);
18 | System.out.println("my another filter out");
19 |
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/filter-demo/src/main/java/com/zhengxl/filterdemo/filter/MyFilter.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo.filter;
2 |
3 | import org.springframework.core.annotation.Order;
4 | import org.springframework.stereotype.Component;
5 |
6 | import javax.servlet.*;
7 | import javax.servlet.annotation.WebFilter;
8 | import java.io.IOException;
9 |
10 | //@Component
11 | //@Order(1)
12 | //@WebFilter(urlPatterns = "/hello/*")
13 | public class MyFilter implements Filter {
14 | @Override
15 | public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
16 | System.out.println("my filter in");
17 | filterChain.doFilter(servletRequest,servletResponse);
18 | System.out.println("my filter out");
19 |
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/filter-demo/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/filter-demo/src/test/java/com/zhengxl/filterdemo/FilterDemoApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.filterdemo;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class FilterDemoApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/filter-demo/target/classes/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/filter-demo/target/classes/com/zhengxl/filterdemo/FilterDemoApplication.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/filter-demo/target/classes/com/zhengxl/filterdemo/FilterDemoApplication.class
--------------------------------------------------------------------------------
/filter-demo/target/classes/com/zhengxl/filterdemo/controller/HelloWorld.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/filter-demo/target/classes/com/zhengxl/filterdemo/controller/HelloWorld.class
--------------------------------------------------------------------------------
/filter-demo/target/classes/com/zhengxl/filterdemo/filter/MyAnotherFilter.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/filter-demo/target/classes/com/zhengxl/filterdemo/filter/MyAnotherFilter.class
--------------------------------------------------------------------------------
/filter-demo/target/classes/com/zhengxl/filterdemo/filter/MyFilter.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/filter-demo/target/classes/com/zhengxl/filterdemo/filter/MyFilter.class
--------------------------------------------------------------------------------
/filter-demo/target/test-classes/com/zhengxl/filterdemo/FilterDemoApplicationTests.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/filter-demo/target/test-classes/com/zhengxl/filterdemo/FilterDemoApplicationTests.class
--------------------------------------------------------------------------------
/freemarker/Freemarker.xmind:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhengxl5566/springboot-demo/5d27efdf123773e3df033d1e545ec57009e3a7ac/freemarker/Freemarker.xmind
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/FreemarkerApplication.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cache.annotation.EnableCaching;
6 |
7 | @SpringBootApplication
8 | public class FreemarkerApplication {
9 |
10 | public static void main(String[] args) {
11 | SpringApplication.run(FreemarkerApplication.class, args);
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/controller/IndexController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.controller;
2 |
3 | import com.zhengxl.freemarker.service.UserService;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.stereotype.Controller;
6 | import org.springframework.ui.Model;
7 | import org.springframework.web.bind.annotation.GetMapping;
8 |
9 | import java.util.ArrayList;
10 | import java.util.Date;
11 | import java.util.List;
12 |
13 | /**
14 | * @description:
15 | * @projectName:freemarker
16 | * @see:com.zhengxl.freemarker.controller
17 | * @author:郑晓龙
18 | * @createTime:2020/12/17 14:34
19 | * @version:1.0
20 | */
21 | @Controller
22 | public class IndexController {
23 | @Autowired
24 | private UserService userService;
25 |
26 | @GetMapping(value={"/","index"})
27 | public String index(Model model) {
28 | // 放入单个值
29 | model.addAttribute("userName","Java 课代表");
30 |
31 | // 放入集合
32 | model.addAttribute("allUsers",userService.getAllUser());
33 |
34 | // 放入日期
35 | model.addAttribute("currentTime",new Date());
36 |
37 |
38 | List xs = new ArrayList<>();
39 | xs.add("1");
40 | xs.add("2");
41 | xs.add("3");
42 | xs.add(null);
43 | model.addAttribute("xs",xs);
44 |
45 | // 返回模板名称
46 | return "index";
47 |
48 | }
49 |
50 | @GetMapping("built-ins")
51 | public String builtIns(){
52 | return "built-ins";
53 | }
54 |
55 | }
56 |
57 | // model.addAttribute("user",new User("zhengxl5566",18));
58 | //
59 | // model.addAttribute("userService",userService);
60 |
61 | // model.addAttribute("timeStamp",1608535755L);
62 | // System.out.println("executing" + name);
63 | // String content = "<p>2222222222222222222</p>";
64 | // String content2 = "2222222222222222222
";
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/controller/StaticMethodController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.controller;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.web.bind.annotation.GetMapping;
5 |
6 | /**
7 | * @description:展示FTL中调用Java静态方法的用法
8 | * @projectName:freemarker
9 | * @see:com.zhengxl.freemarker.controller
10 | * @author:郑晓龙
11 | * @createTime:2020/12/28 14:13
12 | * @version:1.0
13 | */
14 | @Controller
15 | public class StaticMethodController {
16 | @GetMapping("static")
17 | public String staticMethodView(){
18 | return "static-method-view";
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/controller/UserDefinedDirectiveController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.controller;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.web.bind.annotation.GetMapping;
5 |
6 | /**
7 | * @description: 展示用户自定义指令的用法
8 | * @projectName:freemarker
9 | * @see:com.zhengxl.freemarker.controller
10 | * @author:郑晓龙
11 | * @createTime:2020/12/28 14:14
12 | * @version:1.0
13 | */
14 | @Controller
15 | public class UserDefinedDirectiveController {
16 | @GetMapping("directive")
17 | public String userDefinedDirective(){
18 | return "directive";
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/directive/MyDirective.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.directive;
2 |
3 | import com.zhengxl.freemarker.service.UserService;
4 | import freemarker.core.Environment;
5 | import freemarker.template.*;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.stereotype.Component;
8 |
9 | import java.io.IOException;
10 | import java.util.Iterator;
11 | import java.util.Map;
12 |
13 | /**
14 | * @description:
15 | * @projectName:freemarker
16 | * @see:com.zhengxl.freemarker.directive
17 | * @author:郑晓龙
18 | * @createTime:2020/12/28 15:47
19 | * @version:1.0
20 | */
21 | @Component
22 | public class MyDirective implements TemplateDirectiveModel {
23 | @Autowired
24 | private UserService userService;
25 |
26 | @Override
27 | public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
28 |
29 | Iterator iterator = params.entrySet().iterator();
30 | while (iterator.hasNext()) {
31 | Map.Entry entry = (Map.Entry) iterator.next();
32 | String paramName = (String) entry.getKey();
33 | String paramValue = entry.getValue().toString();
34 | if (paramName.equals("method")) {
35 | if(paramValue.equals("getAllUsers")){
36 | DefaultObjectWrapper build = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_30).build();
37 | TemplateModel wrap = build.wrap(userService.getAllUser());
38 | loopVars[0] = wrap;
39 | }
40 | if(paramValue.equals("getUser")){
41 | DefaultObjectWrapper build = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_30).build();
42 | TemplateModel wrap = build.wrap(userService.getUser(params.get("userName").toString()));
43 | loopVars[0] = wrap;
44 | }
45 | }
46 | }
47 |
48 | if (body != null) {
49 | body.render(env.getOut());
50 | }
51 |
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/entity/User.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.entity;
2 |
3 | /**
4 | * @description:
5 | * @projectName:freemarker
6 | * @see:com.zhengxl.freemarker.entity
7 | * @author:郑晓龙
8 | * @createTime:2020/12/17 16:31
9 | * @version:1.0
10 | */
11 | public class User {
12 | private String name;
13 | private Integer age;
14 |
15 | public User(String name, Integer age) {
16 | this.name = name;
17 | this.age = age;
18 | }
19 |
20 | public String getName() {
21 | return name;
22 | }
23 |
24 | public void setName(String name) {
25 | this.name = name;
26 | }
27 |
28 | public Integer getAge() {
29 | return age;
30 | }
31 |
32 | public void setAge(Integer age) {
33 | this.age = age;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/properties/FreeMarkerProperties.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.properties;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 | import org.springframework.context.annotation.Primary;
5 | import org.springframework.stereotype.Component;
6 |
7 | /**
8 | * @description:
9 | * @projectName:freemarker
10 | * @see:com.zhengxl.freemarker.properties
11 | * @author:郑晓龙
12 | * @createTime:2021/1/5 14:57
13 | * @version:1.0
14 | */
15 | @Component
16 | @Primary
17 | @ConfigurationProperties(prefix = "spring.freemarker")
18 | public class FreeMarkerProperties extends org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties{
19 | /**
20 | * 需要引入的静态工具类的包路径
21 | */
22 | private String[] staticToolPackagePath;
23 |
24 | public String[] getStaticToolPackagePath() {
25 | return staticToolPackagePath;
26 | }
27 |
28 | public void setStaticToolPackagePath(String[] staticToolPackagePath) {
29 | this.staticToolPackagePath = staticToolPackagePath;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.service;
2 |
3 | import com.zhengxl.freemarker.entity.User;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * @description:
9 | * @projectName:freemarker
10 | * @see:com.zhengxl.freemarker.service
11 | * @author:郑晓龙
12 | * @createTime:2020/12/17 16:31
13 | * @version:1.0
14 | */
15 | public interface UserService {
16 | List getAllUser();
17 |
18 | Integer insert(User user);
19 |
20 | User getUser(String userName);
21 | }
22 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/service/impl/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.service.impl;
2 |
3 | import com.zhengxl.freemarker.entity.User;
4 | import com.zhengxl.freemarker.service.UserService;
5 | import org.springframework.stereotype.Service;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | /**
11 | * @description:
12 | * @projectName:freemarker
13 | * @see:com.zhengxl.freemarker.service.impl
14 | * @author:郑晓龙
15 | * @createTime:2020/12/17 16:33
16 | * @version:1.0
17 | */
18 | @Service
19 | public class UserServiceImpl implements UserService {
20 | @Override
21 | public List getAllUser() {
22 | List users = new ArrayList<>();
23 | users.add(new User("zxl", 18));
24 | users.add(new User("ls", 19));
25 | users.add(new User("zs", 16));
26 | return users;
27 | }
28 |
29 | @Override
30 | public Integer insert(User user) {
31 | System.out.println("Insert OK!");
32 | return 1;
33 | }
34 |
35 | @Override
36 | public User getUser(String userName) {
37 | return new User(userName, 20);
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/tools/AnotherStaticTool.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.tools;
2 |
3 | /**
4 | * @description:
5 | * @projectName:freemarker
6 | * @see:com.zhengxl.freemarker.tools
7 | * @author:郑晓龙
8 | * @createTime:2021/1/5 14:50
9 | * @version:1.0
10 | */
11 | public class AnotherStaticTool {
12 | public static String sayHello(){
13 | return "hello!";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/freemarker/src/main/java/com/zhengxl/freemarker/tools/UserStaticTool.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.freemarker.tools;
2 |
3 | import com.google.common.collect.Maps;
4 | import com.zhengxl.freemarker.entity.User;
5 |
6 | import java.util.Map;
7 |
8 | /**
9 | * @description:
10 | * @projectName:freemarker
11 | * @see:com.zhengxl.freemarker.tools
12 | * @author:郑晓龙
13 | * @createTime:2020/12/24 16:56
14 | * @version:1.0
15 | */
16 | public class UserStaticTool {
17 | public static User getUser(String userName){
18 | Map userMap = Maps.newHashMap();
19 | userMap.put("zhangsan",new User("zhangsan", 18));
20 | userMap.put("lisi",new User("lisi", 19));
21 | userMap.put("wangwu",new User("wangwu", 20));
22 | return userMap.get(userName);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/freemarker/src/main/resources/META-INF/additional-spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "properties": [
3 | {
4 | "name": "spring.freemarker.staticToolPackagePath",
5 | "type": "java.lang.String",
6 | "description": "the class path of static method that you want to expose to the FTL."
7 | }
8 | ] }
--------------------------------------------------------------------------------
/freemarker/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | freemarker:
3 | cache: false
4 | suffix: .ftlh
5 | staticToolPackagePath:
6 | - com.zhengxl.freemarker.tools.UserStaticTool
7 | - com.zhengxl.freemarker.tools.AnotherStaticTool
8 | server:
9 | port: 8080
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/built-ins.ftlh:
--------------------------------------------------------------------------------
1 | <#--字符串类型内置函数样例-->
2 | <#--创建字符串-->
3 | <#assign myStr = "Java 课代表">
4 | <#--首字母小写-->
5 | ${myStr?uncap_first}
6 | <#--保留指定字符后面的字符串-->
7 | ${myStr?keep_after("Java")}
8 | <#--替换指定字符-->
9 | ${myStr?replace("Java","Freemarker")}
10 |
11 | <#--时间类型内置函数样例-->
12 | <#--获取当前时间(如果是后端将时间传入data-model,只需要传Date类型即可)-->
13 | <#assign currentDateTime = .now>
14 | <#--展示日期部分-->
15 | ${currentDateTime?date}
16 | <#--展示时间部分-->
17 | ${currentDateTime?time}
18 | <#--展示日期和时间部分-->
19 | ${currentDateTime?datetime}
20 | <#--按指定格式展示时间日期-->
21 | ${currentDateTime?string("yyyy-MM-dd HH:mm a")}
22 |
23 | <#--序列类型内置函数样例-->
24 | <#assign mySequence = ["Java 课代表","张三","李四","王五"]>
25 | <#--将所有元素以指定分隔符分割,输出字符串-->
26 | ${mySequence?join(",")}
27 | <#--取序列中的第一个元素-->
28 | ${mySequence?first}
29 | <#--将序列排序后使用逗号分割输出为字符串-->
30 | ${mySequence?sort?join(",")}
31 |
32 | <#global g = 123>
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/directive.ftlh:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Document
9 |
10 |
11 |
12 | <#--返回值为集合的自定义指令-->
13 | <@myDirective method="getAllUsers" ;users>
14 | <#list users as user>
15 | ${user.name}
16 | #list>
17 | @myDirective>
18 |
19 | <#--演示带参数的自定义指令-->
20 | <@myDirective method="getUser" userName="zhengxl5566";user>
21 | ${user.name} ${user.age}
22 | @myDirective>
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/footer.ftlh:
--------------------------------------------------------------------------------
1 |
2 | 这里是 footer
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/inner-method.ftlh:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | inner-method
9 |
10 |
11 | <#--内部方法调用展示-->
12 |
13 | <#--String 内部方法调用展示-->
14 | <#assign myString = "this is a very long string">
15 | 长度:${myString?length}
16 | 首字母大写:${myString?cap_first}
17 | 全部大写:${myString?upper_case}
18 | 查找指定字符串:${myString?index_of("long")}
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/lib/bbb.ftlh:
--------------------------------------------------------------------------------
1 | <#assign bbb = "bbb">
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/lib/common.ftlh:
--------------------------------------------------------------------------------
1 | <#macro ulList seq>
2 | <#list seq>
3 |
4 | <#items as item>
5 | -
6 | ${item}
7 |
8 | #items>
9 |
10 | #list>
11 |
12 | #macro>
13 |
14 | <#macro olList seq>
15 | <#list seq>
16 |
17 | <#items as item>
18 | -
19 | ${item}
20 |
21 | #items>
22 |
23 | #list>
24 | #macro>
25 |
26 | <#macro myFooter>
27 |
28 | 这里是 footer
29 | #macro>
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/lib/example.ftlh:
--------------------------------------------------------------------------------
1 | <#macro copyright date>
2 | Copyright (C) ${date} Someone. All rights reserved.
3 | #macro>
4 |
5 | <#assign mail = "user@example.com">
--------------------------------------------------------------------------------
/freemarker/src/main/resources/templates/static-method-view.ftlh:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | static-method-view
9 |
10 |
11 | <#--展示模板中调用java静态方法-->
12 | <#--UserStaticTool 已通过配置类加载到共享变量中,可查看 FreemarkerConfig 相关配置-->
13 | <#assign user = UserStaticTool.getUser("zhangsan")>
14 | 姓名:${user.name} 年龄:${user.age}
15 |
16 |
17 | <#assign res = AnotherStaticTool.sayHello()>
18 | ${res}
19 |
20 |
21 |
--------------------------------------------------------------------------------
/interceptor-demo/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.3.1.RELEASE
9 |
10 |
11 | com.zhengxl
12 | interceptor-demo
13 | 0.0.1-SNAPSHOT
14 | interceptor-demo
15 | Demo project for Spring Boot
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-web
25 |
26 |
27 |
28 | org.springframework.boot
29 | spring-boot-starter-test
30 | test
31 |
32 |
33 | org.junit.vintage
34 | junit-vintage-engine
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | org.springframework.boot
44 | spring-boot-maven-plugin
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/interceptor-demo/src/main/java/com/zhengxl/interceptordemo/InterceptorDemoApplication.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.interceptordemo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.boot.web.servlet.ServletComponentScan;
6 |
7 | @SpringBootApplication
8 | public class InterceptorDemoApplication {
9 |
10 | public static void main(String[] args) {
11 | SpringApplication.run(InterceptorDemoApplication.class, args);
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/interceptor-demo/src/main/java/com/zhengxl/interceptordemo/config/WebMVCConfig.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.interceptordemo.config;
2 |
3 | import com.zhengxl.interceptordemo.interceptor.AnotherInterceptor;
4 | import com.zhengxl.interceptordemo.interceptor.MyInterceptor;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.context.annotation.Configuration;
7 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
9 |
10 | /**
11 | * @description:
12 | * @projectName:interceptor-demo
13 | * @see:com.zhengxl.interceptordemo.config.CustomWebMVCConfigurer
14 | * @author:郑晓龙
15 | * @createTime:2020/9/26 10:04
16 | * @version:1.0
17 | */
18 | @Configuration
19 | public class WebMVCConfig implements WebMvcConfigurer {
20 | @Autowired
21 | MyInterceptor myInterceptor;
22 | @Autowired
23 | AnotherInterceptor anotherInterceptor;
24 |
25 | @Override
26 | public void addInterceptors(InterceptorRegistry registry) {
27 | registry.addInterceptor(myInterceptor);
28 | registry.addInterceptor(anotherInterceptor);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/interceptor-demo/src/main/java/com/zhengxl/interceptordemo/controller/HelloWorldController.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.interceptordemo.controller;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.web.bind.annotation.GetMapping;
6 | import org.springframework.web.bind.annotation.RequestMapping;
7 | import org.springframework.web.bind.annotation.RestController;
8 |
9 | /**
10 | * @description:
11 | * @projectName:interceptor-demo
12 | * @see:com.zhengxl.interceptordemo.controller
13 | * @author:郑晓龙
14 | * @createTime:2020/9/26 10:04
15 | * @version:1.0
16 | */
17 | @RestController
18 | public class HelloWorldController {
19 | private static Logger logger = LoggerFactory.getLogger(HelloWorldController.class);
20 |
21 | @GetMapping("hello")
22 | public String Hello(){
23 | logger.info("hello world controller!");
24 | return "hello,world!";
25 | }
26 | }
--------------------------------------------------------------------------------
/interceptor-demo/src/main/java/com/zhengxl/interceptordemo/interceptor/AnotherInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.interceptordemo.interceptor;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.lang.Nullable;
6 | import org.springframework.stereotype.Component;
7 | import org.springframework.web.servlet.HandlerInterceptor;
8 | import org.springframework.web.servlet.ModelAndView;
9 |
10 | import javax.servlet.http.HttpServletRequest;
11 | import javax.servlet.http.HttpServletResponse;
12 |
13 | /**
14 | * @description:
15 | * @projectName:interceptor-demo
16 | * @see:com.zhengxl.interceptordemo.interceptor
17 | * @author:郑晓龙
18 | * @createTime:2020/9/26 11:19
19 | * @version:1.0
20 | */
21 | @Component
22 | public class AnotherInterceptor implements HandlerInterceptor {
23 | private static Logger logger = LoggerFactory.getLogger(AnotherInterceptor.class);
24 |
25 | @Override
26 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
27 | throws Exception {
28 | logger.info("AnotherInterceptor preHandle");
29 | return true;
30 | }
31 |
32 | @Override
33 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
34 | @Nullable ModelAndView modelAndView) throws Exception {
35 | logger.info("AnotherInterceptor postHandle");
36 | }
37 | @Override
38 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
39 | @Nullable Exception ex) throws Exception {
40 | logger.info("AnotherInterceptor afterCompletion");
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/interceptor-demo/src/main/java/com/zhengxl/interceptordemo/interceptor/MyInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.zhengxl.interceptordemo.interceptor;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.stereotype.Component;
6 | import org.springframework.web.servlet.HandlerInterceptor;
7 | import org.springframework.web.servlet.ModelAndView;
8 |
9 | import javax.servlet.http.HttpServletRequest;
10 | import javax.servlet.http.HttpServletResponse;
11 |
12 | /**
13 | * @description:
14 | * @projectName:interceptor-demo
15 | * @see:com.zhengxl.interceptordemo.interceptor
16 | * @author:郑晓龙
17 | * @createTime:2020/9/26 10:06
18 | * @version:1.0
19 | */
20 | @Component
21 | public class MyInterceptor implements HandlerInterceptor {
22 | private static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
23 | @Override
24 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
25 | throws Exception {
26 | logger.info("MyInterceptor preHandle");
27 | return true;
28 |
29 | }
30 |
31 | @Override
32 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
33 | logger.info("MyInterceptor postHandle");
34 | }
35 |
36 | @Override
37 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
38 | logger.info("MyInterceptor afterCompletion");
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/DynamicMultipleDataSourcesApplication.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources;
2 |
3 | import org.mybatis.spring.annotation.MapperScan;
4 | import org.springframework.boot.SpringApplication;
5 | import org.springframework.boot.autoconfigure.SpringBootApplication;
6 |
7 | @SpringBootApplication
8 | @MapperScan(value = "top.javahelper.dynamicmultipledatasources.mapper")
9 | public class DynamicMultipleDataSourcesApplication {
10 |
11 | public static void main(String[] args) {
12 | SpringApplication.run(DynamicMultipleDataSourcesApplication.class, args);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/aspect/DataSourceAspect.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.aspect;
2 |
3 | import org.aspectj.lang.ProceedingJoinPoint;
4 | import org.aspectj.lang.annotation.Around;
5 | import org.aspectj.lang.annotation.Aspect;
6 | import org.springframework.core.Ordered;
7 | import org.springframework.core.annotation.Order;
8 | import org.springframework.stereotype.Component;
9 | import top.javahelper.dynamicmultipledatasources.common.RoutingDataSourceContext;
10 | import top.javahelper.dynamicmultipledatasources.common.WithDataSource;
11 |
12 | /**
13 | * 数据源切面
14 | * 根据注解 @WithDataSource 的 value 切换数据源
15 | *
16 | * @author :Java课代表
17 | */
18 | @Aspect
19 | @Component
20 | // 指定优先级高于@Transactional
21 | // 从而保证先切换数据源再进行事务操作
22 | @Order(Ordered.LOWEST_PRECEDENCE - 1)
23 | public class DataSourceAspect {
24 |
25 | @Around("@annotation(withDataSource)")
26 | public Object switchDataSource(ProceedingJoinPoint pjp, WithDataSource withDataSource) throws Throwable {
27 |
28 | // 1.获取 @WithDataSource 注解中指定的数据源
29 | String routingKey = withDataSource.value();
30 | // 2.设置数据源上下文
31 | RoutingDataSourceContext.setRoutingKey(routingKey);
32 | // 3.使用设定好的数据源处理业务
33 | try {
34 | return pjp.proceed();
35 | } finally {
36 | // 4.清空数据源上下文
37 | RoutingDataSourceContext.reset();
38 | }
39 | }
40 | }
41 |
42 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/common/RoutingDataSource.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.common;
2 |
3 | import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
4 |
5 | /**
6 | * 支持动态切换的数据源
7 | * 通过重写 determineCurrentLookupKey 实现数据源切换
8 | * @author :Java课代表
9 | */
10 | public class RoutingDataSource extends AbstractRoutingDataSource {
11 |
12 | @Override
13 | protected Object determineCurrentLookupKey() {
14 | return RoutingDataSourceContext.getRoutingKey();
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/common/RoutingDataSourceContext.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.common;
2 |
3 | /**
4 | * 数据源 key 上下文
5 | * 通过控制 ThreadLocal变量 LOOKUP_KEY_HOLDER 的值用于控制数据源切换
6 | * @see RoutingDataSource
7 | * @author :Java课代表
8 | */
9 | public class RoutingDataSourceContext {
10 |
11 | private static final ThreadLocal LOOKUP_KEY_HOLDER = new ThreadLocal<>();
12 |
13 | public static void setRoutingKey(String routingKey) {
14 | LOOKUP_KEY_HOLDER.set(routingKey);
15 | }
16 |
17 | public static String getRoutingKey() {
18 | String key = LOOKUP_KEY_HOLDER.get();
19 | // 默认返回 key 为 first 的数据源
20 | return key == null ? "first" : key;
21 | }
22 |
23 | public static void reset() {
24 | LOOKUP_KEY_HOLDER.remove();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/common/WithDataSource.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.common;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * @author :Java课代表
7 | */
8 | @Target({ElementType.TYPE, ElementType.METHOD})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | @Documented
11 | public @interface WithDataSource {
12 | String value() default "";
13 | }
14 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/config/H2DataBaseInit.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.config;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.context.annotation.ComponentScan;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.jdbc.core.JdbcTemplate;
7 | import top.javahelper.dynamicmultipledatasources.common.RoutingDataSourceContext;
8 |
9 | import javax.annotation.PostConstruct;
10 |
11 | /**
12 | * 初始化两个数据源的表结构
13 | * 为了演示方便,使用了内存数据库 H2,所以需要初始化一下
14 | * 这里也演示了手工切换数据源的基本用法
15 | * @author :Java课代表
16 | */
17 | @Configuration
18 | @ComponentScan()
19 | public class H2DataBaseInit {
20 | @Autowired
21 | JdbcTemplate jdbcTemplate;
22 |
23 | @PostConstruct
24 | public void init() {
25 | // 手工切换为数据源 first,初始化表
26 | RoutingDataSourceContext.setRoutingKey("first");
27 | createTableUser();
28 | RoutingDataSourceContext.reset();
29 |
30 | // 手工切换为数据源 second,初始化表
31 | RoutingDataSourceContext.setRoutingKey("second");
32 | createTableUser();
33 | RoutingDataSourceContext.reset();
34 |
35 | }
36 |
37 | private void createTableUser() {
38 | jdbcTemplate.update("CREATE TABLE user\n" +
39 | " (\n" +
40 | " id VARCHAR(50) NOT NULL AUTO_INCREMENT,\n" +
41 | " name VARCHAR(50) NOT NULL,\n" +
42 | " PRIMARY KEY (id)\n" +
43 | " )");
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/mybatis/dynamic-multiple-data-sources/src/main/java/top/javahelper/dynamicmultipledatasources/config/RoutingDataSourcesConfig.java:
--------------------------------------------------------------------------------
1 | package top.javahelper.dynamicmultipledatasources.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 | import org.springframework.boot.jdbc.DataSourceBuilder;
5 | import org.springframework.context.annotation.Bean;
6 | import org.springframework.context.annotation.Configuration;
7 | import org.springframework.context.annotation.Primary;
8 | import top.javahelper.dynamicmultipledatasources.common.RoutingDataSource;
9 |
10 | import javax.sql.DataSource;
11 | import java.util.HashMap;
12 | import java.util.Map;
13 |
14 | /**
15 | * 数据源配置
16 | * 把多个数据源,装配到一个 RoutingDataSource 里
17 | * @author :Java课代表
18 | */
19 | @Configuration
20 | public class RoutingDataSourcesConfig {
21 |
22 | @Bean
23 | @ConfigurationProperties(prefix = "spring.datasource.first")
24 | public DataSource firstDataSource() {
25 | return DataSourceBuilder.create().build();
26 | }
27 |
28 | @Bean
29 | @ConfigurationProperties(prefix = "spring.datasource.second")
30 | public DataSource secondDataSource() {
31 | return DataSourceBuilder.create().build();
32 | }
33 |
34 | @Primary
35 | @Bean
36 | public RoutingDataSource routingDataSource() {
37 | RoutingDataSource routingDataSource = new RoutingDataSource();
38 | routingDataSource.setDefaultTargetDataSource(firstDataSource());
39 | Map