├── .gitignore ├── README.md ├── _uploaded └── info.txt ├── content ├── css │ ├── one.css │ └── styles.css ├── img │ ├── hp.png │ ├── swift.jpeg │ └── total.png ├── index.html ├── login.html └── template │ ├── template.html │ ├── template02.ftl │ └── template03.ftl ├── content_navi2 └── template │ ├── login-err.ftl │ ├── login-ok.ftl │ └── login.ftl ├── content_upload └── upload.html ├── devops ├── apache │ ├── apache_cmd.txt │ ├── apache_redirect.txt │ └── apache_std.txt ├── git │ └── git.txt ├── maven │ ├── build_single_jar.sh │ ├── clean.sh │ └── windows_install.txt ├── shell │ └── run_single_jar.sh └── sql │ └── create-table.sql ├── pom.xml └── src └── main ├── java └── org │ └── alexr │ ├── jdbc │ ├── _info.txt │ ├── step1conn │ │ ├── ConnectionApp.java │ │ ├── DbConnection.java │ │ ├── DbConnection2.java │ │ └── _info.txt │ ├── step2createtable │ │ ├── CreateTableApp.java │ │ └── _info.txt │ ├── step3insert │ │ ├── InsertApp.java │ │ └── _info.txt │ ├── step4select │ │ ├── SelectApp.java │ │ └── _info.txt │ └── step9extra │ │ └── ExtraApp.java │ └── web │ ├── MinimalWebApplication.java │ ├── WebApplication.java │ ├── _info.txt │ ├── cookies │ ├── CookieApp.java │ ├── CookieServletA.java │ └── CookieServletB.java │ ├── entity │ └── Person.java │ ├── filters │ ├── App1Problem.java │ ├── App2Solution.java │ ├── ParamsFilter.java │ ├── ServletGoodDesign.java │ └── ServletNastyDesign.java │ ├── freemarker │ ├── Dog.java │ ├── FreemarkerServlet02.java │ ├── FreemarkerServlet03.java │ ├── FreemarkerServlet04.java │ ├── PlaceHolderServlet.java │ ├── TemplateApp01.java │ ├── TemplateApp02.java │ ├── TemplateApp03.java │ ├── TemplateApp04.java │ └── TemplateEngine.java │ ├── jackson │ ├── JacksonServlet.java │ └── JacksonWebApplication.java │ ├── navi │ ├── LinkItem.java │ ├── LoginServlet.java │ ├── LogoutServlet.java │ ├── MenuServlet.java │ ├── NaviApp.java │ ├── RedirectServlet.java │ └── StaticContentServlet.java │ ├── navi2 │ ├── Navi2App.java │ ├── _info.txt │ └── servlet │ │ ├── LinkItem.java │ │ ├── SvtCalc.java │ │ ├── SvtHistory.java │ │ ├── SvtLogin.java │ │ ├── SvtLogout.java │ │ ├── SvtMenu.java │ │ ├── SvtRedirect.java │ │ └── SvtStaticContent.java │ ├── request │ ├── RequestAppApache.java │ ├── RequestAppGoogleHttp.java │ ├── RequestAppOkHttp.java │ ├── RequestAppVertX.java │ ├── jcabi │ │ ├── HttpClient2Get.java │ │ ├── HttpClient2Post.java │ │ └── JacksonWithPojoResponse.java │ └── jdk │ │ ├── Book.java │ │ ├── HttpClient1Get.java │ │ └── HttpClient2Post.java │ ├── rest │ ├── Book.java │ ├── JerseyServerApp.java │ └── resources │ │ └── Books.java │ ├── service │ ├── Auth.java │ └── AuthService.java │ ├── servlet │ ├── ExploreRequestServlet.java │ ├── HelloServlet.java │ ├── LoginServlet.java │ ├── ServletFile.java │ ├── ServletRedirect.java │ └── TemplateServlet.java │ └── upload │ ├── UploadApp.java │ └── UploadServlet.java └── resources ├── log4j.properties ├── template ├── navi.ftl └── template04.ftl └── useful_links.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # `.idea` folder in the root directory 2 | /.idea/ 3 | 4 | # `target/` folder in all sub-directories 5 | **/target/* 6 | 7 | # `*.iml` files in all sub-directories 8 | **/*.iml 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repo contains basic information about JDBC and Servlets 2 | -------------------------------------------------------------------------------- /_uploaded/info.txt: -------------------------------------------------------------------------------- 1 | uploaded files will be saved here 2 | -------------------------------------------------------------------------------- /content/css/one.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djnzx/java-web/76e399c1f14cff44f7328c6b5a72bb5ee188dc88/content/css/one.css -------------------------------------------------------------------------------- /content/css/styles.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /content/img/hp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djnzx/java-web/76e399c1f14cff44f7328c6b5a72bb5ee188dc88/content/img/hp.png -------------------------------------------------------------------------------- /content/img/swift.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djnzx/java-web/76e399c1f14cff44f7328c6b5a72bb5ee188dc88/content/img/swift.jpeg -------------------------------------------------------------------------------- /content/img/total.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djnzx/java-web/76e399c1f14cff44f7328c6b5a72bb5ee188dc88/content/img/total.png -------------------------------------------------------------------------------- /content/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 | IntelliJ IDEA, Thanks a lot! 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /content/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /content/template/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 |

TemplateApp01

12 |

template file location: project root/content/templates/template.html

13 |

Hello, $user

14 |

you've got a new messages($count)

15 | 16 | 17 | -------------------------------------------------------------------------------- /content/template/template02.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 |

TemplateApp02

12 |

template file location: project root/content/templates/template02.ftl

13 |

Hello, ${name}

14 |

you've got a new messages(${count})

15 | 16 | 17 | -------------------------------------------------------------------------------- /content/template/template03.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 |

TemplateApp03

12 |

template file location: project root/content/templates/template03.ftl

13 |

Dog's name: ${dog.name}

14 |

Dog's age: ${dog.age}

15 |

Dog's sound: ${dog.sound()}

16 | 17 | 18 | -------------------------------------------------------------------------------- /content_navi2/template/login-err.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | ${header} 9 | 10 | 11 |

12 | Wrong combination of login and password given 13 |

14 |

Links:

15 | 16 | <#list links as link> 17 |
  • ${link.name}
  • 18 | 19 |
    20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /content_navi2/template/login-ok.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | ${header} 9 | 10 | 11 |

    12 | Hi, ${name}, you successfully logged in 13 |

    14 |

    Links:

    15 | 16 | <#list links as link> 17 |
  • ${link.name}
  • 18 | 19 |
    20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /content_navi2/template/login.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | ${header} 9 | 10 | 11 |

    12 | ${header} 13 |

    14 |
    15 | 16 | 17 | 18 |
    19 |

    Links:

    20 | 21 | <#list links as link> 22 |
  • ${link.name}
  • 23 | 24 |
    25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /content_upload/upload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | File Upload 10 | 11 | 12 |
    13 |
    14 | 15 | 16 |
    17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /devops/apache/apache_cmd.txt: -------------------------------------------------------------------------------- 1 | service httpd start 2 | service httpd stop 3 | service httpd restart 4 | -------------------------------------------------------------------------------- /devops/apache/apache_redirect.txt: -------------------------------------------------------------------------------- 1 | 2 | ServerName java.avtomir.kiev.ua 3 | ProxyPass / http://localhost:8080/ 4 | ProxyPassReverse / http://localhost:8080/ 5 | 6 | -------------------------------------------------------------------------------- /devops/apache/apache_std.txt: -------------------------------------------------------------------------------- 1 | 2 | ServerName www.avtomir.kiev.ua 3 | ServerAlias avtomir.kiev.ua 4 | DocumentRoot /var/www/www.avtomir.kiev.ua 5 | ErrorLog /var/log/httpd/www.avtomir.kiev.ua_error.log 6 | CustomLog /var/log/httpd/www.avtomir.kiev.ua_requests.log combined 7 | 8 | -------------------------------------------------------------------------------- /devops/git/git.txt: -------------------------------------------------------------------------------- 1 | git clone ....git -> gives error 2 | generate ssh-rsa key 3 | 1. ssh-keygen 4 | 2. take key ./ssh/id_rsa.pub 5 | 3. put it to 6 | https://github.com/alexr007/jetty-org.alexr.web-server/settings/keys 7 | https://github.com/alexr007/jetty-org.alexr.web-server/settings/keys/new 8 | 4. and use ssh to clone 9 | git clone git@github.com:alexr007/jetty-org.alexr.web-server.git 10 | and use own passphrase, which you enter at the key generating moment 11 | 5. done 12 | -------------------------------------------------------------------------------- /devops/maven/build_single_jar.sh: -------------------------------------------------------------------------------- 1 | mvn clean compile assembly:single 2 | -------------------------------------------------------------------------------- /devops/maven/clean.sh: -------------------------------------------------------------------------------- 1 | mvn clean 2 | -------------------------------------------------------------------------------- /devops/maven/windows_install.txt: -------------------------------------------------------------------------------- 1 | https://www.mkyong.com/maven/how-to-install-maven-in-windows/ 2 | -------------------------------------------------------------------------------- /devops/shell/run_single_jar.sh: -------------------------------------------------------------------------------- 1 | # running in console mode (^C to terminate) 2 | # running by specifying concrete JAR-file 3 | java -jar ./target/java-web-1.0-SNAPSHOT-jar-with-dependencies.jar 4 | 5 | # running in console mode (^C to terminate) 6 | # running by specifying class-path and explicitly entry-point (mainClass) 7 | java -cp ./target/java-web-1.0-SNAPSHOT-jar-with-dependencies.jar org.alexr.web.MinimalWebApplication 8 | 9 | # running in detached mode (ps | grep java-web... kill process_ID) 10 | java -jar ./target/java-web-1.0-SNAPSHOT-jar-with-dependencies.jar & 11 | -------------------------------------------------------------------------------- /devops/sql/create-table.sql: -------------------------------------------------------------------------------- 1 | create table messages1 ( 2 | id bigserial not null 3 | constraint messages_pk 4 | primary key, 5 | src bigint not null, 6 | dst bigint not null, 7 | text varchar 8 | ); 9 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.alexr 8 | java-web 9 | pom 10 | 1.0-SNAPSHOT 11 | 12 | 13 | 9.4.28.v20200408 14 | 1.7.25 15 | UTF-8 16 | 17 | 18 | 19 | 20 | 21 | 22 | org.apache.maven.plugins 23 | maven-compiler-plugin 24 | 3.8.1 25 | 26 | 8 27 | 8 28 | 29 | 30 | 31 | 32 | maven-surefire-plugin 33 | 2.22.2 34 | 35 | 36 | 37 | maven-assembly-plugin 38 | 39 | 40 | 41 | org.alexr.web.navi2.Navi2App 42 | 43 | 44 | 45 | jar-with-dependencies 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | org.eclipse.jetty 57 | jetty-servlet 58 | ${jetty.version} 59 | 60 | 61 | 62 | 63 | org.eclipse.jetty 64 | jetty-server 65 | ${jetty.version} 66 | 67 | 68 | 69 | 70 | mysql 71 | mysql-connector-java 72 | 8.0.17 73 | 74 | 75 | 76 | 77 | org.postgresql 78 | postgresql 79 | 42.2.8 80 | 81 | 82 | 83 | 84 | org.junit.jupiter 85 | junit-jupiter-api 86 | 5.5.2 87 | test 88 | 89 | 90 | 91 | org.junit.jupiter 92 | junit-jupiter-engine 93 | 5.5.2 94 | test 95 | 96 | 97 | 98 | org.freemarker 99 | freemarker 100 | 2.3.28 101 | 102 | 103 | 104 | org.slf4j 105 | slf4j-api 106 | ${slf4j.version} 107 | 108 | 109 | 110 | org.slf4j 111 | slf4j-log4j12 112 | ${slf4j.version} 113 | 114 | 115 | 116 | 117 | com.fasterxml.jackson.core 118 | jackson-databind 119 | 2.10.1 120 | 121 | 122 | 123 | 124 | com.fasterxml.jackson.dataformat 125 | jackson-dataformat-xml 126 | 2.10.1 127 | 128 | 129 | 130 | org.apache.httpcomponents 131 | httpclient 132 | 4.5.12 133 | 134 | 135 | com.google.http-client 136 | google-http-client 137 | 1.34.2 138 | 139 | 140 | com.google.http-client 141 | google-http-client-jackson2 142 | 1.34.2 143 | 144 | 145 | 146 | org.glassfish.jersey.containers 147 | jersey-container-grizzly2-http 148 | 2.30.1 149 | 150 | 151 | org.glassfish.jersey.inject 152 | jersey-hk2 153 | 2.30.1 154 | 155 | 156 | org.glassfish.jersey.media 157 | jersey-media-json-binding 158 | 2.30.1 159 | 160 | 161 | 162 | com.jcabi 163 | jcabi-http 164 | 1.17.2 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/_info.txt: -------------------------------------------------------------------------------- 1 | database 2 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step1conn/ConnectionApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step1conn; 2 | 3 | import java.sql.Connection; 4 | 5 | public class ConnectionApp { 6 | public static void main(String[] args) { 7 | // connection way # 1 8 | Connection conn1 = DbConnection.getConnection(); 9 | // connection way # 2 10 | Connection conn2 = DbConnection2.getConnection(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step1conn/DbConnection.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step1conn; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | 7 | public class DbConnection { 8 | private static final String DB_URL = "jdbc:postgresql://localhost:5432/ibatech"; 9 | private static final String USERNAME = "postgres"; 10 | private static final String USER_PASS = "secret"; 11 | 12 | private static Connection connection; 13 | 14 | private DbConnection() {} 15 | 16 | public static Connection getConnection() { 17 | if (connection == null) { 18 | try { 19 | connection = DriverManager.getConnection(DB_URL, USERNAME, USER_PASS); 20 | } catch (SQLException e) { 21 | throw new RuntimeException("Something went wrong during connection", e); 22 | } 23 | } 24 | return connection; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step1conn/DbConnection2.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step1conn; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | import java.util.Properties; 7 | 8 | public class DbConnection2 { 9 | private static final String DB_URL = "jdbc:postgresql://localhost:5432/ibatech"; 10 | private static final Properties props = new Properties(){{ 11 | setProperty("user","postgres"); 12 | setProperty("password","secret"); 13 | setProperty("ssl","false"); 14 | }}; 15 | 16 | private static Connection connection; 17 | 18 | private DbConnection2() {} 19 | 20 | public static Connection getConnection() { 21 | if (connection == null) { 22 | try { 23 | connection = DriverManager.getConnection(DB_URL, props); 24 | } catch (SQLException e) { 25 | throw new RuntimeException("Something went wrong during connection", e); 26 | } 27 | } 28 | return connection; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step1conn/_info.txt: -------------------------------------------------------------------------------- 1 | connection 2 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step2createtable/CreateTableApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step2createtable; 2 | 3 | import org.alexr.jdbc.step1conn.DbConnection; 4 | 5 | import java.sql.Connection; 6 | import java.sql.PreparedStatement; 7 | import java.sql.SQLException; 8 | 9 | public class CreateTableApp { 10 | public static void main(String[] args) throws SQLException { 11 | // 1 12 | Connection conn = DbConnection.getConnection(); 13 | 14 | String SQL = "create table messages1 (\n" + 15 | " id bigserial not null\n" + 16 | " constraint messages_pk\n" + 17 | "\t\t\tprimary key,\n" + 18 | "\tsrc bigint not null,\n" + 19 | "\tdst bigint not null,\n" + 20 | "\ttext varchar\n" + 21 | ");\n"; 22 | // 2 23 | PreparedStatement stmt = conn.prepareStatement(SQL); 24 | stmt.execute(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step2createtable/_info.txt: -------------------------------------------------------------------------------- 1 | create table statement 2 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step3insert/InsertApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step3insert; 2 | 3 | import org.alexr.jdbc.step1conn.DbConnection; 4 | 5 | import java.sql.Connection; 6 | import java.sql.PreparedStatement; 7 | import java.sql.SQLException; 8 | 9 | public class InsertApp { 10 | final static String SQLI = "INSERT INTO message1 (id, sender, content) VALUES (?, ?, ?)"; 11 | 12 | public static void main(String[] args) throws SQLException { 13 | Connection conn = DbConnection.getConnection(); 14 | PreparedStatement stmt = conn.prepareStatement(SQLI); 15 | stmt.setLong(1, 10); 16 | stmt.setLong(2, 11); 17 | stmt.setString(3, "hello"); 18 | stmt.execute(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step3insert/_info.txt: -------------------------------------------------------------------------------- 1 | insert into table statement 2 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step4select/SelectApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step4select; 2 | 3 | import org.alexr.jdbc.step1conn.DbConnection; 4 | 5 | import java.sql.Connection; 6 | import java.sql.PreparedStatement; 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | 10 | public class SelectApp { 11 | final static String SQLS = "SELECT * FROM message1"; 12 | 13 | public static void main(String[] args) throws SQLException { 14 | Connection conn = DbConnection.getConnection(); 15 | PreparedStatement stmt = conn.prepareStatement(SQLS); 16 | ResultSet rset = stmt.executeQuery(); 17 | // processing data 18 | while (rset.next()) { 19 | String line = String.format("sender:%s, content:%s, id:%d", 20 | rset.getString("sender"), 21 | rset.getString("content"), 22 | rset.getInt("id")); 23 | System.out.println(line); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step4select/_info.txt: -------------------------------------------------------------------------------- 1 | select from table statement 2 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/jdbc/step9extra/ExtraApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.jdbc.step9extra; 2 | 3 | import org.alexr.jdbc.step1conn.DbConnection; 4 | 5 | import java.sql.Connection; 6 | import java.sql.SQLException; 7 | 8 | public class ExtraApp { 9 | 10 | public static void main(String[] args) throws SQLException { 11 | Connection conn = DbConnection.getConnection(); 12 | // turn off default auto commit 13 | conn.setAutoCommit(false); 14 | // ... 15 | try { 16 | // insert 17 | // select 18 | // update 19 | // delete 20 | conn.commit(); 21 | } catch (SQLException e) { 22 | conn.rollback(); 23 | } 24 | // set different transaction isolation levels 25 | conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); 26 | conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 27 | conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 28 | conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 29 | 30 | int isolation = conn.getTransactionIsolation(); 31 | if (isolation == Connection.TRANSACTION_REPEATABLE_READ) {} 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/MinimalWebApplication.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web; 2 | 3 | import org.alexr.web.servlet.HelloServlet; 4 | import org.eclipse.jetty.server.Server; 5 | import org.eclipse.jetty.servlet.ServletContextHandler; 6 | 7 | /** 8 | * http://localhost:9001 9 | */ 10 | public class MinimalWebApplication { 11 | public static void main(String[] args) throws Exception { 12 | Server server = new Server(9001); 13 | 14 | ServletContextHandler handler = new ServletContextHandler(); 15 | 16 | handler.addServlet(HelloServlet.class, "/*"); 17 | 18 | server.setHandler(handler); 19 | server.start(); 20 | server.join(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/WebApplication.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 4 | import org.alexr.web.service.Auth; 5 | import org.alexr.web.service.AuthService; 6 | import org.alexr.web.servlet.*; 7 | import org.eclipse.jetty.server.Server; 8 | import org.eclipse.jetty.servlet.ServletContextHandler; 9 | import org.eclipse.jetty.servlet.ServletHolder; 10 | 11 | public class WebApplication { 12 | public static void main(String[] args) throws Exception { 13 | Server server = new Server(9001); 14 | 15 | ServletContextHandler handler = new ServletContextHandler(); 16 | 17 | handler.addServlet(ExploreRequestServlet.class, "/ex/*"); 18 | handler.addServlet(HelloServlet.class, "/*"); 19 | handler.addServlet(ServletFile.class, "/static/*"); 20 | Auth authService = new AuthService(); 21 | handler.addServlet(new ServletHolder(new LoginServlet(authService)), "/login/*"); 22 | 23 | TemplateEngine te = TemplateEngine.folder("./content/templates"); 24 | handler.addServlet(new ServletHolder(new TemplateServlet(te)), "/te/*"); 25 | 26 | server.setHandler(handler); 27 | server.start();; 28 | server.join(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/_info.txt: -------------------------------------------------------------------------------- 1 | 1. Application structure 2 | - server 3 | - context handler 4 | - holder 5 | - servlet 6 | 2. Maven 7 | - pom.xml 8 | - building executable jar 9 | - running app from console 10 | 3. Servlet API 11 | - request / response 12 | - context 13 | - parameters handling 14 | - path parsing 15 | 4. Redirect 16 | 5. Operations with content 17 | - file downloading 18 | - template Engine (FreeMarker) 19 | - Jackson JSON, XML 20 | 6. Dependency injection 21 | - via Servlet constructor 22 | 7. Cookies 23 | - max age 24 | - simple authorisation 25 | - path 26 | - http only 27 | 8. Session 28 | 9. Filters 29 | 10. Logging 30 | 11. Handling exceptions 31 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/cookies/CookieApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.cookies; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | 6 | /** 7 | * http://localhost:9001/a 8 | */ 9 | public class CookieApp { 10 | public static void main(String[] args) throws Exception { 11 | ServletContextHandler handler = new ServletContextHandler(); 12 | 13 | handler.addServlet(CookieServletA.class, "/a/*"); 14 | handler.addServlet(CookieServletB.class, "/b/*"); 15 | 16 | Server server = new Server(9001); 17 | server.setHandler(handler); 18 | server.start();; 19 | server.join(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/cookies/CookieServletA.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.cookies; 2 | 3 | import javax.servlet.http.Cookie; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | /** 11 | * localhost:9001/a/1/2/3/4/5?x=5&y=+++ 12 | */ 13 | public class CookieServletA extends HttpServlet { 14 | @Override 15 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 16 | Cookie cookie = new Cookie("%A", "123"); 17 | // cookie.setMaxAge(20); // in seconds 18 | resp.addCookie(cookie); 19 | try (PrintWriter w = resp.getWriter()) { 20 | w.printf("getProtocol:%s\ngetServerName:%s\ngetServerPort%s\n" + 21 | "getServletPath:%s\ngetContextPath: %s\n" + 22 | "getPathInfo:%s\ngetQueryString:%s\n" + 23 | "getRequestURL:%s\ngetRequestURI:%s\n" + 24 | "%s", 25 | req.getProtocol(), // HTTP/1.1 26 | req.getServerName(), // localhost 27 | req.getServerPort(), // 9001 28 | 29 | req.getServletPath(), // /a 30 | req.getContextPath(), // EMPTY 31 | 32 | req.getPathInfo(), // /1/2/3/4/5 - all between servlet mapping "/a" and parameters or NULL 33 | req.getQueryString(), // x=5&y=+++ or NULL 34 | 35 | req.getRequestURL(), // http://localhost:9001/a/1/2/3/4/5 36 | req.getRequestURI(), // /a/1/2/3/4/5 37 | "" 38 | ); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/cookies/CookieServletB.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.cookies; 2 | 3 | import javax.servlet.http.Cookie; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | public class CookieServletB extends HttpServlet { 9 | @Override 10 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) { 11 | Cookie cookie = new Cookie("%B", "123"); 12 | // cookie.setMaxAge(20); // in seconds 13 | resp.addCookie(cookie); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/entity/Person.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.entity; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Person { 7 | private int id; 8 | private String name; 9 | private int age; 10 | private List skills; 11 | 12 | public Person() { } 13 | 14 | public Person(int id, String name, int age) { 15 | this(id, name, age, new ArrayList<>(0)); 16 | } 17 | 18 | public Person(int id, String name, int age, List skills) { 19 | this.id = id; 20 | this.name = name; 21 | this.age = age; 22 | this.skills = skills; 23 | } 24 | 25 | public String getName() { 26 | return name; 27 | } 28 | 29 | public int getAge() { 30 | return age; 31 | } 32 | 33 | public int getId() { 34 | return id; 35 | } 36 | 37 | public List getSkills() { 38 | return skills; 39 | } 40 | 41 | public void setId(int id) { 42 | this.id = id; 43 | } 44 | 45 | public void setName(String name) { 46 | this.name = name; 47 | } 48 | 49 | public void setAge(int age) { 50 | this.age = age; 51 | } 52 | 53 | public void setSkills(List skills) { 54 | this.skills = skills; 55 | } 56 | 57 | @Override 58 | public String toString() { 59 | return String.format("Person{id=%d, name='%s', age=%d, skills=%s}", id, name, age, skills); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/filters/App1Problem.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.filters; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | 6 | /** 7 | * servlet located at: 8 | * http://localhost:9001/c?x=2 9 | * http://localhost:9001/c?x=2&y=3 10 | */ 11 | public class App1Problem { 12 | public static void main(String[] args) throws Exception { 13 | ServletContextHandler handler = new ServletContextHandler(); 14 | handler.addServlet(ServletNastyDesign.class, "/c/*"); 15 | 16 | Server server = new Server(9001); 17 | server.setHandler(handler); 18 | server.start();; 19 | server.join(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/filters/App2Solution.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.filters; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | 6 | import javax.servlet.DispatcherType; 7 | import java.util.EnumSet; 8 | 9 | /** 10 | * servlet located at: 11 | * http://localhost:9002/c?x=3 12 | * http://localhost:9002/c?x=2&y=3 13 | */ 14 | public class App2Solution { 15 | public static void main(String[] args) throws Exception { 16 | ServletContextHandler handler = new ServletContextHandler(); 17 | handler.addServlet(ServletGoodDesign.class, "/c/*"); 18 | handler.addFilter(ParamsFilter.class, "/c/*", EnumSet.of(DispatcherType.REQUEST)); 19 | 20 | Server server = new Server(9002); 21 | server.setHandler(handler); 22 | server.start();; 23 | server.join(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/filters/ParamsFilter.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.filters; 2 | 3 | import javax.servlet.Filter; 4 | import javax.servlet.FilterChain; 5 | import javax.servlet.FilterConfig; 6 | import javax.servlet.ServletException; 7 | import javax.servlet.ServletRequest; 8 | import javax.servlet.ServletResponse; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | public class ParamsFilter implements Filter { 13 | @Override 14 | public void init(FilterConfig filterConfig) { } 15 | 16 | @Override 17 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 18 | String xs = request.getParameter("x"); 19 | String ys = request.getParameter("x"); 20 | try { 21 | int x = Integer.parseInt(xs); 22 | int y = Integer.parseInt(ys); 23 | // extra checks, extra if... 24 | 25 | // if everything is OK - pass forward 26 | chain.doFilter(request, response); 27 | } catch (NumberFormatException ex) { 28 | // in another case 29 | response.getWriter().println("smt went wrong"); 30 | if (response instanceof HttpServletResponse) { 31 | HttpServletResponse rs = (HttpServletResponse) response; 32 | // or even... 33 | // rs.sendRedirect("https://www.google.com"); 34 | } 35 | } 36 | } 37 | 38 | @Override 39 | public void destroy() {} 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/filters/ServletGoodDesign.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.filters; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | 8 | public class ServletGoodDesign extends HttpServlet { 9 | /** 10 | * the solution: 11 | * Filter usage 12 | * but don't forget to attach the filter to our server 13 | */ 14 | @Override 15 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 16 | int x = Integer.parseInt(req.getParameter("x")); 17 | int y = Integer.parseInt(req.getParameter("y")); 18 | int z = x + y; 19 | resp.getWriter().print(z); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/filters/ServletNastyDesign.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.filters; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | import java.io.PrintWriter; 8 | 9 | public class ServletNastyDesign extends HttpServlet { 10 | /** 11 | * the problem: 12 | * we have to do a lot of checking stuff to do in each servlet 13 | * BEFOREHAND real operation 14 | */ 15 | @Override 16 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 17 | String xs = req.getParameter("x"); 18 | String ys = req.getParameter("y"); 19 | if (xs != null && ys != null) { // and so on........... 20 | try { 21 | int x = Integer.parseInt(xs); 22 | int y = Integer.parseInt(ys); 23 | int z = x + y; 24 | PrintWriter w = resp.getWriter(); 25 | w.println(z); 26 | } catch (NumberFormatException ex) { 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/Dog.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | public class Dog { 4 | private final int age; 5 | private final String name; 6 | 7 | public Dog(int age, String name) { 8 | this.age = age; 9 | this.name = name; 10 | } 11 | 12 | public int getAge() { 13 | return age; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | 20 | public String sound() { 21 | return "Bark!"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/FreemarkerServlet02.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | import java.util.HashMap; 8 | 9 | public class FreemarkerServlet02 extends HttpServlet { 10 | 11 | private TemplateEngine engine; 12 | 13 | public FreemarkerServlet02(TemplateEngine engine) { 14 | this.engine = engine; 15 | } 16 | 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 19 | String jim = "Jim"; 20 | int num = 42; 21 | 22 | HashMap data = new HashMap<>(); 23 | data.put("name", jim); 24 | data.put("count", String.valueOf(num)); 25 | 26 | engine.render("template02.ftl", data, resp); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/FreemarkerServlet03.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | import java.util.HashMap; 8 | 9 | public class FreemarkerServlet03 extends HttpServlet { 10 | 11 | private TemplateEngine engine; 12 | 13 | public FreemarkerServlet03(TemplateEngine engine) { 14 | this.engine = engine; 15 | } 16 | 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 19 | Dog jack = new Dog(33, "Jack"); 20 | 21 | HashMap data = new HashMap<>(); 22 | data.put("dog", jack); 23 | 24 | engine.render("template03.ftl", data, resp); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/FreemarkerServlet04.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | import java.util.HashMap; 8 | import java.util.List; 9 | import java.util.stream.Collectors; 10 | import java.util.stream.Stream; 11 | 12 | public class FreemarkerServlet04 extends HttpServlet { 13 | 14 | private TemplateEngine engine; 15 | 16 | public FreemarkerServlet04(TemplateEngine engine) { 17 | this.engine = engine; 18 | } 19 | 20 | @Override 21 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 22 | List ints = Stream 23 | .generate(() -> (int)(Math.random() * 10)) 24 | .limit(7) 25 | .collect(Collectors.toList()); 26 | 27 | HashMap data = new HashMap<>(); 28 | data.put("randoms", ints); 29 | 30 | engine.render("template04.ftl", data, resp); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/PlaceHolderServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.*; 8 | 9 | public class PlaceHolderServlet extends HttpServlet { 10 | 11 | @Override 12 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 13 | String name = "Jim"; 14 | int number = 43; 15 | BufferedReader br = new BufferedReader(new FileReader(new File("./content/template/template.html"))); 16 | try(PrintWriter w = resp.getWriter()) { 17 | br.lines().forEach(s -> { 18 | s = s.replaceAll("\\$user", name); 19 | s = s.replaceAll("\\$count", String.valueOf(number)); 20 | w.println(s); 21 | }); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/TemplateApp01.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | 6 | /** 7 | * servlet location: 8 | * http://localhost:9001/ph1 9 | */ 10 | public class TemplateApp01 { 11 | public static void main(String[] args) throws Exception { 12 | ServletContextHandler handler = new ServletContextHandler(); 13 | handler.addServlet(PlaceHolderServlet.class, "/ph1/*"); 14 | 15 | Server server = new Server(9001); 16 | server.setHandler(handler); 17 | server.start(); 18 | server.join(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/TemplateApp02.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | import org.eclipse.jetty.servlet.ServletHolder; 6 | 7 | /** 8 | * servlet location: 9 | * http://localhost:9002/fm2 10 | */ 11 | public class TemplateApp02 { 12 | public static void main(String[] args) throws Exception { 13 | TemplateEngine engine = TemplateEngine.folder("./content/template"); 14 | 15 | ServletContextHandler handler = new ServletContextHandler(); 16 | handler.addServlet(new ServletHolder(new FreemarkerServlet02(engine)), "/fm2/*"); 17 | 18 | Server server = new Server(9002); 19 | server.setHandler(handler); 20 | server.start(); 21 | server.join(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/TemplateApp03.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | import org.eclipse.jetty.servlet.ServletHolder; 6 | 7 | /** 8 | * servlet location: 9 | * http://localhost:9003/fm3 10 | */ 11 | public class TemplateApp03 { 12 | public static void main(String[] args) throws Exception { 13 | TemplateEngine engine = TemplateEngine.folder("./content/template"); 14 | // similar way 15 | // but it won't compile because of private constructor 16 | // TemplateEngine engine2 = new TemplateEngine("./content/template"); 17 | 18 | ServletContextHandler handler = new ServletContextHandler(); 19 | handler.addServlet(new ServletHolder(new FreemarkerServlet03(engine)), "/fm3/*"); 20 | 21 | Server server = new Server(9003); 22 | server.setHandler(handler); 23 | server.start(); 24 | server.join(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/TemplateApp04.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | import org.eclipse.jetty.servlet.ServletHolder; 6 | 7 | /** 8 | * servlet location: 9 | * http://localhost:9004/fm4 10 | */ 11 | public class TemplateApp04 { 12 | public static void main(String[] args) throws Exception { 13 | TemplateEngine engine = TemplateEngine.resources("/template"); 14 | 15 | ServletContextHandler handler = new ServletContextHandler(); 16 | handler.addServlet(new ServletHolder(new FreemarkerServlet04(engine)), "/fm4/*"); 17 | 18 | Server server = new Server(9004); 19 | server.setHandler(handler); 20 | server.start(); 21 | server.join(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/freemarker/TemplateEngine.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.freemarker; 2 | 3 | import freemarker.template.Configuration; 4 | import freemarker.template.TemplateException; 5 | import freemarker.template.TemplateExceptionHandler; 6 | 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.net.URISyntaxException; 11 | import java.nio.charset.StandardCharsets; 12 | import java.nio.file.Paths; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | public final class TemplateEngine { 17 | 18 | private final Configuration config; 19 | 20 | public static TemplateEngine folder(final String path_from_project_root) throws IOException { 21 | return new TemplateEngine(path_from_project_root); 22 | } 23 | 24 | public static TemplateEngine resources(final String path_from_project_resources) throws IOException, URISyntaxException { 25 | String path = Paths 26 | .get(TemplateEngine.class.getResource(path_from_project_resources).toURI()) 27 | .toFile().getAbsolutePath(); 28 | return new TemplateEngine(path); 29 | } 30 | 31 | private TemplateEngine(final String path) throws IOException { 32 | this.config = new Configuration(Configuration.VERSION_2_3_28) {{ 33 | setDirectoryForTemplateLoading(new File(path)); 34 | setDefaultEncoding(String.valueOf(StandardCharsets.UTF_8)); 35 | setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); 36 | setLogTemplateExceptions(false); 37 | setWrapUncheckedExceptions(true); 38 | }}; 39 | } 40 | 41 | public void render(final String templateFile, final HttpServletResponse resp) throws IOException { 42 | render(templateFile, new HashMap<>(), resp); 43 | } 44 | 45 | public void render(final String templateFile, final Map data, final HttpServletResponse resp) throws IOException { 46 | try { 47 | resp.setCharacterEncoding(String.valueOf(StandardCharsets.UTF_8)); 48 | config.getTemplate(templateFile).process(data, resp.getWriter()); 49 | } catch (TemplateException ex) { 50 | throw new IllegalArgumentException("Freemarker render error", ex); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/jackson/JacksonServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.jackson; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import org.alexr.web.entity.Person; 5 | 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.BufferedReader; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | import java.util.Arrays; 13 | import java.util.stream.Collectors; 14 | 15 | /** 16 | * detailed documentation can be found here: 17 | * 18 | * https://www.baeldung.com/jackson-object-mapper-tutorial 19 | * https://www.baeldung.com/jackson-xml-serialization-and-deserialization 20 | */ 21 | public class JacksonServlet extends HttpServlet { 22 | 23 | private final ObjectMapper mapper; 24 | 25 | public JacksonServlet(ObjectMapper mapper) { 26 | this.mapper = mapper; 27 | } 28 | 29 | /** 30 | * writing value to the browser 31 | * 32 | * in order to serialize - you need to have 33 | * getters for all fields 34 | */ 35 | @Override 36 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 37 | Person john = new Person(123, "John", 42); 38 | Person jim = new Person(234, "Jim", 55, Arrays.asList("Developer", "Leader")); 39 | try (PrintWriter w = resp.getWriter()) { 40 | w.println( mapper.writeValueAsString(john) ); 41 | w.println(mapper.writeValueAsString(jim) ); 42 | } 43 | } 44 | 45 | /** 46 | * reading value from POST request: 47 | * 48 | * in order to deserialize - you need to have 49 | * default constructor w/o parameters 50 | * and setter for all fields 51 | * 52 | * JSON test data: 53 | * {"id":119,"name":"Irene","age":66,"skills":["Manager","Trainer","Teacher"]} 54 | * XML test data: 55 | * 999Tamara22MasterTrainer 56 | */ 57 | @Override 58 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 59 | // obtain a reader from the request 60 | BufferedReader body_reader = req.getReader(); 61 | // read data to string. If we read only one object 62 | // without printing we can read directly from the `Reader` (BufferedReader) 63 | // we need that only for printing intermediate results 64 | String body = body_reader.lines().collect(Collectors.joining()); 65 | // Person person = mapper.readValue(body_reader, Person.class); 66 | Person person = mapper.readValue(body, Person.class); 67 | System.out.println("==== text data============"); 68 | System.out.println(body); 69 | System.out.println("==== deserialized to ====="); 70 | System.out.println(person); 71 | System.out.println("=========================="); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/jackson/JacksonWebApplication.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.jackson; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.dataformat.xml.XmlMapper; 5 | import org.eclipse.jetty.server.Server; 6 | import org.eclipse.jetty.servlet.ServletContextHandler; 7 | import org.eclipse.jetty.servlet.ServletHolder; 8 | 9 | /** 10 | * servlet location 11 | * http://localhost:9010/j 12 | * http://localhost:9010/x 13 | */ 14 | public class JacksonWebApplication { 15 | public static void main(String[] args) throws Exception { 16 | ServletContextHandler handler = new ServletContextHandler(); 17 | handler.addServlet(new ServletHolder(new JacksonServlet(new ObjectMapper())), "/j/*"); 18 | handler.addServlet(new ServletHolder(new JacksonServlet(new XmlMapper())), "/x/*"); 19 | 20 | Server server = new Server(9010); 21 | server.setHandler(handler); 22 | server.start(); 23 | server.join(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/LinkItem.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | public class LinkItem { 4 | private final String href; 5 | private final String name; 6 | 7 | public LinkItem(String href, String name) { 8 | this.href = href; 9 | this.name = name; 10 | } 11 | 12 | public String getHref() { 13 | return href; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/LoginServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | 13 | public class LoginServlet extends HttpServlet { 14 | 15 | private final TemplateEngine te; 16 | 17 | public LoginServlet(TemplateEngine te) { 18 | this.te = te; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 | HashMap data = new HashMap<>(); 24 | 25 | data.put("header", "This is a login page"); 26 | data.put("links", Arrays.asList( 27 | new LinkItem("/menu", "Menu"), 28 | new LinkItem("/logout", "Logout"), 29 | new LinkItem("http://google.com", "Google") 30 | )); 31 | te.render("navi.ftl", data, resp); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/LogoutServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | 13 | public class LogoutServlet extends HttpServlet { 14 | 15 | private final TemplateEngine te; 16 | 17 | public LogoutServlet(TemplateEngine te) { 18 | this.te = te; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 | HashMap data = new HashMap<>(); 24 | 25 | data.put("header", "This is a logout page"); 26 | data.put("links", Arrays.asList( 27 | new LinkItem("/menu", "Menu"), 28 | new LinkItem("/login", "Login") 29 | )); 30 | te.render("navi.ftl", data, resp); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/MenuServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | 13 | public class MenuServlet extends HttpServlet { 14 | 15 | private final TemplateEngine te; 16 | 17 | public MenuServlet(TemplateEngine te) { 18 | this.te = te; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 | HashMap data = new HashMap<>(); 24 | 25 | data.put("header", "This is menu"); 26 | data.put("links", Arrays.asList( 27 | new LinkItem("/login", "Login"), 28 | new LinkItem("/logout", "Logout") 29 | )); 30 | te.render("navi.ftl", data, resp); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/NaviApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 4 | import org.eclipse.jetty.server.Server; 5 | import org.eclipse.jetty.servlet.ServletContextHandler; 6 | import org.eclipse.jetty.servlet.ServletHolder; 7 | 8 | /** 9 | * http://localhost:9001 10 | */ 11 | public class NaviApp { 12 | public static void main(String[] args) throws Exception { 13 | TemplateEngine te = TemplateEngine.resources("/template"); 14 | ServletContextHandler handler = new ServletContextHandler(); 15 | 16 | handler.addServlet((new ServletHolder(new StaticContentServlet("content"))), "/static/*"); 17 | handler.addServlet((new ServletHolder(new MenuServlet(te))), "/menu/*"); 18 | handler.addServlet((new ServletHolder(new LoginServlet(te))), "/login/*"); 19 | handler.addServlet((new ServletHolder(new LogoutServlet(te))), "/logout/*"); 20 | handler.addServlet(new ServletHolder(new RedirectServlet("/login")), "/*"); 21 | 22 | Server server = new Server(9001); 23 | server.setHandler(handler); 24 | server.start(); 25 | server.join(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/RedirectServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | public class RedirectServlet extends HttpServlet { 10 | 11 | private final String redirectTo; 12 | 13 | public RedirectServlet(String redirectTo) { 14 | this.redirectTo = redirectTo; 15 | } 16 | 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 | resp.sendRedirect(redirectTo); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi/StaticContentServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.ServletOutputStream; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.nio.file.Files; 10 | import java.nio.file.Path; 11 | import java.nio.file.Paths; 12 | 13 | public class StaticContentServlet extends HttpServlet { 14 | private final String baseFolder; 15 | 16 | public StaticContentServlet(String baseFolder) { 17 | this.baseFolder = baseFolder; 18 | } 19 | 20 | @Override 21 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 22 | Path path = Paths.get(baseFolder, req.getPathInfo()); 23 | ServletOutputStream os = resp.getOutputStream(); 24 | Files.copy(path, os); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/Navi2App.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 4 | import org.alexr.web.navi2.servlet.*; 5 | import org.alexr.web.service.Auth; 6 | import org.alexr.web.service.AuthService; 7 | import org.eclipse.jetty.server.Server; 8 | import org.eclipse.jetty.servlet.ServletContextHandler; 9 | import org.eclipse.jetty.servlet.ServletHolder; 10 | 11 | /** 12 | * http://localhost:9009/login 13 | */ 14 | public class Navi2App { 15 | public static void main(String[] args) throws Exception { 16 | Auth auth = new AuthService(); 17 | 18 | TemplateEngine te = TemplateEngine.folder("./content_navi2/template"); 19 | ServletContextHandler handler = new ServletContextHandler(); 20 | 21 | // static content 22 | handler.addServlet((new ServletHolder(new SvtStaticContent("./content_navi2"))), "/static/*"); 23 | 24 | // login/logout operations 25 | handler.addServlet((new ServletHolder(new SvtLogin(te, auth))), "/login/*"); 26 | handler.addServlet((new ServletHolder(new SvtLogout(te))), "/logout/*"); 27 | 28 | // menu / calc / history 29 | handler.addServlet((new ServletHolder(new SvtMenu(te))), "/menu/*"); 30 | handler.addServlet((new ServletHolder(new SvtCalc(te))), "/calc/*"); 31 | handler.addServlet((new ServletHolder(new SvtHistory(te))), "/history/*"); 32 | 33 | // redirect for all other wrong requests 34 | handler.addServlet(new ServletHolder(new SvtRedirect("/login")), "/*"); 35 | 36 | Server server = new Server(9009); 37 | server.setHandler(handler); 38 | server.start(); 39 | server.join(); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/_info.txt: -------------------------------------------------------------------------------- 1 | This is the same project as the `navi`, 2 | + it contains GET/POST 3 | + authorization with cookies 4 | + it handles static content (css, images, ...) located in the folder `content_navi2` 5 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/LinkItem.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class LinkItem { 7 | private final String href; 8 | private final String name; 9 | 10 | public LinkItem(String href, String name) { 11 | this.href = href; 12 | this.name = name; 13 | } 14 | 15 | public String getHref() { 16 | return href; 17 | } 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public static List allLinks() { 24 | return Arrays.asList( 25 | new LinkItem("/login", "Login"), 26 | new LinkItem("/logout", "Logout"), 27 | new LinkItem("/menu", "Menu"), 28 | new LinkItem("/calc", "Calc"), 29 | new LinkItem("/history", "History"), 30 | new LinkItem("http://www.google.com", "Google") 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtCalc.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | 11 | public class SvtCalc extends HttpServlet { 12 | 13 | private final TemplateEngine te; 14 | 15 | public SvtCalc(TemplateEngine te) { 16 | this.te = te; 17 | } 18 | 19 | @Override 20 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 | super.doGet(req, resp); 22 | } 23 | 24 | @Override 25 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 26 | super.doPost(req, resp); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtHistory.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | 11 | public class SvtHistory extends HttpServlet { 12 | 13 | private final TemplateEngine te; 14 | 15 | public SvtHistory(TemplateEngine te) { 16 | this.te = te; 17 | } 18 | 19 | @Override 20 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 | super.doGet(req, resp); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtLogin.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 4 | import org.alexr.web.service.Auth; 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 | import java.io.IOException; 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | public class SvtLogin extends HttpServlet { 15 | 16 | private final TemplateEngine te; 17 | private final Auth auth; 18 | 19 | public SvtLogin(TemplateEngine te, Auth auth) { 20 | this.te = te; 21 | this.auth = auth; 22 | } 23 | 24 | @Override 25 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 26 | HashMap data = new HashMap<>(); 27 | 28 | data.put("header", "This is login page"); 29 | data.put("links", LinkItem.allLinks()); 30 | te.render("login.ftl", data, resp); 31 | } 32 | 33 | @Override 34 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 35 | String u_name = req.getParameter("u_name"); 36 | String u_password = req.getParameter("u_password"); 37 | 38 | Map data = new HashMap<>(); 39 | data.put("links", LinkItem.allLinks()); 40 | data.put("header", "Login result"); 41 | 42 | if (auth.check(u_name, u_password)) { 43 | data.put("name", u_name); 44 | te.render("login-ok.ftl", data, resp); 45 | } else { 46 | te.render("login-err.ftl", data, resp); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtLogout.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | 13 | public class SvtLogout extends HttpServlet { 14 | 15 | private final TemplateEngine te; 16 | 17 | public SvtLogout(TemplateEngine te) { 18 | this.te = te; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 | HashMap data = new HashMap<>(); 24 | 25 | data.put("header", "This is a logout page"); 26 | data.put("links", LinkItem.allLinks()); 27 | te.render("navi.ftl", data, resp); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtMenu.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import org.alexr.web.freemarker.TemplateEngine; 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 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | 13 | public class SvtMenu extends HttpServlet { 14 | 15 | private final TemplateEngine te; 16 | 17 | public SvtMenu(TemplateEngine te) { 18 | this.te = te; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 | HashMap data = new HashMap<>(); 24 | 25 | data.put("header", "This is menu"); 26 | data.put("links", LinkItem.allLinks()); 27 | te.render("navi.ftl", data, resp); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtRedirect.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | public class SvtRedirect extends HttpServlet { 10 | 11 | private final String redirectTo; 12 | 13 | public SvtRedirect(String redirectTo) { 14 | this.redirectTo = redirectTo; 15 | } 16 | 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 | resp.sendRedirect(redirectTo); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/navi2/servlet/SvtStaticContent.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.navi2.servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.ServletOutputStream; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.nio.file.Files; 10 | import java.nio.file.Path; 11 | import java.nio.file.Paths; 12 | 13 | public class SvtStaticContent extends HttpServlet { 14 | private final String baseFolder; 15 | 16 | public SvtStaticContent(String baseFolder) { 17 | this.baseFolder = baseFolder; 18 | } 19 | 20 | @Override 21 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 22 | Path path = Paths.get(baseFolder, req.getPathInfo()); 23 | ServletOutputStream os = resp.getOutputStream(); 24 | Files.copy(path, os); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/RequestAppApache.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request; 2 | 3 | import org.apache.http.client.config.RequestConfig; 4 | 5 | public class RequestAppApache { 6 | public static void main(String[] args) { 7 | RequestConfig config = RequestConfig.custom() 8 | .setConnectTimeout(100) 9 | .setConnectionRequestTimeout(100) 10 | .setSocketTimeout(300) 11 | .build(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/RequestAppGoogleHttp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request; 2 | 3 | import com.google.api.client.http.GenericUrl; 4 | import com.google.api.client.http.HttpRequest; 5 | import com.google.api.client.http.HttpRequestFactory; 6 | import com.google.api.client.http.HttpTransport; 7 | import com.google.api.client.http.javanet.NetHttpTransport; 8 | import com.google.api.client.json.JsonFactory; 9 | import com.google.api.client.json.JsonObjectParser; 10 | import com.google.api.client.json.jackson2.JacksonFactory; 11 | 12 | import java.io.IOException; 13 | 14 | /** 15 | * https://www.baeldung.com/google-http-client 16 | */ 17 | public class RequestAppGoogleHttp { 18 | 19 | static HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 20 | static JsonFactory JSON_FACTORY = new JacksonFactory(); 21 | 22 | public static void main(String[] args) throws IOException { 23 | HttpRequestFactory requestFactory = new NetHttpTransport().createRequestFactory(); 24 | HttpRequest request = requestFactory.buildGetRequest( 25 | new GenericUrl("https://github.com")); 26 | String rawResponse = request.execute().parseAsString(); 27 | 28 | HttpRequestFactory requestFactory2 = HTTP_TRANSPORT.createRequestFactory( 29 | (HttpRequest rq) -> rq.setParser(new JsonObjectParser(JSON_FACTORY)) 30 | ); 31 | 32 | 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/RequestAppOkHttp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request; 2 | 3 | public class RequestAppOkHttp { 4 | public static void main(String[] args) { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/RequestAppVertX.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request; 2 | 3 | public class RequestAppVertX { 4 | public static void main(String[] args) { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jcabi/HttpClient2Get.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jcabi; 2 | 3 | import com.jcabi.http.Request; 4 | import com.jcabi.http.request.JdkRequest; 5 | import org.alexr.web.rest.Book; 6 | 7 | import java.io.IOException; 8 | import java.net.URL; 9 | 10 | public class HttpClient2Get { 11 | public static void main(String[] args) throws IOException { 12 | Book book = new JdkRequest(new URL("http://localhost:8081/shop/books/1")) 13 | .method(Request.GET) 14 | .fetch() 15 | .as(JacksonWithPojoResponse.class) 16 | .toPojo(Book.class); 17 | System.out.println(book); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jcabi/HttpClient2Post.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jcabi; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.jcabi.http.Request; 5 | import com.jcabi.http.request.JdkRequest; 6 | import org.alexr.web.rest.Book; 7 | 8 | import javax.ws.rs.core.HttpHeaders; 9 | import javax.ws.rs.core.MediaType; 10 | import java.io.IOException; 11 | import java.net.URL; 12 | import java.util.Arrays; 13 | 14 | public class HttpClient2Post { 15 | private static final ObjectMapper mapper = new ObjectMapper(); 16 | 17 | public static void main(String[] args) throws IOException { 18 | Book book = new Book(77, "JavaScript", "Mister Bin", Arrays.asList(";)", ":)", ";(")); 19 | 20 | new JdkRequest(new URL("http://localhost:8081/shop/books")) 21 | .method(Request.POST) 22 | .body() 23 | .set(mapper.writeValueAsBytes(book)) 24 | .back() 25 | .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) // what is sent 26 | .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) // what is expected 27 | // .header(HttpHeaders.SET_COOKIE, "MyCookie=315") 28 | .fetch(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jcabi/JacksonWithPojoResponse.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jcabi; 2 | 3 | import com.fasterxml.jackson.core.JsonParser; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import com.jcabi.aspects.Immutable; 6 | import com.jcabi.http.Request; 7 | import com.jcabi.http.Response; 8 | 9 | import java.io.IOException; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | @Immutable 14 | public final class JacksonWithPojoResponse implements Response { 15 | 16 | private final transient Response response; 17 | 18 | private static final ObjectMapper MAPPER = new ObjectMapper() 19 | .configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); 20 | 21 | public JacksonWithPojoResponse(final Response resp) { 22 | this.response = resp; 23 | } 24 | 25 | public T toPojo(final Class type) { 26 | try { 27 | return MAPPER.readValue(this.binary(), type); 28 | } catch (IOException e) { 29 | throw new IllegalArgumentException( 30 | "Cannot read as an object. The JSON is not a valid object." 31 | ); 32 | } 33 | } 34 | 35 | @Override 36 | public Request back() { 37 | return this.response.back(); 38 | } 39 | 40 | @Override 41 | public int status() { 42 | return this.response.status(); 43 | } 44 | 45 | @Override 46 | public String reason() { 47 | return this.response.reason(); 48 | } 49 | 50 | @Override 51 | public Map> headers() { 52 | return this.response.headers(); 53 | } 54 | 55 | @Override 56 | public String body() { 57 | return this.response.body(); 58 | } 59 | 60 | @Override 61 | public byte[] binary() { 62 | return this.response.binary(); 63 | } 64 | 65 | @Override 66 | public T as(Class type) { 67 | return this.response.as(type); 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jdk/Book.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jdk; 2 | 3 | import java.util.List; 4 | 5 | public class Book { 6 | private int id; 7 | private String name; 8 | private String author; 9 | private List topics; 10 | 11 | public Book(int id, String name, String author, List topics) { 12 | this.id = id; 13 | this.name = name; 14 | this.author = author; 15 | this.topics = topics; 16 | } 17 | 18 | public Book() { } 19 | 20 | public int getId() { 21 | return id; 22 | } 23 | 24 | public void setId(int id) { 25 | this.id = id; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | public String getAuthor() { 37 | return author; 38 | } 39 | 40 | public void setAuthor(String author) { 41 | this.author = author; 42 | } 43 | 44 | public List getTopics() { 45 | return topics; 46 | } 47 | 48 | public void setTopics(List topics) { 49 | this.topics = topics; 50 | } 51 | 52 | @Override 53 | public String toString() { 54 | return String.format("Book:[id=%d, name='%s', author='%s', topics=%s]", id, name, author, topics); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jdk/HttpClient1Get.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jdk; 2 | 3 | import com.fasterxml.jackson.core.JsonProcessingException; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | 6 | import javax.ws.rs.HttpMethod; 7 | import java.io.BufferedReader; 8 | import java.io.IOException; 9 | import java.io.InputStreamReader; 10 | import java.net.HttpURLConnection; 11 | import java.net.URL; 12 | import java.util.Optional; 13 | import java.util.stream.Collectors; 14 | 15 | public class HttpClient1Get { 16 | 17 | private final static ObjectMapper mapper = new ObjectMapper(); 18 | 19 | private static Optional makeHttpGet(String address) { 20 | try { 21 | URL url = new URL(address); 22 | HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 23 | conn.setRequestMethod(HttpMethod.GET); 24 | try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { 25 | return Optional.of(br.lines().collect(Collectors.joining("\n"))); 26 | } catch (IOException x) { 27 | return Optional.empty(); 28 | } 29 | } catch (IOException x) { 30 | return Optional.empty(); 31 | } 32 | } 33 | 34 | private static Optional jsonToBook(String json) { 35 | try { 36 | return Optional.of(mapper.readValue(json, Book.class)); 37 | } catch (JsonProcessingException e) { 38 | return Optional.empty(); 39 | } 40 | } 41 | 42 | public static void main(String[] args) { 43 | String address = "http://localhost:8081/shop/books/1"; 44 | Optional response = makeHttpGet(address); 45 | System.out.println(response); 46 | Optional book = response.flatMap(HttpClient1Get::jsonToBook); 47 | System.out.println(book); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/request/jdk/HttpClient2Post.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.request.jdk; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | 5 | import javax.ws.rs.HttpMethod; 6 | import javax.ws.rs.core.HttpHeaders; 7 | import javax.ws.rs.core.MediaType; 8 | import java.io.BufferedReader; 9 | import java.io.IOException; 10 | import java.io.InputStreamReader; 11 | import java.io.OutputStream; 12 | import java.net.HttpURLConnection; 13 | import java.net.URL; 14 | import java.util.Arrays; 15 | import java.util.Optional; 16 | import java.util.stream.Collectors; 17 | 18 | public class HttpClient2Post { 19 | 20 | private final static ObjectMapper mapper = new ObjectMapper(); 21 | 22 | private static Optional makeHttpPost(String address) { 23 | try { 24 | URL url = new URL(address); 25 | HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 26 | conn.setRequestMethod(HttpMethod.POST); 27 | conn.setRequestProperty(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); 28 | conn.setRequestProperty(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); 29 | conn.setDoOutput(true); 30 | 31 | Book book = new Book(77, "JavaScript", "Mister Bin", Arrays.asList(";)", ":)", ";(")); 32 | byte[] bytes = mapper.writeValueAsBytes(book); 33 | 34 | try (OutputStream os = conn.getOutputStream()) { 35 | os.write(bytes); 36 | } catch (IOException x) { 37 | return Optional.empty(); 38 | } 39 | 40 | try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { 41 | return Optional.of(br.lines().collect(Collectors.joining("\n"))); 42 | } catch (IOException x) { 43 | return Optional.empty(); 44 | } 45 | 46 | } catch (IOException x) { 47 | return Optional.empty(); 48 | } 49 | } 50 | 51 | public static void main(String[] args) { 52 | String address = "http://localhost:8081/shop/books"; 53 | makeHttpPost(address); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/rest/Book.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.rest; 2 | 3 | import java.util.List; 4 | 5 | public class Book { 6 | private int id; 7 | private String name; 8 | private String author; 9 | private List topics; 10 | 11 | public Book(int id, String name, String author, List topics) { 12 | this.id = id; 13 | this.name = name; 14 | this.author = author; 15 | this.topics = topics; 16 | } 17 | 18 | public Book() { } 19 | 20 | public int getId() { 21 | return id; 22 | } 23 | 24 | public void setId(int id) { 25 | this.id = id; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | public String getAuthor() { 37 | return author; 38 | } 39 | 40 | public void setAuthor(String author) { 41 | this.author = author; 42 | } 43 | 44 | public List getTopics() { 45 | return topics; 46 | } 47 | 48 | public void setTopics(List topics) { 49 | this.topics = topics; 50 | } 51 | 52 | @Override 53 | public String toString() { 54 | return String.format("Book:[id=%d, name='%s', author='%s', topics=%s]", id, name, author, topics); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/rest/JerseyServerApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.rest; 2 | 3 | import org.glassfish.grizzly.http.server.HttpServer; 4 | import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; 5 | import org.glassfish.jersey.server.ResourceConfig; 6 | 7 | import java.net.URI; 8 | 9 | public class JerseyServerApp { 10 | public static void main(String[] args) { 11 | ResourceConfig config = new ResourceConfig() 12 | .packages("org.alexr.web.rest.resources"); 13 | HttpServer server = GrizzlyHttpServerFactory.createHttpServer( 14 | URI.create("http://localhost:8081/shop"), 15 | config 16 | ); 17 | // server.shutdownNow(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/rest/resources/Books.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.rest.resources; 2 | 3 | import org.alexr.web.rest.Book; 4 | 5 | import javax.ws.rs.*; 6 | import javax.ws.rs.core.MediaType; 7 | import javax.ws.rs.core.Response; 8 | import java.util.Arrays; 9 | import java.util.HashMap; 10 | 11 | @Path("books") 12 | public class Books { 13 | 14 | private static final HashMap books = new HashMap() {{ 15 | put(1, new Book(1, "Java", "Jim", Arrays.asList("a", "b"))); 16 | put(2, new Book(2, "Scala", "John", Arrays.asList("c"))); 17 | put(3, new Book(3, "Haskell", "Jeremy", Arrays.asList("d", "e", "f"))); 18 | }}; 19 | 20 | /** 21 | * http://localhost:8081/shop/books 22 | */ 23 | @GET 24 | @Produces(MediaType.APPLICATION_JSON) 25 | public Response books_all() { 26 | return Response 27 | .status(200) 28 | .entity(books.values()) 29 | .build(); 30 | } 31 | 32 | /** 33 | * http://localhost:8081/shop/books/1 34 | * http://localhost:8081/shop/books/2 35 | * http://localhost:8081/shop/books/3 36 | * http://localhost:8081/shop/books/4 37 | */ 38 | @GET 39 | @Path("/{id}") 40 | // @Path("/{id}/{name}") 41 | @Produces(MediaType.APPLICATION_JSON) 42 | public Response book_one(@PathParam("id") int book_id 43 | // , @PathParam("name") String name 44 | // , @CookieParam("user") Cookie cookie 45 | ) { 46 | return (!books.containsKey(book_id) ? 47 | Response.status(404) : 48 | Response.status(200).entity(books.get(book_id)) 49 | ).build(); 50 | } 51 | 52 | @POST 53 | @Consumes(MediaType.APPLICATION_JSON) 54 | @Produces(MediaType.APPLICATION_JSON) 55 | public Response book_post(Book book) { 56 | System.out.printf("I've got the book: %s\n", book); 57 | return Response.status(201).build(); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/service/Auth.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.service; 2 | 3 | public interface Auth { 4 | boolean check(String login, String paswd); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/service/AuthService.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.service; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class AuthService implements Auth { 7 | Map data = new HashMap<>(); 8 | 9 | public AuthService() { 10 | data.put("user","123"); 11 | data.put("admin","567"); 12 | } 13 | 14 | @Override 15 | public boolean check(String login, String paswd) { 16 | return data.containsKey(login) 17 | && data.get(login).equals(paswd); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/ExploreRequestServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.Cookie; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.Enumeration; 11 | import java.util.Map; 12 | 13 | public class ExploreRequestServlet extends HttpServlet { 14 | @Override 15 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 16 | // http://127.0.0.1:9001/ex?x=5 17 | String x = req.getParameter("x"); 18 | // http://127.0.0.1:9001/ex?x=5&x=6&y=7 19 | Map all_params = req.getParameterMap(); 20 | String[] xes = all_params.get("x"); 21 | String method = req.getMethod(); // GET, POST, ... 22 | // request headers 23 | Enumeration headerNames = req.getHeaderNames(); 24 | // cookies 25 | Cookie[] cookies = req.getCookies(); 26 | // http://127.0.0.1:9001/ex/123/?x=5&x=6&y=7 27 | String pathInfo = req.getPathInfo(); // '/123/' - part between the mapping path and parameters 28 | String queryString = req.getQueryString(); // 'x=5&x=6&y=7+++' - whole unparsed string after '?' 29 | String contextPath = req.getContextPath(); // see documentation 30 | String servletPath = req.getServletPath(); // '/ex' - how it was mapped 31 | StringBuffer requestURL = req.getRequestURL(); // http://127.0.0.1:9001/ex/123/ 32 | String requestURI = req.getRequestURI(); // '/ex/123/' 33 | 34 | 35 | try (PrintWriter w = resp.getWriter()) { 36 | w.printf("one line x=%s\n", x); 37 | for (String s: xes) { 38 | w.printf("x=%s\n", s); 39 | } 40 | w.printf("getProtocol:%s\ngetServerName:%s\ngetServerPort%s\n" + 41 | "getServletPath:%s\ngetContextPath: %s\n" + 42 | "getPathInfo:%s\ngetQueryString:%s\n" + 43 | "getRequestURL:%s\ngetRequestURI:%s\n" + 44 | "%s", 45 | req.getProtocol(), // HTTP/1.1 46 | req.getServerName(), // localhost 47 | req.getServerPort(), // 9001 48 | 49 | req.getServletPath(), // /a 50 | req.getContextPath(), // EMPTY 51 | 52 | req.getPathInfo(), // /1/2/3/4/5 - all between servlet mapping "/a" and parameters or NULL 53 | req.getQueryString(), // x=5&y=+++ or NULL 54 | 55 | req.getRequestURL(), // http://localhost:9001/a/1/2/3/4/5 56 | req.getRequestURI(), // /a/1/2/3/4/5 57 | "" 58 | ); 59 | } 60 | 61 | 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/HelloServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import javax.servlet.http.HttpServlet; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import java.io.IOException; 7 | import java.io.PrintWriter; 8 | 9 | public class HelloServlet extends HttpServlet { 10 | @Override 11 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 12 | try (PrintWriter w = resp.getWriter();) { 13 | w.println("HelloServlet.GET"); 14 | } 15 | } 16 | 17 | @Override 18 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 19 | try (PrintWriter w = resp.getWriter();) { 20 | w.println("HelloServlet.POST"); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/LoginServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import org.alexr.web.service.Auth; 4 | 5 | import javax.servlet.ServletException; 6 | import javax.servlet.ServletOutputStream; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | import java.nio.file.Files; 13 | import java.nio.file.Path; 14 | import java.nio.file.Paths; 15 | 16 | public class LoginServlet extends HttpServlet { 17 | private final Auth auth; 18 | 19 | public LoginServlet(Auth auth) { 20 | this.auth = auth; 21 | } 22 | 23 | @Override 24 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 25 | // folder/file 26 | Path path = Paths.get("./content/login.ftl"); 27 | ServletOutputStream os = resp.getOutputStream(); 28 | Files.copy(path, os); 29 | } 30 | 31 | @Override 32 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 33 | String user_name = req.getParameter("user_name"); 34 | String user_paswd = req.getParameter("user_paswd"); 35 | boolean checked = auth.check(user_name, user_paswd); 36 | 37 | System.out.println(user_name); 38 | System.out.println(user_paswd); 39 | try (PrintWriter w = resp.getWriter()) { 40 | w.println("LoginServlet.POST"); 41 | w.printf("user:%s %s\n",user_name, checked ? "logged in successfully" : "login failed"); 42 | }; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/ServletFile.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.ServletOutputStream; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.nio.file.Files; 10 | import java.nio.file.Path; 11 | import java.nio.file.Paths; 12 | 13 | public class ServletFile extends HttpServlet { 14 | @Override 15 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 16 | /** 17 | * http://localhost:8082/static/index.html 18 | * req.getPathInfo() - /index.html 19 | */ 20 | String gotPathInfo = req.getPathInfo(); 21 | Path path = Paths.get("./content", gotPathInfo); 22 | ServletOutputStream os = resp.getOutputStream(); 23 | Files.copy(path, os); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/ServletRedirect.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | public class ServletRedirect extends HttpServlet { 10 | private final String redirectTo; 11 | 12 | public ServletRedirect(String redirectTo) { 13 | this.redirectTo = redirectTo; 14 | } 15 | 16 | @Override 17 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 18 | System.out.println(req.getPathInfo()); 19 | // not the folder/file 20 | // but the URL! 21 | resp.sendRedirect(redirectTo); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/servlet/TemplateServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.servlet; 2 | 3 | import org.alexr.web.entity.Person; 4 | import org.alexr.web.freemarker.TemplateEngine; 5 | 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.util.Arrays; 11 | import java.util.HashMap; 12 | import java.util.List; 13 | 14 | public class TemplateServlet extends HttpServlet { 15 | private final TemplateEngine engine; 16 | 17 | public TemplateServlet(TemplateEngine engine) { 18 | this.engine = engine; 19 | } 20 | 21 | @Override 22 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 23 | // https://freemarker.apache.org/docs/index.html 24 | String name = "Alex"; 25 | Integer age = 33; 26 | Person john = new Person(99, "John", 111); 27 | 28 | List skills = Arrays.asList("Java", "Scala", "JavaScript"); 29 | 30 | HashMap data = new HashMap<>(); 31 | data.put("name", name); 32 | data.put("age", age); 33 | data.put("john", john); 34 | data.put("skills", skills); 35 | 36 | engine.render("one.ftl", data, resp); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/upload/UploadApp.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.upload; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | 6 | import javax.servlet.MultipartConfigElement; 7 | 8 | public class UploadApp { 9 | public static void main(String[] args) throws Exception { 10 | Server server = new Server(8080); 11 | ServletContextHandler handler = new ServletContextHandler(); 12 | 13 | long maxFileSize = 1024 * 1024 * 50; // 50 Mb 14 | long maxRequestSize = -1L; // No Limits 15 | int fileSizeThreshold = 1024 * 1024; 16 | 17 | handler.addServlet(UploadServlet.class, "/upload/*") 18 | .getRegistration().setMultipartConfig(new MultipartConfigElement( 19 | "./tmp" 20 | // , maxFileSize, maxRequestSize, fileSizeThreshold 21 | ) 22 | ); 23 | 24 | server.setHandler(handler); 25 | server.start(); 26 | server.join(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/alexr/web/upload/UploadServlet.java: -------------------------------------------------------------------------------- 1 | package org.alexr.web.upload; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import javax.servlet.http.Part; 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.io.OutputStream; 11 | import java.io.PrintWriter; 12 | import java.nio.file.Files; 13 | import java.nio.file.Paths; 14 | 15 | public class UploadServlet extends HttpServlet { 16 | 17 | @Override 18 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 | try (OutputStream os = resp.getOutputStream()) { 20 | Files.copy(Paths.get("content_upload", "upload.html"), os); 21 | } 22 | } 23 | 24 | @Override 25 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 26 | /** 27 | * req.getInputStream() - whole request 28 | * InputStream can't be reused !!! 29 | * 30 | * Collection parts = req.getParts(); 31 | * you can access to the parts 32 | */ 33 | for (Part part: req.getParts()) { 34 | String fname = part.getSubmittedFileName(); 35 | try (InputStream is = part.getInputStream()) { 36 | Files.copy(is, Paths.get("_uploaded", fname)); 37 | } 38 | } 39 | 40 | try (PrintWriter w = resp.getWriter()) { 41 | w.write("POST got"); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # ERROR - ERROR 2 | # WARN - ERROR, WARN 3 | # INFO - ERROR, WARN, INFO 4 | # DEBUG - ERROR, WARN, INFO, DEBUG 5 | # TRACE - ERROR, WARN, INFO, DEBUG, TRACE 6 | # detailed configugation 7 | # http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html 8 | log4j.rootLogger=INFO, A1 9 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 10 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 11 | log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 12 | log4j.appender.A1.Target=System.out -------------------------------------------------------------------------------- /src/main/resources/template/navi.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 | 12 |

    ${header}

    13 | 14 | <#list links as link> 15 |
  • ${link.name}
  • 16 | 17 |
    18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/template/template04.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Document 9 | 10 | 11 |

    TemplateApp04

    12 |

    template file location: project resources folder/content/templates/template04.ftl

    13 | 14 | <#list randoms as random> 15 | 16 | 17 |
    ${random}
    18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/useful_links.txt: -------------------------------------------------------------------------------- 1 | https://www.ibm.com/developerworks/ru/library/j-jtp09238/index.html 2 | https://www.eclipse.org/jetty/documentation/9.4.12.v20180830/ 3 | --------------------------------------------------------------------------------