├── goodcode07 ├── .node-version ├── package-lock.json ├── package.json └── src │ ├── README.md │ ├── reservation-service.js │ ├── step1.js │ └── step3.js ├── goodcode05 ├── settings.gradle ├── src │ └── main │ │ ├── resources │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── templates │ │ │ └── index.html │ │ └── java │ │ └── goodcode │ │ ├── entity │ │ ├── User.java │ │ └── Division.java │ │ ├── controllers │ │ ├── step1 │ │ │ ├── RootController.java │ │ │ └── XmlApiController.java │ │ └── step2 │ │ │ └── XmlApiController.java │ │ ├── FQCNGenerator.java │ │ ├── ServletInitializer.java │ │ ├── Goodcode05Application.java │ │ └── service │ │ └── UserService.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore └── build.gradle ├── goodcode06 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ └── java │ │ └── goodcode │ │ ├── controllers │ │ ├── first │ │ │ ├── BaseController.java │ │ │ └── StoreController.java │ │ ├── method │ │ │ ├── BaseController.java │ │ │ └── StoreController.java │ │ ├── service │ │ │ ├── BaseController.java │ │ │ └── ItemController.java │ │ ├── utility │ │ │ ├── BaseController.java │ │ │ ├── ListController.java │ │ │ └── StoreController.java │ │ ├── object1 │ │ │ ├── BaseController.java │ │ │ └── FolderController.java │ │ ├── object2 │ │ │ ├── BaseController.java │ │ │ └── FolderController.java │ │ ├── constant1 │ │ │ ├── BaseController.java │ │ │ └── FolderController.java │ │ ├── constant2 │ │ │ ├── BaseController.java │ │ │ └── FolderController.java │ │ └── inheritance │ │ │ ├── BaseController.java │ │ │ ├── ListController.java │ │ │ └── StoreController.java │ │ ├── util │ │ └── Strings.java │ │ ├── entity │ │ ├── Item.java │ │ ├── Account.java │ │ └── Folder.java │ │ ├── service │ │ └── LicenseService.java │ │ ├── FQCNGenerator.java │ │ ├── ServletInitializer.java │ │ └── Goodcode06Application.java ├── .gitignore └── build.gradle ├── goodcode08 ├── settings.gradle ├── src │ └── main │ │ └── java │ │ └── goodcode │ │ ├── entity │ │ └── Item.java │ │ ├── cache │ │ ├── Controller.java │ │ ├── ItemRepository.java │ │ ├── ListController.java │ │ └── ListControllerAfter.java │ │ ├── FQCNGenerator.java │ │ ├── ServletInitializer.java │ │ ├── Goodcode08Application.java │ │ ├── list │ │ └── Main.java │ │ └── country │ │ ├── Main.java │ │ └── MainAfter.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore └── build.gradle ├── goodcode09 ├── settings.gradle ├── src │ ├── main │ │ ├── resources │ │ │ ├── application.yml │ │ │ ├── schema.sql │ │ │ ├── data.sql │ │ │ ├── application-dev.yml │ │ │ ├── static │ │ │ │ └── css │ │ │ │ │ └── default.css │ │ │ └── templates │ │ │ │ ├── todo.html │ │ │ │ ├── index.html │ │ │ │ ├── timeline.html │ │ │ │ ├── list.html │ │ │ │ └── login.html │ │ ├── .DS_Store │ │ └── java │ │ │ ├── .DS_Store │ │ │ └── goodcode │ │ │ ├── twitter │ │ │ ├── TwitterAPI.java │ │ │ ├── TwitterAPIImpl.java │ │ │ └── Tweet.java │ │ │ ├── calc │ │ │ ├── Calc.java │ │ │ └── Main.java │ │ │ ├── exception │ │ │ └── NotFoundException.java │ │ │ ├── controllers │ │ │ ├── IndexController.java │ │ │ ├── TimelineController.java │ │ │ ├── TodoListController.java │ │ │ ├── LoginController.java │ │ │ └── TodoController.java │ │ │ ├── Goodcode08Application.java │ │ │ ├── ServletInitializer.java │ │ │ ├── entity │ │ │ ├── Account.java │ │ │ └── Todo.java │ │ │ ├── service │ │ │ ├── TodoService.java │ │ │ └── impl │ │ │ │ └── TodoServiceImpl.java │ │ │ └── auth │ │ │ └── LoginAccount.java │ └── test │ │ └── java │ │ └── goodcode │ │ ├── calc │ │ └── CalcTest.java │ │ └── controllers │ │ ├── TimelineControllerTest.java │ │ └── TodoControllerTest.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore └── build.gradle ├── goodcode10 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── webapp │ │ └── images │ │ │ ├── food │ │ │ ├── food-1.jpg │ │ │ ├── food-2.jpg │ │ │ ├── food-3.jpg │ │ │ └── food-4.jpg │ │ │ ├── animal │ │ │ ├── animal-1.jpg │ │ │ ├── animal-2.jpg │ │ │ └── animal-3.jpg │ │ │ └── landscape │ │ │ ├── landscape-1.jpg │ │ │ ├── landscape-2.jpg │ │ │ └── landscape-3.jpg │ │ ├── resources │ │ ├── messages.properties │ │ ├── application.yml │ │ ├── application-dev.yml │ │ ├── static │ │ │ └── css │ │ │ │ └── default.css │ │ └── templates │ │ │ ├── index.html │ │ │ ├── step4.html │ │ │ ├── step1.html │ │ │ ├── step2.html │ │ │ └── step3.html │ │ └── java │ │ └── goodcode │ │ ├── util │ │ └── FileUtil.java │ │ ├── controllers │ │ ├── IndexController.java │ │ ├── Step2Action.java │ │ ├── Step1Action.java │ │ ├── Step3Action.java │ │ └── Step4Action.java │ │ ├── Goodcode09Application.java │ │ └── ServletInitializer.java ├── .gitignore └── build.gradle ├── goodcode11 ├── settings.gradle ├── lib │ ├── js-1.7R1.jar │ ├── jstl-1.1.2.jar │ ├── mail-1.4.jar │ ├── easymock-2.2.jar │ ├── junit-3.8.2.jar │ ├── log4j-1.2.15.jar │ ├── activation-1.1.jar │ ├── aopalliance-1.0.jar │ ├── commons-io-1.4.jar │ ├── poi-3.0-FINAL.jar │ ├── s2-tiger-2.4.28.jar │ ├── commons-lang-2.4.jar │ ├── javassist-3.4.ga.jar │ ├── commons-logging-1.1.jar │ ├── s2-extension-2.4.28.jar │ ├── s2-framework-2.4.28.jar │ ├── commons-beanutils-1.8.0.jar │ ├── geronimo-jpa_3.0_spec-1.0.jar │ ├── geronimo-jta_1.1_spec-1.0.jar │ └── ognl-2.6.9-patch-20070908.jar ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── main │ │ ├── java │ │ │ └── goodcode │ │ │ │ ├── converter │ │ │ │ ├── Converter.java │ │ │ │ ├── TrimConverter.java │ │ │ │ ├── IntegerConverter.java │ │ │ │ ├── DateConverter.java │ │ │ │ └── DateConverter2.java │ │ │ │ ├── util │ │ │ │ └── ByteArray.java │ │ │ │ ├── advanced │ │ │ │ ├── Converters.java │ │ │ │ ├── Field.java │ │ │ │ └── Main.java │ │ │ │ ├── step1 │ │ │ │ └── Main.java │ │ │ │ ├── step2 │ │ │ │ └── Main.java │ │ │ │ └── step3 │ │ │ │ ├── Main.java │ │ │ │ └── Main2.java │ │ └── assembly │ │ │ └── executable.xml │ └── test │ │ └── java │ │ └── goodcode │ │ └── step3 │ │ └── SampleTest.java ├── data.txt ├── .gitignore └── build.gradle ├── goodcode12-step1 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── build.gradle ├── .gitignore ├── src │ └── main │ │ ├── webapp │ │ ├── index.jsp │ │ ├── list.jsp │ │ ├── login.jsp │ │ └── WEB-INF │ │ │ └── web.xml │ │ └── java │ │ └── app │ │ ├── entity │ │ └── Todo.java │ │ └── servlet │ │ ├── LoginDisplayServlet.java │ │ ├── ListDisplayServlet.java │ │ └── LoginProcessServlet.java └── gradlew.bat ├── goodcode12-step2 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── java │ │ └── app │ │ │ ├── servlet │ │ │ ├── Action.java │ │ │ └── DispatcherServlet.java │ │ │ ├── action │ │ │ ├── LoginAction.java │ │ │ ├── ListAction.java │ │ │ └── LoginProcessAction.java │ │ │ └── entity │ │ │ └── Todo.java │ │ └── webapp │ │ ├── index.jsp │ │ ├── WEB-INF │ │ └── web.xml │ │ ├── list.jsp │ │ └── login.jsp ├── build.gradle ├── .gitignore └── gradlew.bat ├── goodcode12-step3 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── resources │ │ └── route.properties │ │ ├── java │ │ └── app │ │ │ ├── servlet │ │ │ ├── Action.java │ │ │ └── DispatcherServlet.java │ │ │ ├── action │ │ │ ├── LoginAction.java │ │ │ ├── ListAction.java │ │ │ └── LoginProcessAction.java │ │ │ └── entity │ │ │ └── Todo.java │ │ └── webapp │ │ ├── index.jsp │ │ ├── WEB-INF │ │ └── web.xml │ │ ├── list.jsp │ │ └── login.jsp ├── build.gradle ├── .gitignore └── gradlew.bat ├── goodcode12-step4 ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── resources │ │ └── route.properties │ │ ├── java │ │ └── app │ │ │ ├── action │ │ │ ├── LoginAction.java │ │ │ ├── ListAction.java │ │ │ └── LoginProcessAction.java │ │ │ ├── entity │ │ │ └── Todo.java │ │ │ └── servlet │ │ │ ├── Action.java │ │ │ └── DispatcherServlet.java │ │ └── webapp │ │ ├── index.jsp │ │ ├── WEB-INF │ │ └── web.xml │ │ ├── list.jsp │ │ └── login.jsp ├── build.gradle ├── .gitignore └── gradlew.bat ├── goodcode12-refrect-api ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── build.gradle ├── src │ └── main │ │ └── java │ │ └── goodcode │ │ └── refrect │ │ ├── Employee.java │ │ └── Main.java ├── .gitignore └── gradlew.bat ├── goodcode12-packaging-framework ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── build.gradle ├── .gitignore ├── src │ └── main │ │ └── java │ │ └── framework │ │ ├── Action.java │ │ └── DispatcherServlet.java └── gradlew.bat ├── goodcode12-packaging-application ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── resources │ │ └── route.properties │ │ ├── java │ │ └── app │ │ │ ├── action │ │ │ ├── LoginAction.java │ │ │ ├── ListAction.java │ │ │ └── LoginProcessAction.java │ │ │ └── entity │ │ │ └── Todo.java │ │ └── webapp │ │ ├── index.jsp │ │ ├── WEB-INF │ │ └── web.xml │ │ ├── list.jsp │ │ └── login.jsp ├── .gitignore ├── build.gradle └── gradlew.bat └── .gitignore /goodcode07/.node-version: -------------------------------------------------------------------------------- 1 | v14.16.0 2 | -------------------------------------------------------------------------------- /goodcode05/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode05' 2 | -------------------------------------------------------------------------------- /goodcode06/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode06' 2 | -------------------------------------------------------------------------------- /goodcode08/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode08' 2 | -------------------------------------------------------------------------------- /goodcode09/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode08' 2 | -------------------------------------------------------------------------------- /goodcode10/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode10' 2 | -------------------------------------------------------------------------------- /goodcode11/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode11' 2 | -------------------------------------------------------------------------------- /goodcode12-step1/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-step2/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-step3/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-step4/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'goodcode12' 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | target 3 | .classpath 4 | .project 5 | .settings 6 | bin 7 | .vscode/ -------------------------------------------------------------------------------- /goodcode05/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | -------------------------------------------------------------------------------- /goodcode09/src/main/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode09/src/main/.DS_Store -------------------------------------------------------------------------------- /goodcode11/lib/js-1.7R1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/js-1.7R1.jar -------------------------------------------------------------------------------- /goodcode11/lib/jstl-1.1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/jstl-1.1.2.jar -------------------------------------------------------------------------------- /goodcode11/lib/mail-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/mail-1.4.jar -------------------------------------------------------------------------------- /goodcode11/lib/easymock-2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/easymock-2.2.jar -------------------------------------------------------------------------------- /goodcode11/lib/junit-3.8.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/junit-3.8.2.jar -------------------------------------------------------------------------------- /goodcode11/lib/log4j-1.2.15.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/log4j-1.2.15.jar -------------------------------------------------------------------------------- /goodcode09/src/main/java/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode09/src/main/java/.DS_Store -------------------------------------------------------------------------------- /goodcode11/lib/activation-1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/activation-1.1.jar -------------------------------------------------------------------------------- /goodcode11/lib/aopalliance-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/aopalliance-1.0.jar -------------------------------------------------------------------------------- /goodcode11/lib/commons-io-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/commons-io-1.4.jar -------------------------------------------------------------------------------- /goodcode11/lib/poi-3.0-FINAL.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/poi-3.0-FINAL.jar -------------------------------------------------------------------------------- /goodcode11/lib/s2-tiger-2.4.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/s2-tiger-2.4.28.jar -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/entity/Item.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class Item { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode11/lib/commons-lang-2.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/commons-lang-2.4.jar -------------------------------------------------------------------------------- /goodcode11/lib/javassist-3.4.ga.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/javassist-3.4.ga.jar -------------------------------------------------------------------------------- /goodcode11/lib/commons-logging-1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/commons-logging-1.1.jar -------------------------------------------------------------------------------- /goodcode11/lib/s2-extension-2.4.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/s2-extension-2.4.28.jar -------------------------------------------------------------------------------- /goodcode11/lib/s2-framework-2.4.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/s2-framework-2.4.28.jar -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/cache/Controller.java: -------------------------------------------------------------------------------- 1 | package goodcode.cache; 2 | 3 | public class Controller { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode05/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode05/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode06/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode06/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode07/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "goodcode10-data-structure", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1 5 | } 6 | -------------------------------------------------------------------------------- /goodcode08/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode08/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode09/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode09/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode10/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode11/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode11/lib/commons-beanutils-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/commons-beanutils-1.8.0.jar -------------------------------------------------------------------------------- /goodcode11/lib/geronimo-jpa_3.0_spec-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/geronimo-jpa_3.0_spec-1.0.jar -------------------------------------------------------------------------------- /goodcode11/lib/geronimo-jta_1.1_spec-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/geronimo-jta_1.1_spec-1.0.jar -------------------------------------------------------------------------------- /goodcode11/lib/ognl-2.6.9-patch-20070908.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode11/lib/ognl-2.6.9-patch-20070908.jar -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/food/food-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/food/food-1.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/food/food-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/food/food-2.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/food/food-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/food/food-3.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/food/food-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/food/food-4.jpg -------------------------------------------------------------------------------- /goodcode12-step1/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-step1/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode12-step2/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-step2/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode12-step3/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-step3/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode12-step4/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-step4/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/animal/animal-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/animal/animal-1.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/animal/animal-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/animal/animal-2.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/animal/animal-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/animal/animal-3.jpg -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/first/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.first; 2 | 3 | public class BaseController { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/method/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.method; 2 | 3 | public class BaseController { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/service/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.service; 2 | 3 | public class BaseController { 4 | } 5 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/utility/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.utility; 2 | 3 | public class BaseController { 4 | } 5 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-refrect-api/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/object1/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.object1; 2 | 3 | public class BaseController { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/object2/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.object2; 2 | 3 | public class BaseController { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/messages.properties: -------------------------------------------------------------------------------- 1 | label./images/food=Food Photos 2 | label./images/animal=Animal Photos 3 | label./images/landscape=Landscape Photos 4 | -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/landscape/landscape-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/landscape/landscape-1.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/landscape/landscape-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/landscape/landscape-2.jpg -------------------------------------------------------------------------------- /goodcode10/src/main/webapp/images/landscape/landscape-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode10/src/main/webapp/images/landscape/landscape-3.jpg -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/twitter/TwitterAPI.java: -------------------------------------------------------------------------------- 1 | package goodcode.twitter; 2 | 3 | public interface TwitterAPI { 4 | public Tweet[] getTimeline(); 5 | } 6 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/converter/Converter.java: -------------------------------------------------------------------------------- 1 | package goodcode.converter; 2 | 3 | public interface Converter { 4 | Object convert(Object value); 5 | } 6 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/constant1/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.constant1; 2 | 3 | 4 | public class BaseController { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/constant2/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.constant2; 2 | 3 | 4 | public class BaseController { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-packaging-framework/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode12-packaging-application/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agata/goodcode/HEAD/goodcode12-packaging-application/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /goodcode12-step3/src/main/resources/route.properties: -------------------------------------------------------------------------------- 1 | /login.action=app.action.LoginAction 2 | /loginProcess.action=app.action.LoginProcessAction 3 | /list.action=app.action.ListAction -------------------------------------------------------------------------------- /goodcode12-step4/src/main/resources/route.properties: -------------------------------------------------------------------------------- 1 | /login.action=app.action.LoginAction 2 | /loginProcess.action=app.action.LoginProcessAction 3 | /list.action=app.action.ListAction -------------------------------------------------------------------------------- /goodcode10/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | messages: 5 | basename: messages 6 | cache-duration: -1 7 | encoding: UTF-8 8 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/calc/Calc.java: -------------------------------------------------------------------------------- 1 | package goodcode.calc; 2 | 3 | public class Calc { 4 | public static int plus(int a, int b) { 5 | return a + b; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/resources/route.properties: -------------------------------------------------------------------------------- 1 | /login.action=app.action.LoginAction 2 | /loginProcess.action=app.action.LoginProcessAction 3 | /list.action=app.action.ListAction -------------------------------------------------------------------------------- /goodcode09/src/main/resources/schema.sql: -------------------------------------------------------------------------------- 1 | create table account (id identity, name varchar, primary key (id)); 2 | create table todo (id identity, account_id integer, content varchar, primary key (id)); 3 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/util/Strings.java: -------------------------------------------------------------------------------- 1 | package goodcode.util; 2 | 3 | public class Strings { 4 | public static boolean isEmpty(String str) { 5 | return str == null || str.length() == 0; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /goodcode11/data.txt: -------------------------------------------------------------------------------- 1 | 20081101user1 user1@examples.com 0001020081101user2 user2@examples.com 0000020081101user3 user3@examples.com 0010020081102user4 user4@examples.com 0008020081102user5 user5@examples.com 00055 2 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/converter/TrimConverter.java: -------------------------------------------------------------------------------- 1 | package goodcode.converter; 2 | 3 | public class TrimConverter implements Converter { 4 | public Object convert(Object value) { 5 | return value.toString().trim(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/calc/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.calc; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println(Calc.plus(1, 2)); 6 | System.out.println(Calc.plus(5, -7)); 7 | } 8 | } -------------------------------------------------------------------------------- /goodcode05/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode06/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode08/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode09/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode10/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode11/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/converter/IntegerConverter.java: -------------------------------------------------------------------------------- 1 | package goodcode.converter; 2 | 3 | 4 | public class IntegerConverter implements Converter { 5 | public Object convert(Object value) { 6 | return Integer.parseInt(value.toString()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/inheritance/BaseController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.inheritance; 2 | 3 | public class BaseController { 4 | protected boolean isEmpty(String str) { 5 | return str == null || str.length() == 0; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /goodcode12-step1/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode12-step2/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode12-step3/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode12-step4/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode07/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "goodcode10-data-structure", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "step1": "node src/step1.js", 7 | "step3": "node src/step3.js" 8 | }, 9 | "author": "", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/entity/Item.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class Item { 4 | private String name; 5 | 6 | public String getName() { 7 | return name; 8 | } 9 | 10 | public void setName(String name) { 11 | this.name = name; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/exception/NotFoundException.java: -------------------------------------------------------------------------------- 1 | package goodcode.exception; 2 | 3 | import org.springframework.http.HttpStatus; 4 | import org.springframework.web.bind.annotation.ResponseStatus; 5 | 6 | @ResponseStatus(HttpStatus.NOT_FOUND) 7 | public class NotFoundException extends RuntimeException { 8 | } -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/servlet/Action.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | abstract public class Action { 7 | abstract public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception; 8 | } 9 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/servlet/Action.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | abstract public class Action { 7 | abstract public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception; 8 | } 9 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/data.sql: -------------------------------------------------------------------------------- 1 | insert into account values (10000, 'user1'); 2 | insert into account values (10001, 'user2'); 3 | insert into account values (10002, 'user3'); 4 | 5 | insert into todo values (1, 10000, 'ToDo1'); 6 | insert into todo values (2, 10001, 'ToDo2'); 7 | insert into todo values (3, 10002, 'ToDo3'); 8 | -------------------------------------------------------------------------------- /goodcode07/src/README.md: -------------------------------------------------------------------------------- 1 | # 前準備 2 | 3 | 1. node 12以上をセットアップする 4 | 5 | # 実行方法 6 | 7 | ## Step1の実行 8 | 9 | ``` 10 | npm run step1 11 | ``` 12 | 13 | または 14 | 15 | ``` 16 | node src/step1.js 17 | ``` 18 | 19 | ## Step2の実行 20 | 21 | ``` 22 | npm run step2 23 | ``` 24 | 25 | または 26 | 27 | ``` 28 | node src/step2.js 29 | ``` 30 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/cache/ItemRepository.java: -------------------------------------------------------------------------------- 1 | package goodcode.cache; 2 | 3 | import goodcode.entity.Item; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface ItemRepository extends JpaRepository {} 9 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/entity/User.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class User { 4 | private String name; 5 | public User(String name) { 6 | this.name = name; 7 | } 8 | public String getName() { 9 | return name; 10 | } 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/action/LoginAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import app.servlet.Action; 4 | 5 | public class LoginAction extends Action { 6 | 7 | private static final long serialVersionUID = -6306293372378163108L; 8 | 9 | @Override 10 | public void execute() throws Exception { 11 | forward("/login.jsp"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /goodcode09/src/test/java/goodcode/calc/CalcTest.java: -------------------------------------------------------------------------------- 1 | package goodcode.calc; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.assertEquals; 5 | 6 | public class CalcTest { 7 | @Test 8 | public void testPlus() { 9 | assertEquals(3, Calc.plus(1, 2)); 10 | assertEquals(-2, Calc.plus(5, -7)); 11 | } 12 | } -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/util/FileUtil.java: -------------------------------------------------------------------------------- 1 | package goodcode.util; 2 | 3 | import java.io.File; 4 | 5 | public class FileUtil { 6 | public static long sizeOfFiles(File[] files) { 7 | long totalSize = 0; 8 | for (File file : files) { 9 | totalSize += file.length(); 10 | } 11 | return totalSize; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/twitter/TwitterAPIImpl.java: -------------------------------------------------------------------------------- 1 | package goodcode.twitter; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | // (2)Twitter APIへアクセスする実装コード 6 | @Component 7 | public class TwitterAPIImpl implements TwitterAPI { 8 | //...(実際のTwitterへアクセスするコード) 9 | @Override 10 | public Tweet[] getTimeline() { 11 | return null; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/java/app/action/LoginAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import framework.Action; 4 | 5 | public class LoginAction extends Action { 6 | 7 | private static final long serialVersionUID = -6306293372378163108L; 8 | 9 | @Override 10 | public void execute() throws Exception { 11 | forward("/login.jsp"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/controllers/IndexController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | @Controller 7 | @RequestMapping("/") 8 | public class IndexController { 9 | 10 | public String index() { 11 | return "index"; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/controllers/IndexController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | @Controller 7 | @RequestMapping("/") 8 | public class IndexController { 9 | 10 | public String index() { 11 | return "index"; 12 | } 13 | } -------------------------------------------------------------------------------- /goodcode05/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | 2 | spring: 3 | # Templates reloading during development 4 | thymeleaf: 5 | prefix: file:src/main/resources/templates/ 6 | cache: false 7 | 8 | # Static resources reloading during development 9 | resources: 10 | static-locations: file:src/main/resources/static/ 11 | cache: 12 | period: 0 -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/service/LicenseService.java: -------------------------------------------------------------------------------- 1 | package goodcode.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class LicenseService { 7 | // 指定されたユーザがItemを生成できるか? 8 | public boolean canCreateItem(Integer accountId) { 9 | // データベースアクセスを行ったりして判定する処理が入る 10 | // ... 11 | return true; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | 2 | spring: 3 | # Templates reloading during development 4 | thymeleaf: 5 | prefix: file:src/main/resources/templates/ 6 | cache: false 7 | 8 | # Static resources reloading during development 9 | resources: 10 | static-locations: file:src/main/resources/static/ 11 | cache: 12 | period: 0 -------------------------------------------------------------------------------- /goodcode10/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | 2 | spring: 3 | # Templates reloading during development 4 | thymeleaf: 5 | prefix: file:src/main/resources/templates/ 6 | cache: false 7 | 8 | # Static resources reloading during development 9 | resources: 10 | static-locations: file:src/main/resources/static/ 11 | cache: 12 | period: 0 -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/controllers/step1/RootController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.step1; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | @Controller 7 | @RequestMapping("/") 8 | public class RootController { 9 | 10 | public String index() { 11 | return "index"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/twitter/Tweet.java: -------------------------------------------------------------------------------- 1 | package goodcode.twitter; 2 | 3 | public class Tweet { 4 | 5 | private final String id; 6 | private final String text; 7 | 8 | public Tweet(String id, String text) { 9 | this.id = id; 10 | this.text = text; 11 | } 12 | 13 | public String getId() { 14 | return id; 15 | } 16 | 17 | public String getText() { 18 | return text; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/Goodcode08Application.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Goodcode08Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Goodcode08Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/static/css/default.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | background-color: #2d9100; 3 | background-repeat: repeat; 4 | padding-top: 10px; 5 | padding-left: 20px; 6 | padding-right: 20px; 7 | padding-bottom: 10px; 8 | margin-top: 0px; 9 | margin-bottom: 0px; 10 | clear: both; 11 | border: none; 12 | } 13 | 14 | .fieldError { 15 | background-color:pink; 16 | } 17 | 18 | #errors { 19 | color:red; 20 | } 21 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/static/css/default.css: -------------------------------------------------------------------------------- 1 | #banner { 2 | background-color: #2d9100; 3 | background-repeat: repeat; 4 | padding-top: 10px; 5 | padding-left: 20px; 6 | padding-right: 20px; 7 | padding-bottom: 10px; 8 | margin-top: 0px; 9 | margin-bottom: 0px; 10 | clear: both; 11 | border: none; 12 | } 13 | 14 | .fieldError { 15 | background-color:pink; 16 | } 17 | 18 | #errors { 19 | color:red; 20 | } 21 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/inheritance/ListController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.inheritance; 2 | 3 | import goodcode.entity.Item; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class ListController extends BaseController { 8 | public String getItemName(Item item) { 9 | return isEmpty(item.getName()) ? "商品名未設定" : item.getName(); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/Goodcode09Application.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Goodcode09Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Goodcode09Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/FQCNGenerator.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.beans.factory.config.BeanDefinition; 4 | import org.springframework.context.annotation.AnnotationBeanNameGenerator; 5 | 6 | public class FQCNGenerator extends AnnotationBeanNameGenerator { 7 | 8 | @Override 9 | protected String buildDefaultBeanName(BeanDefinition definition) { 10 | return definition.getBeanClassName(); 11 | } 12 | } -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/FQCNGenerator.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.beans.factory.config.BeanDefinition; 4 | import org.springframework.context.annotation.AnnotationBeanNameGenerator; 5 | 6 | public class FQCNGenerator extends AnnotationBeanNameGenerator { 7 | 8 | @Override 9 | protected String buildDefaultBeanName(BeanDefinition definition) { 10 | return definition.getBeanClassName(); 11 | } 12 | } -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/FQCNGenerator.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.beans.factory.config.BeanDefinition; 4 | import org.springframework.context.annotation.AnnotationBeanNameGenerator; 5 | 6 | public class FQCNGenerator extends AnnotationBeanNameGenerator { 7 | 8 | @Override 9 | protected String buildDefaultBeanName(BeanDefinition definition) { 10 | return definition.getBeanClassName(); 11 | } 12 | } -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/converter/DateConverter.java: -------------------------------------------------------------------------------- 1 | package goodcode.converter; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | 6 | public class DateConverter implements Converter { 7 | public Object convert(Object value) { 8 | try { 9 | return new SimpleDateFormat("yyyyMMdd").parse(value.toString()); 10 | } catch (ParseException e) { 11 | throw new RuntimeException(e); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/object2/FolderController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.object2; 2 | 3 | import goodcode.entity.Folder; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class FolderController extends BaseController { 8 | public void store(Folder folder) { 9 | if (folder.isShared()) { 10 | // ... 11 | } 12 | // ... 13 | if (folder.isShared()) { 14 | // ... 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/utility/ListController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.utility; 2 | 3 | import static goodcode.util.Strings.isEmpty; 4 | import goodcode.entity.Item; 5 | import org.springframework.stereotype.Controller; 6 | 7 | @Controller 8 | public class ListController extends BaseController { 9 | public String getItemName(Item item) { 10 | return isEmpty(item.getName()) ? "商品名未設定" : item.getName(); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/inheritance/StoreController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.inheritance; 2 | 3 | import goodcode.entity.Account; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class StoreController extends BaseController { 8 | public void store(Account account) { 9 | if (isEmpty(account.getFirstName()) 10 | || isEmpty(account.getLastName())) { 11 | return; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Goodcode05Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Goodcode06Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Goodcode08Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Goodcode08Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/entity/Account.java: -------------------------------------------------------------------------------- 1 | 2 | package goodcode.entity; 3 | 4 | /** 5 | * アカウントのエンティティクラス 6 | */ 7 | public class Account { 8 | 9 | private Integer id; 10 | private String name; 11 | 12 | public Integer getId() { 13 | return id; 14 | } 15 | 16 | public void setId(final Integer id) { 17 | this.id = id; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(final String name) { 25 | this.name = name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/entity/Division.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class Division { 4 | private String id; 5 | private String name; 6 | public Division(String id, String name) { 7 | this.id = id; 8 | this.name = name; 9 | } 10 | public String getId() { 11 | return id; 12 | } 13 | public void setId(String id) { 14 | this.id = id; 15 | } 16 | public String getName() { 17 | return name; 18 | } 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /goodcode05/src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Xml API 6 | 7 | 8 |

Xml API

9 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/entity/Account.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class Account { 4 | private String firstName; 5 | private String lastName; 6 | 7 | public String getFirstName() { 8 | return firstName; 9 | } 10 | 11 | public void setFirstName(String firstName) { 12 | this.firstName = firstName; 13 | } 14 | 15 | public String getLastName() { 16 | return lastName; 17 | } 18 | 19 | public void setLastName(String lastName) { 20 | this.lastName = lastName; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Goodcode09Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | } 5 | 6 | group = 'goodcode12' 7 | version = '0.0.1-SNAPSHOT' 8 | sourceCompatibility = '15' 9 | 10 | repositories { 11 | jcenter() 12 | } 13 | 14 | configurations { 15 | developmentOnly 16 | runtimeClasspath { 17 | extendsFrom developmentOnly 18 | } 19 | } 20 | 21 | dependencies { 22 | } 23 | 24 | task refrect(type: JavaExec) { 25 | classpath = sourceSets.main.runtimeClasspath 26 | main = 'goodcode.refrect.Main' 27 | } 28 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/Goodcode05Application.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.ComponentScan; 6 | 7 | @SpringBootApplication 8 | @ComponentScan(nameGenerator = FQCNGenerator.class) 9 | public class Goodcode05Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Goodcode05Application.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/Goodcode06Application.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.ComponentScan; 6 | 7 | @SpringBootApplication 8 | @ComponentScan(nameGenerator = FQCNGenerator.class) 9 | public class Goodcode06Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Goodcode06Application.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/utility/StoreController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.utility; 2 | 3 | import static goodcode.util.Strings.isEmpty; 4 | import goodcode.entity.Account; 5 | import org.springframework.stereotype.Controller; 6 | 7 | @Controller 8 | public class StoreController extends BaseController { 9 | public void store(Account account) { 10 | if (isEmpty(account.getFirstName()) 11 | || isEmpty(account.getLastName())) { 12 | return; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/Goodcode08Application.java: -------------------------------------------------------------------------------- 1 | package goodcode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.ComponentScan; 6 | 7 | @SpringBootApplication 8 | @ComponentScan(nameGenerator = FQCNGenerator.class) 9 | public class Goodcode08Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Goodcode08Application.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/action/LoginAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import app.servlet.Action; 7 | 8 | public class LoginAction extends Action { 9 | 10 | private static final long serialVersionUID = -6306293372378163108L; 11 | 12 | @Override 13 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 14 | req.getRequestDispatcher("/login.jsp").forward(req, res); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/action/LoginAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import app.servlet.Action; 7 | 8 | public class LoginAction extends Action { 9 | 10 | private static final long serialVersionUID = -6306293372378163108L; 11 | 12 | @Override 13 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 14 | req.getRequestDispatcher("/login.jsp").forward(req, res); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/templates/todo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

ToDo Detail

11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/constant1/FolderController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.constant1; 2 | 3 | import goodcode.entity.Folder; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class FolderController extends BaseController { 8 | public void store(Folder folder) { 9 | if (folder.type == 0 10 | || folder.type == 1) { 11 | //... 12 | } 13 | //... 14 | if (folder.type == 1) { 15 | //... 16 | } 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/service/TodoService.java: -------------------------------------------------------------------------------- 1 | package goodcode.service; 2 | 3 | import java.util.List; 4 | 5 | import goodcode.entity.Todo; 6 | 7 | /** 8 | * ToDoのサービスクラス 9 | */ 10 | public interface TodoService { 11 | 12 | /** 13 | * IDを指定してToDoを取得します。 14 | * @param id ToDoのID 15 | * @return 取得したToDo。対象のToDoが存在しない場合null 16 | */ 17 | Todo findById(Integer id); 18 | 19 | /** 20 | * アカウントIDを指定してToDoのリストを取得します。 21 | * @param accountId 22 | * @return ToDoのリスト 23 | */ 24 | List findByAccountId(Integer accountId); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /goodcode09/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | out/ 23 | !**/src/main/**/out/ 24 | !**/src/test/**/out/ 25 | 26 | ### NetBeans ### 27 | /nbproject/private/ 28 | /nbbuild/ 29 | /dist/ 30 | /nbdist/ 31 | /.nb-gradle/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | -------------------------------------------------------------------------------- /goodcode12-step1/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id "org.gretty" version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | } 26 | -------------------------------------------------------------------------------- /goodcode12-step2/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id "org.gretty" version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | } 26 | -------------------------------------------------------------------------------- /goodcode12-step3/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id "org.gretty" version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | } 26 | -------------------------------------------------------------------------------- /goodcode12-step4/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id "org.gretty" version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | } 26 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

ToDo Application

11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/src/main/java/goodcode/refrect/Employee.java: -------------------------------------------------------------------------------- 1 | package goodcode.refrect; 2 | 3 | public class Employee { 4 | 5 | private Integer id; 6 | private String name; 7 | 8 | public Employee(Integer id, String name) { 9 | this.id = id; 10 | this.name = name; 11 | } 12 | 13 | public Integer getId() { 14 | return id; 15 | } 16 | 17 | public void setId(Integer id) { 18 | this.id = id; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id 'org.gretty' version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | } 26 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/converter/DateConverter2.java: -------------------------------------------------------------------------------- 1 | package goodcode.converter; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | 6 | public class DateConverter2 implements Converter { 7 | 8 | private final String pattern; 9 | 10 | public DateConverter2(String pattern) { 11 | this.pattern = pattern; 12 | } 13 | 14 | public Object convert(Object value) { 15 | try { 16 | return new SimpleDateFormat(pattern).parse(value.toString()); 17 | } catch (ParseException e) { 18 | throw new RuntimeException(e); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /goodcode05/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode06/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode08/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode10/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode11/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode11/src/main/assembly/executable.xml: -------------------------------------------------------------------------------- 1 | 2 | executable 3 | 4 | zip 5 | 6 | 7 | 8 | target 9 | / 10 | 11 | *.jar 12 | 13 | 14 | 15 | 16 | 17 | false 18 | runtime 19 | / 20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode12-step1/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode12-step2/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode12-step3/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode12-step4/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/util/ByteArray.java: -------------------------------------------------------------------------------- 1 | package goodcode.util; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | 5 | public class ByteArray { 6 | 7 | private final byte[] bytes; 8 | 9 | public ByteArray(byte[] bytes) { 10 | this.bytes = bytes; 11 | } 12 | 13 | public int getLength() { 14 | return bytes.length; 15 | } 16 | 17 | public String getString(int index, int length) { 18 | return new String(getBytes(index, length)); 19 | } 20 | 21 | public byte[] getBytes(int index, int length) { 22 | return ArrayUtils.subarray(this.bytes, index, index + length); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/action/ListAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import app.entity.Todo; 7 | import app.servlet.Action; 8 | 9 | public class ListAction extends Action { 10 | 11 | @Override 12 | public void execute() throws Exception { 13 | // ToDoリストの作成、実際はDBなどから取得する 14 | List todoList = new ArrayList(); 15 | todoList.add(new Todo("原稿を仕上げる", "締め切りは6/1日")); 16 | todoList.add(new Todo("髪を切る", "パーマかけようかな")); 17 | request.setAttribute("todoList", todoList); 18 | forward("/list.jsp"); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/templates/timeline.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

Timeline

11 |
    12 |
  • 13 | 14 |
  • 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/method/StoreController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.method; 2 | 3 | import goodcode.entity.Account; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class StoreController extends BaseController { 8 | public void store(Account account) { 9 | if (isEmpty(account.getFirstName()) 10 | || isEmpty(account.getLastName())) { 11 | return; 12 | } 13 | } 14 | // 重複部分をメソッドとして抽出 15 | private boolean isEmpty(String str) { 16 | return str == null || str.length() == 0; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/java/app/action/ListAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import app.entity.Todo; 7 | import framework.Action; 8 | 9 | public class ListAction extends Action { 10 | 11 | @Override 12 | public void execute() throws Exception { 13 | // ToDoリストの作成、実際はDBなどから取得する 14 | List todoList = new ArrayList(); 15 | todoList.add(new Todo("原稿を仕上げる", "締め切りは6/1日")); 16 | todoList.add(new Todo("髪を切る", "パーマかけようかな")); 17 | request.setAttribute("todoList", todoList); 18 | forward("/list.jsp"); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | target 8 | bin 9 | .DS_Store 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | .sts4-cache 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/first/StoreController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.first; 2 | 3 | import goodcode.entity.Account; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class StoreController extends BaseController { 8 | public void store(Account account) { 9 | if (account.getFirstName() == null 10 | || account.getFirstName().length() == 0) { 11 | return; 12 | } 13 | if (account.getLastName() == null 14 | || account.getLastName().length() == 0) { 15 | return; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /goodcode12-step1/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | ログイン画面 13 | 14 | 15 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | ログイン画面 13 | 14 | 15 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | ログイン画面 13 | 14 | 15 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | ログイン画面 13 | 14 | 15 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/templates/list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

ToDo List

11 |
    12 |
  • 13 | 14 |
  • 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/advanced/Converters.java: -------------------------------------------------------------------------------- 1 | package goodcode.advanced; 2 | 3 | import goodcode.converter.Converter; 4 | import goodcode.converter.DateConverter; 5 | import goodcode.converter.DateConverter2; 6 | import goodcode.converter.IntegerConverter; 7 | import goodcode.converter.TrimConverter; 8 | 9 | public class Converters { 10 | public static Converter trim = new TrimConverter(); 11 | public static Converter date = new DateConverter(); 12 | public static Converter date(String pattern) { 13 | return new DateConverter2(pattern); 14 | } 15 | public static Converter integer = new IntegerConverter(); 16 | } -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/service/ItemController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.service; 2 | 3 | import goodcode.service.LicenseService; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class ItemController extends BaseController { 8 | private LicenseService licenseService = new LicenseService(); 9 | 10 | public void createItem() { 11 | // ライセンスチェックをサービスで行う 12 | if (!licenseService.canCreateItem(getAccountId())) { 13 | return; 14 | } 15 | // Itemを作成する処理 16 | // ... 17 | } 18 | 19 | private Integer getAccountId() { 20 | // 実際はログインしているユーザーのIDを返す 21 | return 1; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | ログイン画面 13 | 14 | 15 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/entity/Folder.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | public class Folder { 4 | public static final int TYPE_NORMAL = 0; 5 | public static final int TYPE_SHARED = 1; 6 | public int type; 7 | public String name; 8 | 9 | public int getType() { 10 | return type; 11 | } 12 | 13 | public void setType(int type) { 14 | this.type = type; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | // 共有フォルダか?(自分自身の値を参照) 26 | public boolean isShared() { 27 | return type == TYPE_SHARED; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /goodcode07/src/reservation-service.js: -------------------------------------------------------------------------------- 1 | const reservations = [ 2 | { 3 | date: '2022-10-10', 4 | start_time: 1000, 5 | end_time: 1100, 6 | count: 2, 7 | limit: 2, 8 | }, 9 | { 10 | date: '2022-10-10', 11 | start_time: 1100, 12 | end_time: 1200, 13 | count: 0, 14 | limit: 2, 15 | }, 16 | { 17 | date: '2022-10-11', 18 | start_time: 1000, 19 | end_time: 1100, 20 | count: 1, 21 | limit: 2, 22 | }, 23 | ]; 24 | 25 | const getReservations = () => { 26 | return reservations; 27 | }; 28 | 29 | module.exports = { 30 | getReservations, 31 | }; -------------------------------------------------------------------------------- /goodcode12-step1/src/main/java/app/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package app.entity; 2 | 3 | public class Todo { 4 | 5 | private String title; 6 | private String description; 7 | 8 | public Todo() { 9 | } 10 | 11 | public Todo(String title, String description) { 12 | this.title = title; 13 | this.description = description; 14 | } 15 | 16 | public String getTitle() { 17 | return title; 18 | } 19 | 20 | public void setTitle(String titile) { 21 | this.title = titile; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package app.entity; 2 | 3 | public class Todo { 4 | 5 | private String title; 6 | private String description; 7 | 8 | public Todo() { 9 | } 10 | 11 | public Todo(String title, String description) { 12 | this.title = title; 13 | this.description = description; 14 | } 15 | 16 | public String getTitle() { 17 | return title; 18 | } 19 | 20 | public void setTitle(String titile) { 21 | this.title = titile; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package app.entity; 2 | 3 | public class Todo { 4 | 5 | private String title; 6 | private String description; 7 | 8 | public Todo() { 9 | } 10 | 11 | public Todo(String title, String description) { 12 | this.title = title; 13 | this.description = description; 14 | } 15 | 16 | public String getTitle() { 17 | return title; 18 | } 19 | 20 | public void setTitle(String titile) { 21 | this.title = titile; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package app.entity; 2 | 3 | public class Todo { 4 | 5 | private String title; 6 | private String description; 7 | 8 | public Todo() { 9 | } 10 | 11 | public Todo(String title, String description) { 12 | this.title = title; 13 | this.description = description; 14 | } 15 | 16 | public String getTitle() { 17 | return title; 18 | } 19 | 20 | public void setTitle(String titile) { 21 | this.title = titile; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /goodcode12-step1/src/main/java/app/servlet/LoginDisplayServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | public class LoginDisplayServlet extends HttpServlet { 11 | 12 | private static final long serialVersionUID = -6306293372378163108L; 13 | 14 | @Override 15 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 16 | throws ServletException, IOException { 17 | req.getRequestDispatcher("/login.jsp").forward(req, res); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | id "org.gretty" version "3.0.3" 5 | } 6 | 7 | group = 'goodcode12' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | jcenter() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | compile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 24 | compile group: 'javax.servlet', name: 'jstl', version: '1.2' 25 | compile files('../goodcode12-packaging-framework/build/libs/goodcode12-0.0.1-SNAPSHOT.jar') 26 | } 27 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/java/app/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package app.entity; 2 | 3 | public class Todo { 4 | 5 | private String title; 6 | private String description; 7 | 8 | public Todo() { 9 | } 10 | 11 | public Todo(String title, String description) { 12 | this.title = title; 13 | this.description = description; 14 | } 15 | 16 | public String getTitle() { 17 | return title; 18 | } 19 | 20 | public void setTitle(String titile) { 21 | this.title = titile; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/constant2/FolderController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.constant2; 2 | 3 | import goodcode.entity.Folder; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class FolderController extends BaseController { 8 | // 定数を定義(特定の値を集約している) 9 | public static final int TYPE_NORMAL = 0; 10 | public static final int TYPE_SHARED = 1; 11 | public void store(Folder folder) { 12 | if (folder.type == TYPE_NORMAL 13 | || folder.type == TYPE_SHARED) { 14 | //... 15 | } 16 | //... 17 | if (folder.type == TYPE_SHARED) { 18 | //... 19 | } 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /goodcode05/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | id 'eclipse' 6 | } 7 | 8 | group = 'goodcode05' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '15' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | configurations { 17 | developmentOnly 18 | runtimeClasspath { 19 | extendsFrom developmentOnly 20 | } 21 | } 22 | 23 | dependencies { 24 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 25 | implementation 'org.springframework.boot:spring-boot-starter-web' 26 | developmentOnly "org.springframework.boot:spring-boot-devtools" 27 | } 28 | -------------------------------------------------------------------------------- /goodcode06/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | id 'eclipse' 6 | } 7 | 8 | group = 'goodcode06' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '15' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | configurations { 17 | developmentOnly 18 | runtimeClasspath { 19 | extendsFrom developmentOnly 20 | } 21 | } 22 | 23 | dependencies { 24 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 25 | implementation 'org.springframework.boot:spring-boot-starter-web' 26 | developmentOnly "org.springframework.boot:spring-boot-devtools" 27 | } 28 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/cache/ListController.java: -------------------------------------------------------------------------------- 1 | package goodcode.cache; 2 | 3 | import goodcode.entity.Item; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Controller; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * リスト8.3 毎回データベースに問い合わせているコード 11 | * このコードはサンプルですので、実行はできません。 12 | * 13 | * @author agata 14 | * 15 | */ 16 | @Controller 17 | public class ListController { 18 | @Autowired 19 | public ItemRepository itemRepository; 20 | 21 | public String index() { 22 | return "index"; 23 | } 24 | 25 | // コード中から何度か呼ばれる可能性があるメソッド 26 | public List getItems() { 27 | // データベースアクセス! 28 | return itemRepository.findAll(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /goodcode10/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | id 'eclipse' 6 | } 7 | 8 | group = 'goodcode10' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '15' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | configurations { 17 | developmentOnly 18 | runtimeClasspath { 19 | extendsFrom developmentOnly 20 | } 21 | } 22 | 23 | dependencies { 24 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 25 | implementation 'org.springframework.boot:spring-boot-starter-web' 26 | developmentOnly "org.springframework.boot:spring-boot-devtools" 27 | } 28 | -------------------------------------------------------------------------------- /goodcode06/src/main/java/goodcode/controllers/object1/FolderController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.object1; 2 | 3 | import goodcode.entity.Folder; 4 | import org.springframework.stereotype.Controller; 5 | 6 | @Controller 7 | public class FolderController extends BaseController { 8 | public static final int TYPE_NORMAL = 0; 9 | public static final int TYPE_SHARED = 1; 10 | public void store(Folder folder) { 11 | if (isSharedFolder(folder)) { 12 | //... 13 | } 14 | //... 15 | if (isSharedFolder(folder)) { 16 | //... 17 | } 18 | } 19 | // 共有フォルダか?(folderの値を参照) 20 | public boolean isSharedFolder(Folder folder) { 21 | return folder.type == TYPE_SHARED; 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Image File List

13 |

Controllers

14 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/controllers/TimelineController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.ui.Model; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | 8 | import goodcode.twitter.Tweet; 9 | import goodcode.twitter.TwitterAPI; 10 | 11 | @Controller 12 | public class TimelineController { 13 | @Autowired 14 | TwitterAPI twitterAPI; 15 | 16 | @RequestMapping("/timeline") 17 | public String index(Model model) { 18 | // ここの呼び出しが環境依存 19 | Tweet[] tweets = twitterAPI.getTimeline(); 20 | model.addAttribute("tweets", tweets); 21 | return "timeline"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/action/ListAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | import app.entity.Todo; 10 | import app.servlet.Action; 11 | 12 | public class ListAction extends Action { 13 | 14 | @Override 15 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 16 | // ToDoリストの作成、実際はDBなどから取得する 17 | List todoList = new ArrayList(); 18 | todoList.add(new Todo("原稿を仕上げる", "締め切りは6/1日")); 19 | todoList.add(new Todo("髪を切る", "パーマかけようかな")); 20 | req.setAttribute("todoList", todoList); 21 | req.getRequestDispatcher("/list.jsp").forward(req, res); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/action/ListAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | import app.entity.Todo; 10 | import app.servlet.Action; 11 | 12 | public class ListAction extends Action { 13 | 14 | @Override 15 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 16 | // ToDoリストの作成、実際はDBなどから取得する 17 | List todoList = new ArrayList(); 18 | todoList.add(new Todo("原稿を仕上げる", "締め切りは6/1日")); 19 | todoList.add(new Todo("髪を切る", "パーマかけようかな")); 20 | req.setAttribute("todoList", todoList); 21 | req.getRequestDispatcher("/list.jsp").forward(req, res); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/templates/step4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Image File List

13 |
14 |

(KB)

15 |
    16 |
  • 17 |
18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/advanced/Field.java: -------------------------------------------------------------------------------- 1 | package goodcode.advanced; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import goodcode.converter.Converter; 8 | 9 | public class Field { 10 | public final String name; 11 | public final int length; 12 | public final List converters = new ArrayList(); 13 | 14 | public Field(String name, int length) { 15 | this.name = name; 16 | this.length = length; 17 | } 18 | 19 | public Field to(Converter ...converters) { 20 | this.converters.addAll(Arrays.asList(converters)); 21 | return this; 22 | } 23 | 24 | public static Field field(String name, int length) { 25 | return new Field(name, length); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | DispatcherServlet 8 | app.servlet.DispatcherServlet 9 | 10 | 11 | DispatcherServlet 12 | *.action 13 | 14 | 15 | 16 | index.jsp 17 | 18 | 19 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | DispatcherServlet 8 | app.servlet.DispatcherServlet 9 | 10 | 11 | DispatcherServlet 12 | *.action 13 | 14 | 15 | 16 | index.jsp 17 | 18 | 19 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | DispatcherServlet 8 | app.servlet.DispatcherServlet 9 | 10 | 11 | DispatcherServlet 12 | *.action 13 | 14 | 15 | 16 | index.jsp 17 | 18 | 19 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/auth/LoginAccount.java: -------------------------------------------------------------------------------- 1 | package goodcode.auth; 2 | 3 | import java.io.Serializable; 4 | 5 | import org.springframework.context.annotation.Scope; 6 | import org.springframework.context.annotation.ScopedProxyMode; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * ログインしたアカウントの情報を保持 11 | */ 12 | @Component 13 | @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 14 | public class LoginAccount implements Serializable { 15 | 16 | private static final long serialVersionUID = -7130172810343042084L; 17 | 18 | private Integer accountId; 19 | 20 | public void setAccountId(Integer accountId) { 21 | this.accountId = accountId; 22 | } 23 | 24 | public Integer getAccountId() { 25 | return this.accountId; 26 | } 27 | } -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | DispatcherServlet 8 | framework.DispatcherServlet 9 | 10 | 11 | DispatcherServlet 12 | *.action 13 | 14 | 15 | 16 | index.jsp 17 | 18 | 19 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/src/main/java/goodcode/refrect/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.refrect; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | /** 6 | * Column:JavaのリフレクションAPI 7 | */ 8 | public class Main { 9 | public static void main(String[] args) throws Exception { 10 | Employee emp = new Employee(1, "田中一郎"); 11 | String[] propNames = {"id", "name"}; 12 | for (String propName : propNames) { 13 | // プロパティ名をメソッド名に変換(name -> getName) 14 | String methodName = "get" + 15 | propName.substring(0, 1).toUpperCase() + 16 | propName.substring(1); 17 | // メソッド名からメソッドオブジェクトを取得 18 | Method m = emp.getClass().getMethod(methodName); 19 | // メソッドを実行 20 | Object result = m.invoke(emp); 21 | // 戻り値の値を出力 22 | System.out.println(propName + "=" + result); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /goodcode12-step1/src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

一覧画面

14 |
    15 | 16 |
  • -
  • 17 |
    18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

一覧画面

14 |
    15 | 16 |
  • -
  • 17 |
    18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

一覧画面

14 |
    15 | 16 |
  • -
  • 17 |
    18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

一覧画面

14 |
    15 | 16 |
  • -
  • 17 |
    18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

一覧画面

14 |
    15 | 16 |
  • -
  • 17 |
    18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/service/UserService.java: -------------------------------------------------------------------------------- 1 | package goodcode.service; 2 | 3 | import goodcode.entity.Division; 4 | import goodcode.entity.User; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | @Service 11 | public class UserService { 12 | 13 | public List getUsers() { 14 | List users = new ArrayList(); 15 | users.add(new User("user1")); 16 | users.add(new User("user2")); 17 | users.add(new User("user3")); 18 | users.add(new User("user4")); 19 | users.add(new User("user5")); 20 | return users; 21 | } 22 | 23 | public List getDivisions() { 24 | List divs = new ArrayList(); 25 | divs.add(new Division("1", "div1")); 26 | divs.add(new Division("2", "div2")); 27 | divs.add(new Division("3", "div3")); 28 | return divs; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/entity/Todo.java: -------------------------------------------------------------------------------- 1 | package goodcode.entity; 2 | 3 | /** 4 | * ToDoのエンティティクラス 5 | */ 6 | public class Todo { 7 | 8 | private Integer id; 9 | private Integer accountId; 10 | private String content; 11 | 12 | public Todo() { 13 | } 14 | 15 | public Todo(Integer id, Integer accountId, String content) { 16 | this.id = id; 17 | this.accountId = accountId; 18 | this.content = content; 19 | } 20 | 21 | public Integer getId() { 22 | return id; 23 | } 24 | 25 | public void setId(Integer id) { 26 | this.id = id; 27 | } 28 | 29 | public Integer getAccountId() { 30 | return accountId; 31 | } 32 | 33 | public void setAccountId(Integer accountId) { 34 | this.accountId = accountId; 35 | } 36 | 37 | public String getContent() { 38 | return content; 39 | } 40 | 41 | public void setContent(String content) { 42 | this.content = content; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /goodcode09/src/main/resources/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

ToDo List

11 |

Login

12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
Account ID
23 |
24 | Account ID : 10000 or 10001 or 10002 25 | 26 | 27 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/cache/ListControllerAfter.java: -------------------------------------------------------------------------------- 1 | package goodcode.cache; 2 | 3 | import goodcode.entity.Item; 4 | 5 | import java.util.List; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Controller; 9 | 10 | /** 11 | * リスト8.4 結果をキャッシュして2回目以降のデータベースアクセスを抑制 12 | * このコードはサンプルですので、実行はできません。 13 | * 14 | * @author agata 15 | * 16 | */ 17 | @Controller 18 | public class ListControllerAfter { 19 | @Autowired 20 | public ItemRepository itemRepository; 21 | 22 | private List items; 23 | 24 | public String index() { 25 | return "index"; 26 | } 27 | 28 | // itemsがnullの場合のみデータベースから取得 29 | // それ以外なら取得済みのitemsを返却 30 | public List getItems() { 31 | if (items == null) { 32 | // 初回のみデータベースアクセス! 33 | items = itemRepository.findAll(); 34 | } 35 | return items; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/controllers/TodoListController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import java.util.List; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.ui.Model; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | 12 | import goodcode.auth.LoginAccount; 13 | import goodcode.entity.Todo; 14 | import goodcode.service.TodoService; 15 | 16 | @Controller 17 | public class TodoListController { 18 | 19 | @Autowired 20 | private TodoService todoService; 21 | 22 | @Autowired 23 | private LoginAccount loginAccount; 24 | 25 | @RequestMapping("/list") 26 | public String get(Model model, HttpServletRequest request) { 27 | List todoList = todoService.findByAccountId(loginAccount.getAccountId()); 28 | model.addAttribute("todoList", todoList); 29 | return "list"; 30 | } 31 | } -------------------------------------------------------------------------------- /goodcode12-step1/src/main/java/app/servlet/ListDisplayServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | import javax.servlet.ServletException; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | 12 | import app.entity.Todo; 13 | 14 | public class ListDisplayServlet extends HttpServlet { 15 | 16 | private static final long serialVersionUID = -6306293372378163108L; 17 | 18 | @Override 19 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 20 | throws ServletException, IOException { 21 | // ToDoリストの作成、実際はDBなどから取得する 22 | List todoList = new ArrayList(); 23 | todoList.add(new Todo("原稿を仕上げる", "締め切りは6/1日")); 24 | todoList.add(new Todo("髪を切る", "パーマかけようかな")); 25 | req.setAttribute("todoList", todoList); 26 | req.getRequestDispatcher("/list.jsp").forward(req, res); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/templates/step1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Image File List

13 |

Food Photos(KB)

14 |
    15 |
  • 16 |
17 |

Animal Photos(KB)

18 |
    19 |
  • 20 |
21 |

Landscape Photos(KB)

22 |
    23 |
  • 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/templates/step2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Image File List

13 |

Food Photos(KB)

14 |
    15 |
  • 16 |
17 |

Animal Photos(KB)

18 |
    19 |
  • 20 |
21 |

Landscape Photos(KB)

22 |
    23 |
  • 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/servlet/Action.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | abstract public class Action { 10 | 11 | protected HttpServletRequest request; 12 | protected HttpServletResponse response; 13 | 14 | public void setRequest(HttpServletRequest request) { 15 | this.request = request; 16 | } 17 | 18 | public void setResponse(HttpServletResponse response) { 19 | this.response = response; 20 | } 21 | 22 | abstract public void execute() throws Exception; 23 | 24 | protected void forward(String path) throws ServletException, IOException { 25 | request.getRequestDispatcher(path).forward(request, response); 26 | } 27 | 28 | protected void redirect(String path) throws IOException { 29 | response.sendRedirect(path); 30 | } 31 | 32 | protected void error(int statusCode) throws IOException { 33 | response.sendError(statusCode); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/src/main/java/framework/Action.java: -------------------------------------------------------------------------------- 1 | package framework; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | abstract public class Action { 10 | 11 | protected HttpServletRequest request; 12 | protected HttpServletResponse response; 13 | 14 | public void setRequest(HttpServletRequest request) { 15 | this.request = request; 16 | } 17 | 18 | public void setResponse(HttpServletResponse response) { 19 | this.response = response; 20 | } 21 | 22 | abstract public void execute() throws Exception; 23 | 24 | protected void forward(String path) throws ServletException, IOException { 25 | request.getRequestDispatcher(path).forward(request, response); 26 | } 27 | 28 | protected void redirect(String path) throws IOException { 29 | response.sendRedirect(path); 30 | } 31 | 32 | protected void error(int statusCode) throws IOException { 33 | response.sendError(statusCode); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /goodcode10/src/main/resources/templates/step3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Image File List

13 |

Food Photos(KB)

14 |
    15 |
  • 16 |
17 |

Animal Photos(KB)

18 |
    19 |
  • 20 |
21 |

Landscape Photos(KB)

22 |
    23 |
  • 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/controllers/LoginController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RequestMethod; 7 | 8 | import goodcode.auth.LoginAccount; 9 | 10 | @Controller 11 | public class LoginController { 12 | 13 | @Autowired 14 | private LoginAccount loginAccount; 15 | 16 | public static class LoginForm { 17 | public Integer accountId; 18 | 19 | public void setAccountId(Integer accountId) { 20 | this.accountId = accountId; 21 | } 22 | 23 | public Integer getAccountId() { 24 | return this.accountId; 25 | } 26 | } 27 | 28 | @RequestMapping("/login") 29 | public String get(LoginForm form) { 30 | return "login"; 31 | } 32 | 33 | @RequestMapping(value = "/login", method = RequestMethod.POST) 34 | public String post(LoginForm form) { 35 | loginAccount.setAccountId(form.getAccountId()); 36 | return "redirect:/list"; 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /goodcode12-step1/src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

ログイン画面

14 | 15 |
16 |
17 |
18 | ログインID:"/>
19 | パスワード:"/>
20 | 21 |
22 | ※user1/passwordでログインできます。 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

ログイン画面

14 | 15 |
16 |
17 |
18 | ログインID:"/>
19 | パスワード:"/>
20 | 21 |
22 | ※user1/passwordでログインできます。 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

ログイン画面

14 | 15 |
16 |
17 |
18 | ログインID:"/>
19 | パスワード:"/>
20 | 21 |
22 | ※user1/passwordでログインできます。 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

ログイン画面

14 | 15 |
16 |
17 |
18 | ログインID:"/>
19 | パスワード:"/>
20 | 21 |
22 | ※user1/passwordでログインできます。 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /goodcode09/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'goodcode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '15' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | configurations { 16 | developmentOnly 17 | runtimeClasspath { 18 | extendsFrom developmentOnly 19 | } 20 | } 21 | 22 | dependencies { 23 | implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' 24 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 25 | implementation 'org.springframework.boot:spring-boot-starter-web' 26 | runtimeOnly 'com.h2database:h2' 27 | developmentOnly "org.springframework.boot:spring-boot-devtools" 28 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 29 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 30 | } 31 | } 32 | 33 | test { 34 | useJUnitPlatform() 35 | } 36 | 37 | task calc(type: JavaExec) { 38 | classpath = sourceSets.main.runtimeClasspath 39 | main = 'goodcode.calc.Main' 40 | } 41 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

ログイン画面

14 | 15 |
16 |
17 |
18 | ログインID:"/>
19 | パスワード:"/>
20 | 21 |
22 | ※user1/passwordでログインできます。 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/service/impl/TodoServiceImpl.java: -------------------------------------------------------------------------------- 1 | package goodcode.service.impl; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 7 | import org.springframework.jdbc.core.JdbcTemplate; 8 | import org.springframework.stereotype.Service; 9 | 10 | import goodcode.entity.Todo; 11 | import goodcode.service.TodoService; 12 | 13 | /** 14 | * {@link TodoService}の実装クラス 15 | */ 16 | @Service 17 | public class TodoServiceImpl implements TodoService { 18 | 19 | @Autowired 20 | private JdbcTemplate jdbcTemplate; 21 | 22 | @Override 23 | public Todo findById(final Integer id) { 24 | String query = "select * from todo where id = ?"; 25 | return jdbcTemplate.queryForObject(query, new Object[] {id}, new BeanPropertyRowMapper(Todo.class)); 26 | } 27 | 28 | @Override 29 | public List findByAccountId(final Integer accountId) { 30 | String query = "select * from todo where account_id = ?"; 31 | return jdbcTemplate.query(query, new Object[] {accountId}, new BeanPropertyRowMapper(Todo.class)); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/action/LoginProcessAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import app.servlet.Action; 4 | 5 | public class LoginProcessAction extends Action { 6 | 7 | private static final long serialVersionUID = -6306293372378163108L; 8 | 9 | @Override 10 | public void execute() throws Exception { 11 | String loginId = request.getParameter("loginId"); 12 | String password = request.getParameter("password"); 13 | request.setAttribute("loginId", loginId); 14 | request.setAttribute("password", password); 15 | 16 | if (loginId == null || loginId.length() == 0) { 17 | request.setAttribute("errorMessage", "ログインIDは必須です"); 18 | forward("/login.jsp"); 19 | return; 20 | } 21 | if (password == null || password.length() == 0) { 22 | request.setAttribute("errorMessage", "パスワードは必須です"); 23 | request.getRequestDispatcher("/step3/login.jsp").forward(request, response); 24 | return; 25 | } 26 | if (!(loginId.equals("user1") && password.equals("password"))) { 27 | request.setAttribute("errorMessage", "ユーザーIDまたはパスワードが一致しません"); 28 | forward("/login.jsp"); 29 | return; 30 | } 31 | redirect(request.getContextPath() + "/list.action"); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /goodcode08/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | id 'eclipse' 6 | } 7 | 8 | group = 'goodcode08' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '15' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | configurations { 17 | developmentOnly 18 | runtimeClasspath { 19 | extendsFrom developmentOnly 20 | } 21 | } 22 | 23 | dependencies { 24 | implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 25 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 26 | implementation 'org.springframework.boot:spring-boot-starter-web' 27 | developmentOnly "org.springframework.boot:spring-boot-devtools" 28 | } 29 | 30 | task country(type: JavaExec) { 31 | classpath = sourceSets.main.runtimeClasspath 32 | main = 'goodcode.country.Main' 33 | } 34 | 35 | task countryAfter(type: JavaExec) { 36 | classpath = sourceSets.main.runtimeClasspath 37 | main = 'goodcode.country.MainAfter' 38 | } 39 | 40 | task list(type: JavaExec) { 41 | classpath = sourceSets.main.runtimeClasspath 42 | main = 'goodcode.list.Main' 43 | } 44 | 45 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/src/main/java/app/action/LoginProcessAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import framework.Action; 4 | 5 | public class LoginProcessAction extends Action { 6 | 7 | private static final long serialVersionUID = -6306293372378163108L; 8 | 9 | @Override 10 | public void execute() throws Exception { 11 | String loginId = request.getParameter("loginId"); 12 | String password = request.getParameter("password"); 13 | request.setAttribute("loginId", loginId); 14 | request.setAttribute("password", password); 15 | 16 | if (loginId == null || loginId.length() == 0) { 17 | request.setAttribute("errorMessage", "ログインIDは必須です"); 18 | forward("/login.jsp"); 19 | return; 20 | } 21 | if (password == null || password.length() == 0) { 22 | request.setAttribute("errorMessage", "パスワードは必須です"); 23 | request.getRequestDispatcher("/step3/login.jsp").forward(request, response); 24 | return; 25 | } 26 | if (!(loginId.equals("user1") && password.equals("password"))) { 27 | request.setAttribute("errorMessage", "ユーザーIDまたはパスワードが一致しません"); 28 | forward("/login.jsp"); 29 | return; 30 | } 31 | redirect(request.getContextPath() + "/list.action"); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /goodcode09/src/main/java/goodcode/controllers/TodoController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.ui.Model; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | 9 | import goodcode.auth.LoginAccount; 10 | import goodcode.entity.Todo; 11 | import goodcode.exception.NotFoundException; 12 | import goodcode.service.TodoService; 13 | 14 | /** 15 | * ステップ2 画面の実装 16 | */ 17 | @Controller 18 | public class TodoController { 19 | 20 | @Autowired 21 | private TodoService todoService; 22 | 23 | @Autowired 24 | private LoginAccount loginAccount; 25 | 26 | @RequestMapping("/todo/{id}") 27 | public String index(Model model, @PathVariable("id") Integer id) { 28 | Todo todo = todoService.findById(id); 29 | // 自分のToDoのみが閲覧可能 30 | if (todo == null 31 | || !todo.getAccountId().equals(loginAccount.getAccountId())) { 32 | throw new NotFoundException(); 33 | } 34 | model.addAttribute("todo", todo); 35 | return "todo"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/action/LoginProcessAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import app.servlet.Action; 7 | 8 | public class LoginProcessAction extends Action { 9 | 10 | private static final long serialVersionUID = -6306293372378163108L; 11 | 12 | @Override 13 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 14 | String loginId = req.getParameter("loginId"); 15 | String password = req.getParameter("password"); 16 | req.setAttribute("loginId", loginId); 17 | req.setAttribute("password", password); 18 | 19 | if (loginId == null || loginId.length() == 0) { 20 | req.setAttribute("errorMessage", "ログインIDは必須です"); 21 | req.getRequestDispatcher("/login.jsp").forward(req, res); 22 | return; 23 | } 24 | if (password == null || password.length() == 0) { 25 | req.setAttribute("errorMessage", "パスワードは必須です"); 26 | req.getRequestDispatcher("/login.jsp").forward(req, res); 27 | return; 28 | } 29 | if (!(loginId.equals("user1") && password.equals("password"))) { 30 | req.setAttribute("errorMessage", "ユーザーIDまたはパスワードが一致しません"); 31 | req.getRequestDispatcher("/login.jsp").forward(req, res); 32 | return; 33 | } 34 | res.sendRedirect(req.getContextPath() + "/list.action"); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/action/LoginProcessAction.java: -------------------------------------------------------------------------------- 1 | package app.action; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import app.servlet.Action; 7 | 8 | public class LoginProcessAction extends Action { 9 | 10 | private static final long serialVersionUID = -6306293372378163108L; 11 | 12 | @Override 13 | public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception { 14 | String loginId = req.getParameter("loginId"); 15 | String password = req.getParameter("password"); 16 | req.setAttribute("loginId", loginId); 17 | req.setAttribute("password", password); 18 | 19 | if (loginId == null || loginId.length() == 0) { 20 | req.setAttribute("errorMessage", "ログインIDは必須です"); 21 | req.getRequestDispatcher("/login.jsp").forward(req, res); 22 | return; 23 | } 24 | if (password == null || password.length() == 0) { 25 | req.setAttribute("errorMessage", "パスワードは必須です"); 26 | req.getRequestDispatcher("/login.jsp").forward(req, res); 27 | return; 28 | } 29 | if (!(loginId.equals("user1") && password.equals("password"))) { 30 | req.setAttribute("errorMessage", "ユーザーIDまたはパスワードが一致しません"); 31 | req.getRequestDispatcher("/login.jsp").forward(req, res); 32 | return; 33 | } 34 | res.sendRedirect(req.getContextPath() + "/list.action"); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /goodcode11/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'eclipse' 4 | } 5 | 6 | group = 'goodcode11' 7 | version = '0.0.1-SNAPSHOT' 8 | sourceCompatibility = '15' 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | 14 | configurations { 15 | developmentOnly 16 | runtimeClasspath { 17 | extendsFrom developmentOnly 18 | } 19 | } 20 | 21 | dependencies { 22 | compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11' 23 | compile group: 'commons-io', name: 'commons-io', version: '2.8.0' 24 | testCompile group: 'junit', name: 'junit', version: '4.13.1' 25 | } 26 | 27 | task step1(type: JavaExec) { 28 | classpath = sourceSets.main.runtimeClasspath 29 | main = 'goodcode.step1.Main' 30 | } 31 | 32 | task step2(type: JavaExec) { 33 | classpath = sourceSets.main.runtimeClasspath 34 | main = 'goodcode.step2.Main' 35 | } 36 | 37 | task step3(type: JavaExec) { 38 | classpath = sourceSets.main.runtimeClasspath 39 | main = 'goodcode.step3.Main' 40 | } 41 | 42 | task step4(type: JavaExec) { 43 | classpath = sourceSets.main.runtimeClasspath 44 | main = 'goodcode.step4.Main' 45 | } 46 | 47 | task advanced(type: JavaExec) { 48 | classpath = sourceSets.main.runtimeClasspath 49 | main = 'goodcode.advanced.Main' 50 | } 51 | 52 | task refrect(type: JavaExec) { 53 | classpath = sourceSets.main.runtimeClasspath 54 | main = 'goodcode.refrect.Main' 55 | } 56 | -------------------------------------------------------------------------------- /goodcode12-step1/src/main/java/app/servlet/LoginProcessServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | public class LoginProcessServlet extends HttpServlet { 11 | 12 | private static final long serialVersionUID = -6306293372378163108L; 13 | 14 | @Override 15 | protected void doPost(HttpServletRequest req, HttpServletResponse res) 16 | throws ServletException, IOException { 17 | String loginId = req.getParameter("loginId"); 18 | String password = req.getParameter("password"); 19 | req.setAttribute("loginId", loginId); 20 | req.setAttribute("password", password); 21 | 22 | if (loginId == null || loginId.length() == 0) { 23 | req.setAttribute("errorMessage", "ログインIDは必須です"); 24 | req.getRequestDispatcher("/login.jsp").forward(req, res); 25 | return; 26 | } 27 | if (password == null || password.length() == 0) { 28 | req.setAttribute("errorMessage", "パスワードは必須です"); 29 | req.getRequestDispatcher("/login.jsp").forward(req, res); 30 | return; 31 | } 32 | if (!(loginId.equals("user1") && password.equals("password"))) { 33 | req.setAttribute("errorMessage", "ユーザーIDまたはパスワードが一致しません"); 34 | req.getRequestDispatcher("/login.jsp").forward(req, res); 35 | return; 36 | } 37 | res.sendRedirect(req.getContextPath() + "/list.action"); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /goodcode12-step1/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | LoginDisplayServlet 9 | app.servlet.LoginDisplayServlet 10 | 11 | 12 | LoginProcessServlet 13 | app.servlet.LoginProcessServlet 14 | 15 | 16 | ListDisplayServlet 17 | app.servlet.ListDisplayServlet 18 | 19 | 20 | LoginDisplayServlet 21 | /login.action 22 | 23 | 24 | LoginProcessServlet 25 | /loginProcess.action 26 | 27 | 28 | ListDisplayServlet 29 | /list.action 30 | 31 | 32 | 33 | index.jsp 34 | 35 | 36 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/list/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.list; 2 | 3 | import java.util.ArrayList; 4 | import java.util.LinkedList; 5 | import java.util.List; 6 | import java.util.Random; 7 | 8 | @SuppressWarnings("unused") 9 | public class Main { 10 | public static void main(String[] args) { 11 | List arrayList = new ArrayList(); 12 | List linkedList = new LinkedList(); 13 | Random random = new Random(); 14 | long t1 = System.currentTimeMillis(); 15 | // ArrayListへの挿入 16 | for (int i = 0; i < 100000; i++) { 17 | arrayList.add(0, random.nextInt()); 18 | } 19 | long t2 = System.currentTimeMillis(); 20 | // LinkedListへの挿入 21 | for (int i = 0; i < 100000; i++) { 22 | linkedList.add(0, random.nextInt()); 23 | } 24 | // ArrayListへの参照 25 | long t3 = System.currentTimeMillis(); 26 | for (int i = 0; i < 100000; i++) { 27 | int n = arrayList.get(i); 28 | } 29 | // LinkedListへの参照 30 | long t4 = System.currentTimeMillis(); 31 | for (int i = 0; i < 100000; i++) { 32 | int n = linkedList.get(i); 33 | } 34 | long t5 = System.currentTimeMillis(); 35 | System.out.println("ArrayListへの挿入=" + (t2 - t1)); 36 | System.out.println("LinkedListへの挿入=" + (t3 - t2)); 37 | System.out.println("ArrayListへの参照=" + (t4 - t3)); 38 | System.out.println("LinkedListへの参照=" + (t5 - t4)); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/controllers/Step2Action.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import goodcode.util.FileUtil; 4 | 5 | import java.io.File; 6 | 7 | import javax.servlet.ServletContext; 8 | 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Controller; 11 | import org.springframework.ui.Model; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | 14 | /** 15 | * Step2:可読性を高めるためのメソッドの抽出 16 | */ 17 | @Controller 18 | public class Step2Action { 19 | 20 | @Autowired 21 | ServletContext context; 22 | 23 | @RequestMapping("/step2") 24 | public String step2(Model model) { 25 | File[] foodFiles = getFiles("/images/food"); 26 | File[] animalFiles = getFiles("/images/animal"); 27 | File[] landscapeFiles = getFiles("/images/landscape"); 28 | 29 | long foodSize = FileUtil.sizeOfFiles(foodFiles); 30 | long animalSize = FileUtil.sizeOfFiles(animalFiles); 31 | long landscapeSize = FileUtil.sizeOfFiles(landscapeFiles); 32 | 33 | model.addAttribute("foodFiles", foodFiles); 34 | model.addAttribute("animalFiles", animalFiles); 35 | model.addAttribute("landscapeFiles", landscapeFiles); 36 | model.addAttribute("foodSize", foodSize); 37 | model.addAttribute("animalSize", animalSize); 38 | model.addAttribute("landscapeSize", landscapeSize); 39 | return "step2"; 40 | } 41 | 42 | private File[] getFiles(String path) { 43 | File[] files = new File(context.getRealPath(path)).listFiles(); 44 | return files; 45 | } 46 | } -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/controllers/Step1Action.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import java.io.File; 4 | 5 | import javax.servlet.ServletContext; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.ui.Model; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | 12 | /** 13 | * Step1:べたに実装 14 | */ 15 | @Controller 16 | public class Step1Action { 17 | 18 | @Autowired 19 | ServletContext context; 20 | 21 | @RequestMapping("/step1") 22 | public String step1(Model model) { 23 | File[] foodFiles = new File(context.getRealPath("/images/food")).listFiles(); 24 | File[] animalFiles = new File(context.getRealPath("/images/animal")).listFiles(); 25 | File[] landscapeFiles = new File(context.getRealPath("/images/landscape")).listFiles(); 26 | 27 | long foodSize = sizeOfFiles(foodFiles); 28 | long animalSize = sizeOfFiles(animalFiles); 29 | long landscapeSize = sizeOfFiles(landscapeFiles); 30 | 31 | model.addAttribute("foodFiles", foodFiles); 32 | model.addAttribute("animalFiles", animalFiles); 33 | model.addAttribute("landscapeFiles", landscapeFiles); 34 | model.addAttribute("foodSize", foodSize); 35 | model.addAttribute("animalSize", animalSize); 36 | model.addAttribute("landscapeSize", landscapeSize); 37 | return "step1"; 38 | } 39 | 40 | public long sizeOfFiles(File[] files) { 41 | long totalSize = 0; 42 | for (File file : files) { 43 | totalSize += file.length(); 44 | } 45 | return totalSize; 46 | } 47 | } -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/country/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.country; 2 | /** 3 | * リスト8.1 国別の出現数をカウントするコード 4 | */ 5 | public class Main { 6 | public static void main(String[] args) { 7 | // 国の一覧(5ヵ国) 8 | Country[] countries = new Country[] { 9 | new Country("JP", "日本"), 10 | new Country("US", "アメリカ"), 11 | new Country("FR", "フランス"), 12 | new Country("DE", "ドイツ"), 13 | new Country("UK", "イギリス"), 14 | }; 15 | // 入力値(7件) 16 | String[] inputs = new String[] { 17 | "JP", "FR", "US", "FR", "UK", "DE", "US"}; 18 | long t1 = System.currentTimeMillis(); 19 | // breakなし 20 | for (int i = 0; i < 100000; i++) { 21 | for (String input : inputs) { 22 | for (Country country : countries) { 23 | if (country.getCode().equals(input)) { 24 | country.increment(); 25 | } 26 | } 27 | } 28 | } 29 | long t2 = System.currentTimeMillis(); 30 | System.out.println("time=" + (t2 - t1)); 31 | } 32 | // 国ごとの集計 33 | static class Country { 34 | private final String code; 35 | private final String name; 36 | private int counter = 0; 37 | public Country(String code, String name) { 38 | this.code = code; 39 | this.name = name; 40 | } 41 | public String getCode() { 42 | return code; 43 | } 44 | public String getName() { 45 | return name; 46 | } 47 | public void increment() { 48 | counter++; 49 | } 50 | public int getCounter() { 51 | return counter; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /goodcode08/src/main/java/goodcode/country/MainAfter.java: -------------------------------------------------------------------------------- 1 | package goodcode.country; 2 | /** 3 | * リスト8.1 国別の出現数をカウントするコード 4 | */ 5 | public class MainAfter { 6 | public static void main(String[] args) { 7 | // 国の一覧(5ヵ国) 8 | Country[] countries = new Country[] { 9 | new Country("JP", "日本"), 10 | new Country("US", "アメリカ"), 11 | new Country("FR", "フランス"), 12 | new Country("DE", "ドイツ"), 13 | new Country("UK", "イギリス"), 14 | }; 15 | // 入力値(7件) 16 | String[] inputs = new String[] { 17 | "JP", "FR", "US", "FR", "UK", "DE", "US"}; 18 | long t1 = System.currentTimeMillis(); 19 | // breakなし 20 | for (int i = 0; i < 100000; i++) { 21 | for (String input : inputs) { 22 | for (Country country : countries) { 23 | if (country.getCode().equals(input)) { 24 | country.increment(); 25 | break; 26 | } 27 | } 28 | } 29 | } 30 | long t2 = System.currentTimeMillis(); 31 | System.out.println("time=" + (t2 - t1)); 32 | } 33 | // 国ごとの集計 34 | static class Country { 35 | private final String code; 36 | private final String name; 37 | private int counter = 0; 38 | public Country(String code, String name) { 39 | this.code = code; 40 | this.name = name; 41 | } 42 | public String getCode() { 43 | return code; 44 | } 45 | public String getName() { 46 | return name; 47 | } 48 | public void increment() { 49 | counter++; 50 | } 51 | public int getCounter() { 52 | return counter; 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /goodcode07/src/step1.js: -------------------------------------------------------------------------------- 1 | const reservationService = require('./reservation-service'); 2 | 3 | const reservations = reservationService.getReservations(); 4 | console.log('予約情報', reservations); 5 | 6 | console.log(''); 7 | 8 | // 1行目(日付行)の出力 9 | console.log(''); 10 | const dates = []; 11 | for(let i = 0; i < reservations.length; i++) { 12 | const reservation = reservations[i]; 13 | 14 | // 新しい日付が出てきたら1行出力 15 | if (!dates.includes(reservation.date)) { 16 | console.log(''); 19 | dates.push(reservation.date); 20 | } 21 | } 22 | console.log(''); 23 | 24 | // 2行目以降(時間枠の出力) 25 | const times = []; 26 | for(let i = 0; i < reservations.length; i++) { 27 | const reservation = reservations[i]; 28 | 29 | // 新しい時間帯が出てきたら1行出力 30 | if (!times.includes(reservation.start_time + ':' + reservation.end_time)) { 31 | console.log(''); 32 | const dates = []; 33 | for(let j = 0; j < reservations.length; j++) { 34 | const reservation2 = reservations[j]; 35 | 36 | // 新しい日付が出てきたら1列出力 37 | if (!dates.includes(reservation2.date)) { 38 | console.log(''); 49 | dates.push(reservation.date); 50 | } 51 | } 52 | console.log(''); 53 | times.push(reservation.start_time + ':' + reservation.end_time); 54 | } 55 | } 56 | console.log('
'); 17 | console.log(reservation.date); 18 | console.log('
'); 39 | for(let k = 0; k < reservations.length; k++) { 40 | const reservation3 = reservations[k]; 41 | 42 | // 時間と日付が一致したら対象の枠なので値を出力する 43 | if (reservation3.date == reservation2.date 44 | && (reservation3.start_time + ':' + reservation.end_time) == (reservation.start_time + ':' + reservation.end_time)) { 45 | console.log(`${reservation3.count}/${reservation3.limit}`); 46 | } 47 | } 48 | console.log('
'); 57 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/step1/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.step1; 2 | 3 | import goodcode.util.ByteArray; 4 | 5 | import java.io.File; 6 | import java.text.ParseException; 7 | import java.text.SimpleDateFormat; 8 | import java.util.Date; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | import org.apache.commons.io.FileUtils; 13 | import org.apache.commons.lang3.StringUtils; 14 | 15 | /** 16 | * リスト10.1 ベタなコード 17 | */ 18 | public class Main { 19 | public static void main(String[] args) throws Exception { 20 | byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 21 | MessageParser parser = new MessageParser(messages); 22 | parser.parse(); 23 | } 24 | 25 | private static class MessageParser { 26 | private int index = 0; 27 | private final ByteArray bytes; 28 | 29 | public MessageParser(byte[] bytes) { 30 | this.bytes = new ByteArray(bytes); 31 | } 32 | 33 | public void parse() { 34 | while (index < bytes.getLength() - 1) { 35 | Map record = new HashMap<>(); 36 | record.put("送信日", toDate(getString(8))); 37 | record.put("ユーザ名", trim(getString(10))); 38 | record.put("メールアドレス", trim(getString(20))); 39 | record.put("ポイント", toInt(trim(getString(5)))); 40 | System.out.println(record); 41 | } 42 | } 43 | 44 | private String getString(int length) { 45 | String value = bytes.getString(index, length); 46 | index += length; 47 | return value; 48 | } 49 | } 50 | 51 | private static Integer toInt(String value) { 52 | return Integer.parseInt(value); 53 | } 54 | 55 | private static String trim(String value) { 56 | return StringUtils.trimToEmpty(value); 57 | } 58 | 59 | private static Date toDate(String value) { 60 | try { 61 | return new SimpleDateFormat("yyyyMMdd").parse(value); 62 | } catch (ParseException e) { 63 | throw new RuntimeException(e); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/controllers/Step3Action.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import goodcode.util.FileUtil; 4 | 5 | import java.io.File; 6 | 7 | import javax.servlet.ServletContext; 8 | 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Controller; 11 | import org.springframework.ui.Model; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | 14 | /** 15 | * Step3:関連のあるデータをオブジェクトに 16 | */ 17 | @Controller 18 | public class Step3Action { 19 | 20 | @Autowired 21 | ServletContext context; 22 | 23 | @RequestMapping("/step3") 24 | public String step3(Model model) { 25 | ImageFiles foodFiles = getFiles("/images/food"); 26 | ImageFiles animalFiles = getFiles("/images/animal"); 27 | ImageFiles landscapeFiles = getFiles("/images/landscape"); 28 | 29 | model.addAttribute("foodFiles", foodFiles); 30 | model.addAttribute("animalFiles", animalFiles); 31 | model.addAttribute("landscapeFiles", landscapeFiles); 32 | return "step3"; 33 | } 34 | 35 | private ImageFiles getFiles(String path) { 36 | File[] files = new File(context.getRealPath(path)).listFiles(); 37 | return new ImageFiles(path, files); 38 | } 39 | 40 | public static class ImageFiles { 41 | private final String path; 42 | private final File[] files; 43 | private long size; 44 | 45 | public ImageFiles(String path, File[] files) { 46 | this.path = path; 47 | this.files = files; 48 | this.size = FileUtil.sizeOfFiles(files); 49 | } 50 | 51 | public String getPath() { 52 | return this.path; 53 | } 54 | 55 | public File[] getFiles() { 56 | return this.files; 57 | } 58 | 59 | public long getSizeOfFiles() { 60 | return this.size; 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/step2/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.step2; 2 | 3 | import goodcode.util.ByteArray; 4 | 5 | import java.io.File; 6 | import java.util.HashMap; 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | import org.apache.commons.io.FileUtils; 12 | 13 | /** 14 | * リスト10.2 メタデータを内部DSLに移動したコード 15 | */ 16 | public class Main { 17 | public static void main(String[] args) throws Exception { 18 | byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 19 | MessageParser parser = new MessageParser(messages) 20 | .define(new Field("送信日", 8)) 21 | .define(new Field("ユーザ名", 10)) 22 | .define(new Field("メールアドレス", 20)) 23 | .define(new Field("ポイント", 5)); 24 | parser.parse(); 25 | } 26 | 27 | private static class MessageParser { 28 | private int index = 0; 29 | private final ByteArray bytes; 30 | private List fields = new ArrayList(); 31 | 32 | public MessageParser(byte[] bytes) { 33 | this.bytes = new ByteArray(bytes); 34 | } 35 | 36 | public MessageParser define(Field field) { 37 | this.fields.add(field); 38 | return this; 39 | } 40 | 41 | public void parse() throws Exception { 42 | while (index < bytes.getLength() - 1) { 43 | Map record = new HashMap<>(); 44 | for (Field field : fields) { 45 | String name = field.name; 46 | int length = field.length; 47 | String value = getString(length); 48 | record.put(name, value); 49 | } 50 | System.out.println(record); 51 | } 52 | } 53 | 54 | private String getString(int length) { 55 | String value = bytes.getString(index, length); 56 | index += length; 57 | return value; 58 | } 59 | } 60 | 61 | private static class Field { 62 | public final String name; 63 | public final int length; 64 | 65 | public Field(String name, int length) { 66 | this.name = name; 67 | this.length = length; 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /goodcode10/src/main/java/goodcode/controllers/Step4Action.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import goodcode.util.FileUtil; 4 | 5 | import java.io.File; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | import javax.servlet.ServletContext; 10 | 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Controller; 13 | import org.springframework.ui.Model; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | 16 | /** 17 | * Step4:配列/コレクション化 18 | */ 19 | @Controller 20 | public class Step4Action { 21 | 22 | public static final String[] PATHS = { 23 | "/images/food", 24 | "/images/animal", 25 | "/images/landscape" 26 | }; 27 | 28 | @Autowired 29 | public ServletContext context; 30 | 31 | @RequestMapping("/step4") 32 | public String step4(Model model) { 33 | List filesList = new ArrayList(); 34 | for (String path : PATHS) { 35 | filesList.add(getFiles(path)); 36 | } 37 | model.addAttribute("filesList", filesList); 38 | return "step4"; 39 | } 40 | 41 | private ImageFiles getFiles(String path) { 42 | File[] files = new File(context.getRealPath(path)).listFiles(); 43 | return new ImageFiles(path, files); 44 | } 45 | 46 | public static class ImageFiles { 47 | private final String path; 48 | private final File[] files; 49 | private final long size; 50 | 51 | public ImageFiles(String path, File[] files) { 52 | this.path = path; 53 | this.files = files; 54 | this.size = FileUtil.sizeOfFiles(files); 55 | } 56 | 57 | public String getPath() { 58 | return this.path; 59 | } 60 | 61 | public File[] getFiles() { 62 | return this.files; 63 | } 64 | 65 | public long getSizeOfFiles() { 66 | return this.size; 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /goodcode11/src/test/java/goodcode/step3/SampleTest.java: -------------------------------------------------------------------------------- 1 | package goodcode.step3; 2 | 3 | import goodcode.step3.Main2.MessageParser; 4 | 5 | import java.io.File; 6 | import java.util.Date; 7 | import java.util.GregorianCalendar; 8 | import java.util.HashMap; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | import junit.framework.TestCase; 13 | 14 | import org.apache.commons.io.FileUtils; 15 | import org.junit.Test; 16 | 17 | /** 18 | * 考察 DSLのテストはどうする? 19 | */ 20 | public class SampleTest extends TestCase { 21 | 22 | MessageParser parser; 23 | 24 | @Override 25 | protected void setUp() throws Exception { 26 | byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 27 | parser = new MessageParser(messages, Main2.fields); 28 | } 29 | 30 | @Test 31 | public void testParse() throws Exception { 32 | List> records = parser.parse(); 33 | assertEquals("データ件数のチェック", 5, records.size()); 34 | assertEquals("1件目", 35 | makeRecord(2008, 11, 1, 10, "user1", "user1@examples.com"), 36 | records.get(0)); 37 | assertEquals("2件目", 38 | makeRecord(2008, 11, 1, 0, "user2", "user2@examples.com"), 39 | records.get(1)); 40 | assertEquals("3件目", 41 | makeRecord(2008, 11, 1, 100, "user3", "user3@examples.com"), 42 | records.get(2)); 43 | assertEquals("4件目", 44 | makeRecord(2008, 11, 2, 80, "user4", "user4@examples.com"), 45 | records.get(3)); 46 | assertEquals("5件目", 47 | makeRecord(2008, 11, 2, 55, "user5", "user5@examples.com"), 48 | records.get(4)); 49 | } 50 | 51 | private Map makeRecord(int year, int month, int day, int point, 52 | String userName, String mailAddress) { 53 | Map record = new HashMap<>(); 54 | GregorianCalendar cal = new GregorianCalendar(year, month - 1, day); 55 | Date sendDate = cal.getTime(); 56 | record.put("送信日", sendDate); 57 | record.put("ポイント", point); 58 | record.put("ユーザ名", userName); 59 | record.put("メールアドレス", mailAddress); 60 | return record; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /goodcode12-step2/src/main/java/app/servlet/DispatcherServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | import app.action.ListAction; 11 | import app.action.LoginAction; 12 | import app.action.LoginProcessAction; 13 | 14 | public class DispatcherServlet extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 8853568811756299786L; 17 | 18 | @Override 19 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 20 | throws ServletException, IOException { 21 | execute(req, res); 22 | } 23 | 24 | @Override 25 | protected void doPost(HttpServletRequest req, HttpServletResponse res) 26 | throws ServletException, IOException { 27 | execute(req, res); 28 | } 29 | 30 | private void execute(HttpServletRequest req, HttpServletResponse res) 31 | throws ServletException, IOException { 32 | String path = req.getRequestURI().substring(req.getContextPath().length()); 33 | Action action = findAction(path); 34 | if (action == null) { 35 | res.sendError(HttpServletResponse.SC_NOT_FOUND); 36 | } else { 37 | try { 38 | action.execute(req, res); 39 | } catch (Exception e) { 40 | handleException(e); 41 | } 42 | } 43 | } 44 | 45 | private Action findAction(String path) { 46 | if ("/login.action".equals(path)) { 47 | return new LoginAction(); 48 | } else if ("/loginProcess.action".equals(path)) { 49 | return new LoginProcessAction(); 50 | 51 | } else if ("/list.action".equals(path)) { 52 | return new ListAction(); 53 | } 54 | return null; 55 | } 56 | 57 | private void handleException(Exception e) throws ServletException, 58 | IOException { 59 | if (e instanceof ServletException) { 60 | throw (ServletException) e; 61 | } else if (e instanceof IOException) { 62 | throw (IOException) e; 63 | } else { 64 | throw new ServletException(e.getMessage(), e); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/advanced/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.advanced; 2 | 3 | import static goodcode.advanced.Converters.date; 4 | import static goodcode.advanced.Converters.integer; 5 | import static goodcode.advanced.Converters.trim; 6 | 7 | import java.io.File; 8 | import java.util.ArrayList; 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | import org.apache.commons.io.FileUtils; 15 | 16 | import static goodcode.advanced.Field.field; 17 | import goodcode.converter.Converter; 18 | import goodcode.util.ByteArray; 19 | 20 | /** 21 | * もっとDSLっぽく 22 | */ 23 | public class Main { 24 | public static void main(final String[] args) throws Exception { 25 | final byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 26 | List> records = new MessageParser(messages) 27 | .define( 28 | field("送信日", 8).to(date), 29 | field("ユーザ名", 10).to(trim), 30 | field("メールアドレス", 20).to(trim), 31 | field("ポイント", 5).to(trim, integer) 32 | ).parse(); 33 | } 34 | 35 | private static class MessageParser { 36 | private int index = 0; 37 | private final ByteArray bytes; 38 | private final List fields = new ArrayList(); 39 | 40 | public MessageParser(final byte[] bytes) { 41 | this.bytes = new ByteArray(bytes); 42 | } 43 | 44 | public MessageParser define(Field ...fields) { 45 | this.fields.addAll(Arrays.asList(fields)); 46 | return this; 47 | } 48 | 49 | public List> parse() throws Exception { 50 | List> records = new ArrayList>(); 51 | while (index < bytes.getLength() - 1) { 52 | final Map record = new HashMap<>(); 53 | for (final Field field : fields) { 54 | final String name = field.name; 55 | final int length = field.length; 56 | Object value = getString(length); 57 | for(Converter converter : field.converters) { 58 | value = converter.convert(value); 59 | } 60 | record.put(name, value); 61 | } 62 | System.out.println(record); 63 | records.add(record); 64 | } 65 | return records; 66 | } 67 | 68 | private String getString(final int length) { 69 | final String value = bytes.getString(index, length); 70 | index += length; 71 | return value; 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/step3/Main.java: -------------------------------------------------------------------------------- 1 | package goodcode.step3; 2 | 3 | import goodcode.converter.Converter; 4 | import goodcode.converter.DateConverter; 5 | import goodcode.converter.IntegerConverter; 6 | import goodcode.converter.TrimConverter; 7 | import goodcode.util.ByteArray; 8 | 9 | import java.io.File; 10 | import java.util.HashMap; 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | import org.apache.commons.io.FileUtils; 16 | 17 | /** 18 | * リスト10.3 変換ルールを実行する 19 | */ 20 | public class Main { 21 | public static void main(String[] args) throws Exception { 22 | byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 23 | MessageParser parser = new MessageParser(messages) 24 | .define(new Field("送信日", 8, new DateConverter())) 25 | .define(new Field("ユーザ名", 10, new TrimConverter())) 26 | .define(new Field("メールアドレス", 20, new TrimConverter())) 27 | .define(new Field("ポイント", 5, new IntegerConverter())); 28 | parser.parse(); 29 | } 30 | 31 | private static class MessageParser { 32 | private int index = 0; 33 | private final ByteArray bytes; 34 | private List fields = new ArrayList(); 35 | 36 | public MessageParser(byte[] bytes) { 37 | this.bytes = new ByteArray(bytes); 38 | } 39 | 40 | public MessageParser define(Field field) { 41 | this.fields.add(field); 42 | return this; 43 | } 44 | 45 | public void parse() throws Exception { 46 | while (index < bytes.getLength() - 1) { 47 | Map record = new HashMap<>(); 48 | for (Field field : fields) { 49 | String name = field.name; 50 | int length = field.length; 51 | Converter converter = field.converter; 52 | String value = getString(length); 53 | Object newValue = converter.convert(value); 54 | record.put(name, newValue); 55 | } 56 | System.out.println(record); 57 | } 58 | } 59 | 60 | private String getString(int length) { 61 | String value = bytes.getString(index, length); 62 | index += length; 63 | return value; 64 | } 65 | } 66 | 67 | private static class Field { 68 | public final String name; 69 | public final int length; 70 | public final Converter converter; 71 | 72 | public Field(String name, int length, Converter converter) { 73 | this.name = name; 74 | this.length = length; 75 | this.converter = converter; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /goodcode12-step3/src/main/java/app/servlet/DispatcherServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | import java.util.Properties; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | public class DispatcherServlet extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 8853568811756299786L; 14 | private Properties route ; 15 | 16 | @Override 17 | public void init() throws ServletException { 18 | route = new Properties(); 19 | try { 20 | route.load(getClass().getClassLoader().getResourceAsStream("route.properties")); 21 | } catch (IOException e) { 22 | throw new ServletException("route.propetiesが読み込めません", e); 23 | } 24 | } 25 | 26 | @Override 27 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 28 | throws ServletException, IOException { 29 | execute(req, res); 30 | } 31 | 32 | @Override 33 | protected void doPost(HttpServletRequest req, HttpServletResponse res) 34 | throws ServletException, IOException { 35 | execute(req, res); 36 | } 37 | 38 | private void execute(HttpServletRequest req, HttpServletResponse res) 39 | throws ServletException, IOException { 40 | String path = req.getRequestURI().substring(req.getContextPath().length()); 41 | Action action = findAction(path); 42 | if (action == null) { 43 | res.sendError(HttpServletResponse.SC_NOT_FOUND); 44 | } else { 45 | try { 46 | action.execute(req, res); 47 | } catch (Exception e) { 48 | handleException(e); 49 | } 50 | } 51 | } 52 | 53 | private Action findAction(String path) throws ServletException { 54 | if (!route.containsKey(path)) { 55 | return null; 56 | } 57 | String className = route.getProperty(path); 58 | try { 59 | Class clazz = Class.forName(className); 60 | return (Action) clazz.getDeclaredConstructor().newInstance(); 61 | } catch (Exception e) { 62 | throw new ServletException("アクションの生成に失敗しました", e); 63 | } 64 | } 65 | 66 | private void handleException(Exception e) throws ServletException, 67 | IOException { 68 | if (e instanceof ServletException) { 69 | throw (ServletException) e; 70 | } else if (e instanceof IOException) { 71 | throw (IOException) e; 72 | } else { 73 | throw new ServletException(e.getMessage(), e); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /goodcode12-step4/src/main/java/app/servlet/DispatcherServlet.java: -------------------------------------------------------------------------------- 1 | package app.servlet; 2 | 3 | import java.io.IOException; 4 | import java.util.Properties; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | public class DispatcherServlet extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 8853568811756299786L; 14 | private Properties route ; 15 | 16 | @Override 17 | public void init() throws ServletException { 18 | route = new Properties(); 19 | try { 20 | route.load(getClass().getClassLoader().getResourceAsStream("route.properties")); 21 | } catch (IOException e) { 22 | throw new ServletException("route.propetiesが読み込めません", e); 23 | } 24 | } 25 | 26 | @Override 27 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 28 | throws ServletException, IOException { 29 | execute(req, res); 30 | } 31 | 32 | @Override 33 | protected void doPost(HttpServletRequest req, HttpServletResponse res) 34 | throws ServletException, IOException { 35 | execute(req, res); 36 | } 37 | 38 | private void execute(HttpServletRequest req, HttpServletResponse res) 39 | throws ServletException, IOException { 40 | String path = req.getRequestURI().substring(req.getContextPath().length()); 41 | Action action = findAction(path); 42 | if (action == null) { 43 | res.sendError(HttpServletResponse.SC_NOT_FOUND); 44 | } else { 45 | try { 46 | action.setRequest(req); 47 | action.setResponse(res); 48 | action.execute(); 49 | } catch (Exception e) { 50 | handleException(e); 51 | } 52 | } 53 | } 54 | 55 | private Action findAction(String path) throws ServletException { 56 | if (!route.containsKey(path)) { 57 | return null; 58 | } 59 | String className = route.getProperty(path); 60 | try { 61 | Class clazz = Class.forName(className); 62 | return (Action) clazz.getDeclaredConstructor().newInstance(); 63 | } catch (Exception e) { 64 | throw new ServletException("アクションの生成に失敗しました", e); 65 | } 66 | } 67 | 68 | private void handleException(Exception e) throws ServletException, 69 | IOException { 70 | if (e instanceof ServletException) { 71 | throw (ServletException) e; 72 | } else if (e instanceof IOException) { 73 | throw (IOException) e; 74 | } else { 75 | throw new ServletException(e.getMessage(), e); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/src/main/java/framework/DispatcherServlet.java: -------------------------------------------------------------------------------- 1 | package framework; 2 | 3 | import java.io.IOException; 4 | import java.util.Properties; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | public class DispatcherServlet extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 8853568811756299786L; 14 | private Properties route ; 15 | 16 | @Override 17 | public void init() throws ServletException { 18 | route = new Properties(); 19 | try { 20 | route.load(getClass().getClassLoader().getResourceAsStream("route.properties")); 21 | } catch (IOException e) { 22 | throw new ServletException("route.propetiesが読み込めません", e); 23 | } 24 | } 25 | 26 | @Override 27 | protected void doGet(HttpServletRequest req, HttpServletResponse res) 28 | throws ServletException, IOException { 29 | execute(req, res); 30 | } 31 | 32 | @Override 33 | protected void doPost(HttpServletRequest req, HttpServletResponse res) 34 | throws ServletException, IOException { 35 | execute(req, res); 36 | } 37 | 38 | private void execute(HttpServletRequest req, HttpServletResponse res) 39 | throws ServletException, IOException { 40 | String path = req.getRequestURI().substring(req.getContextPath().length()); 41 | Action action = findAction(path); 42 | if (action == null) { 43 | res.sendError(HttpServletResponse.SC_NOT_FOUND); 44 | } else { 45 | try { 46 | action.setRequest(req); 47 | action.setResponse(res); 48 | action.execute(); 49 | } catch (Exception e) { 50 | handleException(e); 51 | } 52 | } 53 | } 54 | 55 | private Action findAction(String path) throws ServletException { 56 | if (!route.containsKey(path)) { 57 | return null; 58 | } 59 | String className = route.getProperty(path); 60 | try { 61 | Class clazz = Class.forName(className); 62 | return (Action) clazz.getDeclaredConstructor().newInstance(); 63 | } catch (Exception e) { 64 | throw new ServletException("アクションの生成に失敗しました", e); 65 | } 66 | } 67 | 68 | private void handleException(Exception e) throws ServletException, 69 | IOException { 70 | if (e instanceof ServletException) { 71 | throw (ServletException) e; 72 | } else if (e instanceof IOException) { 73 | throw (IOException) e; 74 | } else { 75 | throw new ServletException(e.getMessage(), e); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /goodcode09/src/test/java/goodcode/controllers/TimelineControllerTest.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertEquals; 4 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 5 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 6 | 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; 10 | import org.springframework.boot.test.context.SpringBootTest; 11 | import org.springframework.test.web.servlet.MockMvc; 12 | import org.springframework.test.web.servlet.MvcResult; 13 | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; 14 | 15 | import goodcode.twitter.Tweet; 16 | import goodcode.twitter.TwitterAPI; 17 | import org.springframework.ui.ModelMap; 18 | 19 | @AutoConfigureMockMvc 20 | @SpringBootTest 21 | public class TimelineControllerTest { 22 | 23 | // (3)テスト用のモックTwitter APIを定義 24 | class MockTwitterAPI implements TwitterAPI { 25 | public Tweet[] tweets; 26 | public Tweet[] getTimeline() { 27 | return tweets; 28 | } 29 | } 30 | 31 | @Autowired 32 | private MockMvc mockMvc; 33 | 34 | @Autowired 35 | private TimelineController timelineController; 36 | 37 | @Test 38 | public void testTimeline() throws Exception { 39 | // (4)モックオブジェクトを準備 40 | MockTwitterAPI twitterAPI = new MockTwitterAPI(); 41 | twitterAPI.tweets = new Tweet[]{ 42 | new Tweet("普通のプログラマ", "寝ます……。"), 43 | new Tweet("中級プログラマ", "おやすみ"), 44 | new Tweet("達人プログラマ", "ふぉっふぉっふぉっ") 45 | }; 46 | // (5)実行するアクションのTwitter APIを 47 | // モックオブジェクトに入れ替え 48 | timelineController.twitterAPI = twitterAPI; 49 | 50 | // (5)コントローラーを実行 51 | MvcResult mvcResult = mockMvc.perform( 52 | MockMvcRequestBuilders.get("/timeline") 53 | ) 54 | // (6) ステータスは200のはず 55 | .andExpect(status().isOk()) 56 | // (7) timelineの画面が表示されるはず 57 | .andExpect(view().name("timeline")) 58 | .andReturn(); 59 | 60 | // (8) Modelにセットされたタイムラインの中身を検証 61 | ModelMap modelMap = mvcResult.getModelAndView().getModelMap(); 62 | Tweet[] tweets = (Tweet[]) modelMap.get("tweets"); 63 | assertEquals(3, tweets.length); 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /goodcode09/src/test/java/goodcode/controllers/TodoControllerTest.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertEquals; 4 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 5 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 6 | 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; 10 | import org.springframework.boot.test.context.SpringBootTest; 11 | import org.springframework.test.web.servlet.MockMvc; 12 | import org.springframework.test.web.servlet.MvcResult; 13 | import org.springframework.test.web.servlet.RequestBuilder; 14 | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; 15 | 16 | import goodcode.auth.LoginAccount; 17 | import goodcode.entity.Todo; 18 | import org.springframework.ui.ModelMap; 19 | 20 | @AutoConfigureMockMvc 21 | @SpringBootTest 22 | public class TodoControllerTest { 23 | 24 | @Autowired 25 | private MockMvc mockMvc; 26 | 27 | @Test 28 | public void testSuccess() throws Exception { 29 | // (1)ログインユーザを準備(ID=10000) 30 | LoginAccount loginAccount = new LoginAccount(); 31 | loginAccount.setAccountId(10000); 32 | 33 | // (2)ログインユーザーをリクエストにセット 34 | RequestBuilder builder = MockMvcRequestBuilders 35 | .get("/todo/1") 36 | .sessionAttr("scopedTarget.loginAccount", loginAccount); 37 | 38 | // (3)コントローラーを実行 39 | MvcResult mvcResult = mockMvc.perform(builder) 40 | // (4) ステータスは200のはず 41 | .andExpect(status().isOk()) 42 | // (5) todoの画面が表示されるはず 43 | .andExpect(view().name("todo")) 44 | .andReturn(); 45 | 46 | // (6) ModelにセットされたToDoの中身を検証 47 | ModelMap modelMap = mvcResult.getModelAndView().getModelMap(); 48 | Todo todo = (Todo) modelMap.get("todo"); 49 | assertEquals("ToDo1", todo.getContent()); 50 | } 51 | 52 | @Test 53 | public void test404() throws Exception { 54 | // (1)ログインユーザーを準備(ID=10001) 55 | LoginAccount loginAccount = new LoginAccount(); 56 | loginAccount.setAccountId(10001); 57 | 58 | // (2)ログインユーザーをリクエストにセット 59 | RequestBuilder builder = MockMvcRequestBuilders 60 | .get("/todo/1") 61 | .sessionAttr("scopedTarget.loginAccount", loginAccount); 62 | 63 | // (3)コントローラーを実行 64 | mockMvc.perform(builder) 65 | // (4) 権限がないので404エラーが発生しているはず 66 | .andExpect(status().isNotFound()); 67 | } 68 | 69 | } -------------------------------------------------------------------------------- /goodcode11/src/main/java/goodcode/step3/Main2.java: -------------------------------------------------------------------------------- 1 | package goodcode.step3; 2 | 3 | import goodcode.converter.Converter; 4 | import goodcode.converter.DateConverter; 5 | import goodcode.converter.IntegerConverter; 6 | import goodcode.converter.TrimConverter; 7 | import goodcode.util.ByteArray; 8 | 9 | import java.io.File; 10 | import java.util.HashMap; 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | import org.apache.commons.io.FileUtils; 16 | 17 | /** 18 | * 変換ルールを実行する(MessageParserをテスト可能にした) 19 | */ 20 | public class Main2 { 21 | public static Fields fields = new Fields() 22 | .define(new Field("送信日", 8, new DateConverter())) 23 | .define(new Field("ユーザ名", 10, new TrimConverter())) 24 | .define(new Field("メールアドレス", 20, new TrimConverter())) 25 | .define(new Field("ポイント", 5, new IntegerConverter())); 26 | 27 | 28 | public static void main(String[] args) throws Exception { 29 | byte[] messages = FileUtils.readFileToByteArray(new File("data.txt")); 30 | MessageParser parser = new MessageParser(messages, fields); 31 | parser.parse(); 32 | } 33 | 34 | public static class MessageParser { 35 | private int index = 0; 36 | private final ByteArray bytes; 37 | private final Fields fields; 38 | 39 | public MessageParser(byte[] bytes, Fields fields) { 40 | this.bytes = new ByteArray(bytes); 41 | this.fields = fields; 42 | } 43 | 44 | public List> parse() throws Exception { 45 | List> records = new ArrayList>(); 46 | while (index < bytes.getLength() - 1) { 47 | Map record = new HashMap<>(); 48 | for (Field field : fields.fields) { 49 | String name = field.name; 50 | int length = field.length; 51 | Converter converter = field.converter; 52 | String value = getString(length); 53 | Object newValue = converter.convert(value); 54 | record.put(name, newValue); 55 | } 56 | records.add(record); 57 | } 58 | return records; 59 | } 60 | 61 | private String getString(int length) { 62 | String value = bytes.getString(index, length); 63 | index += length; 64 | return value; 65 | } 66 | } 67 | 68 | private static class Field { 69 | public final String name; 70 | public final int length; 71 | public final Converter converter; 72 | 73 | public Field(String name, int length, Converter converter) { 74 | this.name = name; 75 | this.length = length; 76 | this.converter = converter; 77 | } 78 | } 79 | 80 | private static class Fields { 81 | private List fields = new ArrayList(); 82 | 83 | public Fields define(Field field) { 84 | this.fields.add(field); 85 | return this; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /goodcode07/src/step3.js: -------------------------------------------------------------------------------- 1 | const reservationService = require('./reservation-service'); 2 | 3 | const reservations = reservationService.getReservations(); 4 | console.log('予約情報', reservations); 5 | 6 | const buildDays = (reservations) => { 7 | const uniqueDates = [...new Set(reservations.map((r) => r.date))]; 8 | console.log('uniqueDates', uniqueDates); 9 | return uniqueDates.map((date) => { 10 | return { 11 | date, 12 | } 13 | }); 14 | }; 15 | 16 | const buildSlots = (reservations, days) => { 17 | const timesMap = new Map(); 18 | reservations.forEach((r) => { 19 | const key = `${r.start_time}:${r.end_time}`; 20 | const time = { 21 | startTime: r.start_time, 22 | endTime: r.end_time, 23 | }; 24 | timesMap.set(key, time); 25 | }); 26 | const uniqueTimes = [...timesMap.values()]; 27 | console.log('uniqueTimes', uniqueTimes); 28 | return uniqueTimes.map((time) => { 29 | const targetDays = days.map((day) => { 30 | const target = reservations.find((r) => r.date == day.date && r.start_time == time.startTime && r.end_time == time.endTime); 31 | console.log('target', target); 32 | return { 33 | date: day.date, 34 | count: target ? target.count : 0, 35 | limit: target ? target.limit : 0, 36 | }; 37 | }); 38 | return { 39 | time, 40 | days: targetDays, 41 | }; 42 | }); 43 | }; 44 | 45 | const buildReservationTable = (reservations) => { 46 | const days = buildDays(reservations); 47 | const slots = buildSlots(reservations, days); 48 | return { 49 | days, 50 | slots, 51 | } 52 | }; 53 | 54 | const reservationTable = buildReservationTable(reservations); 55 | console.log('reservationTable', JSON.stringify(reservationTable, null, 2)); 56 | 57 | console.log(''); 58 | 59 | // 1行目(日付行)の出力 60 | console.log(''); 61 | reservationTable.days.forEach((day) => { 62 | console.log(''); 65 | }); 66 | 67 | // 2行目以降(時間枠の出力) 68 | reservationTable.slots.forEach((slot) => { 69 | console.log(''); 70 | slot.days.forEach((day) => { 71 | console.log(''); 74 | }); 75 | console.log(''); 76 | }); 77 | 78 | console.log('
'); 63 | console.log(day.date); 64 | console.log('
'); 72 | console.log(`${day.count}/${day.limit}`); 73 | console.log('
'); 79 | 80 | // const reservationTable = { 81 | // days: [ 82 | // { 83 | // date: '2022-10-10' 84 | // }, 85 | // { 86 | // date: '2022-10-11' 87 | // } 88 | // ], 89 | // const slots = [ 90 | // { 91 | // start_time: 1000, 92 | // end_date: 1100, 93 | // days: [ 94 | // { 95 | // date: '2022-10-10' 96 | // count: 2, 97 | // limit: 2, 98 | // }, 99 | // { 100 | // date: '2022-10-11' 101 | // count: 1, 102 | // limit: 2, 103 | // }, 104 | // ] 105 | // } 106 | // ]; 107 | // } 108 | 109 | -------------------------------------------------------------------------------- /goodcode12-step1/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-step2/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-step3/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-step4/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-refrect-api/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-packaging-application/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode12-packaging-framework/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/controllers/step1/XmlApiController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.step1; 2 | 3 | import goodcode.entity.Division; 4 | import goodcode.entity.User; 5 | import goodcode.service.UserService; 6 | 7 | import java.util.List; 8 | 9 | import javax.servlet.http.HttpServletResponse; 10 | import javax.xml.parsers.DocumentBuilder; 11 | import javax.xml.parsers.DocumentBuilderFactory; 12 | import javax.xml.transform.Transformer; 13 | import javax.xml.transform.TransformerFactory; 14 | import javax.xml.transform.dom.DOMSource; 15 | import javax.xml.transform.stream.StreamResult; 16 | 17 | import org.springframework.beans.factory.annotation.Autowired; 18 | import org.springframework.stereotype.Controller; 19 | import org.springframework.web.bind.annotation.RequestMapping; 20 | 21 | import org.w3c.dom.Document; 22 | import org.w3c.dom.Element; 23 | 24 | @Controller 25 | public class XmlApiController { 26 | @Autowired 27 | public UserService userService; 28 | 29 | @RequestMapping("/api/1") 30 | public void index(HttpServletResponse response) throws Exception { 31 | List divs = userService.getDivisions(); 32 | List users = userService.getUsers(); 33 | // (1)XMLを作成するためにDocumentオブジェクトを準備 34 | DocumentBuilderFactory factory = 35 | DocumentBuilderFactory.newInstance(); 36 | DocumentBuilder builder = factory.newDocumentBuilder(); 37 | Document doc = builder.newDocument(); 38 | // (2)ルート要素の追加 39 | Element rootNode = doc.createElement("data"); 40 | doc.appendChild(rootNode); 41 | // (3)組織要素の追加 42 | Element divisionsNode = doc.createElement("divisions"); 43 | int rowIndex = 1; 44 | for (Division div: divs) { 45 | Element node = doc.createElement("division"); 46 | node.setAttribute("index", String.valueOf(rowIndex++)); 47 | Element idNode = doc.createElement("id"); 48 | idNode.setTextContent(div.getId()); 49 | node.appendChild(idNode); 50 | Element nameNode = doc.createElement("name"); 51 | nameNode.setTextContent(div.getName()); 52 | node.appendChild(nameNode); 53 | divisionsNode.appendChild(node); 54 | } 55 | rootNode.appendChild(divisionsNode); 56 | // (5)ユーザ要素の追加 57 | Element usersNode = doc.createElement("users"); 58 | for (User user : users) { 59 | Element node = doc.createElement("user"); 60 | node.setAttribute("index", String.valueOf(rowIndex++)); 61 | Element nameNode = doc.createElement("name"); 62 | nameNode.setTextContent(user.getName()); 63 | node.appendChild(nameNode); 64 | usersNode.appendChild(node); 65 | } 66 | rootNode.appendChild(usersNode); 67 | // (6)DocumentオブジェクトをXML文字列へ変換 68 | TransformerFactory transFactory = 69 | TransformerFactory.newInstance(); 70 | Transformer transformer = transFactory.newTransformer(); 71 | DOMSource source = new DOMSource(doc); 72 | // (7)レスポンスとしてXMLを出力 73 | StreamResult result = 74 | new StreamResult(response.getOutputStream()); 75 | transformer.transform(source, result); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /goodcode05/src/main/java/goodcode/controllers/step2/XmlApiController.java: -------------------------------------------------------------------------------- 1 | package goodcode.controllers.step2; 2 | 3 | import goodcode.entity.Division; 4 | import goodcode.entity.User; 5 | import goodcode.service.UserService; 6 | 7 | import java.util.List; 8 | 9 | import javax.servlet.http.HttpServletResponse; 10 | import javax.xml.parsers.DocumentBuilder; 11 | import javax.xml.parsers.DocumentBuilderFactory; 12 | import javax.xml.parsers.ParserConfigurationException; 13 | import javax.xml.transform.Transformer; 14 | import javax.xml.transform.TransformerFactory; 15 | import javax.xml.transform.dom.DOMSource; 16 | import javax.xml.transform.stream.StreamResult; 17 | 18 | import org.springframework.beans.factory.annotation.Autowired; 19 | import org.springframework.stereotype.Controller; 20 | import org.springframework.web.bind.annotation.RequestMapping; 21 | import org.w3c.dom.Document; 22 | import org.w3c.dom.Element; 23 | 24 | @Controller 25 | public class XmlApiController { 26 | @Autowired 27 | public UserService userService; 28 | 29 | @RequestMapping("/api/2") 30 | public void index(HttpServletResponse response) throws Exception { 31 | List divs = userService.getDivisions(); 32 | List users = userService.getUsers(); 33 | int rowIndex = 1; 34 | // (1)XMLを作成するためにDocumentオブジェクトを準備 35 | Document doc = newDocument(); 36 | // (2)ルート要素の追加 37 | Element rootNode = doc.createElement("data"); 38 | doc.appendChild(rootNode); 39 | // (3)組織要素の追加 40 | Element divisionsNode = doc.createElement("divisions"); 41 | for (Division div: divs) { 42 | Element node = doc.createElement("division"); 43 | node.setAttribute("index", String.valueOf(rowIndex++)); 44 | node.appendChild(createElement(doc, "id", div.getId())); 45 | node.appendChild(createElement(doc, "name", div.getName())); 46 | divisionsNode.appendChild(node); 47 | } 48 | rootNode.appendChild(divisionsNode); 49 | // (5)ユーザ要素の追加 50 | Element usersNode = doc.createElement("users"); 51 | for (User user : users) { 52 | Element node = doc.createElement("user"); 53 | node.setAttribute("index", String.valueOf(rowIndex++)); 54 | node.appendChild(createElement(doc, "name", user.getName())); 55 | usersNode.appendChild(node); 56 | } 57 | rootNode.appendChild(usersNode); 58 | // (6)DocumentオブジェクトをXML文字列へ変換 59 | TransformerFactory transFactory = 60 | TransformerFactory.newInstance(); 61 | Transformer transformer = transFactory.newTransformer(); 62 | DOMSource source = new DOMSource(doc); 63 | // (7)レスポンスとしてXMLを出力 64 | StreamResult result = 65 | new StreamResult(response.getOutputStream()); 66 | transformer.transform(source, result); 67 | } 68 | 69 | private Document newDocument() throws ParserConfigurationException { 70 | DocumentBuilderFactory factory = 71 | DocumentBuilderFactory.newInstance(); 72 | DocumentBuilder builder = factory.newDocumentBuilder(); 73 | return builder.newDocument(); 74 | } 75 | // 引数に特定の情報が含まれていないので汎用的! 76 | private Element createElement( 77 | Document doc, String nodeName, String textContent) { 78 | Element node = doc.createElement(nodeName); 79 | node.setTextContent(textContent); 80 | return node; 81 | } 82 | } 83 | --------------------------------------------------------------------------------