├── .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 |
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 | #list>
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 | #list>
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 |
19 | Links:
20 |
21 | <#list links as link>
22 | ${link.name}
23 | #list>
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/content_upload/upload.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 |
9 | File Upload
10 |
11 |
12 |
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 | #list>
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 | ${random} |
16 | #list>
17 |
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 |
--------------------------------------------------------------------------------