1

Около полугода учу java, на данный момент довольно неплохо знаю core, перерешал кучу задач и написал одного вк бота. И сейчас загорелся идеей сделать свое web-приложение (сайт с редактированием картинок). Так вот хотелось бы узнать, с помощью каких технологии сейчас реализуют web-проекты? Что мне нужно изучать, чтобы создать свое web-приложение? Как мне научиться правильно планировать структуру своего проекта? Свободного времени у меня много и я хочу полностью посвятить себя java.

2 Answers2

1

Конечно Java EE и Spring это круто, но сейчас пошла такая тенденция, использования фреймворков в слепую. Рынок набит джунами которые размахивают своим спрингом, как работает cors или или http толком ответить не могут.

В качестве учебных целей полезно написать свое первое веб приложение на core java, я не говорю что нужно пытаться учесть все особенности типа аутентификации или сессий, хотя и это посильная задача.

После этого, вооружившись спрингом или JavaEE вы уже будете понимать что Вам нужно сделать на более глубоком уровне, вы будете понимать что делает фреймворк, а не просто в слепую набивать код кусками найденными в интернете, и тем более будет мотивация использовать фреймворк, а главное, я надеюсь, будет понимание, когда его можно вовсе не использовать :)

В общем случае полезно знать веб технологии, в которых достаточно много тонкостей, не имеющих отношения к языку программирования, на котором реализуется веб приложение.

Крайне полезно понимать что ждет от сервера фронтенд, по этому в этот лес тоже стоит заглянуть и отныне html js и css (как минимум) - Ваши заклятые друзья.


Вот простенький пример:

введите сюда описание изображения

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Kali fractal</title>
</head>
<body>
    <canvas></canvas>
&lt;script type='glsl/vertex'&gt;
  attribute vec2 coords;
  void main(void) {
    gl_Position = vec4(coords.xy, 0.0, 1.0);
  }
&lt;/script&gt;

&lt;script type='glsl/fragment'&gt;precision highp float;
   uniform vec4 mr; // (m)ouse position and screen (r)esolution
   void main(void) {
     vec2 p = gl_FragCoord.xy;
     vec2 q = (p + p - mr.ba) / mr.b;
     for(int i = 0; i &lt; 13; i++)
          q = abs(q)/dot(q,q) -  mr.xy/mr.zw;
     gl_FragColor = vec4(q, q.x/q.y, 1.0);
   }
&lt;/script&gt;

&lt;script&gt;
  let canvas = document.querySelector('canvas');
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  let gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  var h = gl.drawingBufferHeight;
  var w = gl.drawingBufferWidth;

  let pid = gl.createProgram();
  shader('glsl/vertex', gl.VERTEX_SHADER);
  shader('glsl/fragment', gl.FRAGMENT_SHADER);
  gl.linkProgram(pid);
  gl.useProgram(pid);

  let array = new Float32Array([-1,  3, -1, -1, 3, -1]);
  gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
  gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);

  let al = gl.getAttribLocation(pid, "coords");
  gl.vertexAttribPointer(al, 2 /*components per vertex */, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(al);

  let mr = gl.getUniformLocation(pid, 'mr');  // (m)ouse position and screen (r)esolution

  window.addEventListener('mousemove', draw);
  window.addEventListener('touchmove', draw);

  draw();

  function draw(e) {
    let ev = e &amp;&amp; e.touches ? e.touches[0] : e;
    let x = ev ? ev.clientX : 250;
    let y = ev ? h - ev.clientY: 111;
    gl.uniform4f(mr, x, y, w, h);
    gl.viewport(0, 0, w, h);
    gl.clearColor(0, 0, 0, 0);
    gl.drawArrays(gl.TRIANGLES, 0, 3 /* 3 vertices */);
  }

  function shader(name, type) {
    let src = [...document.scripts].find(s =&gt; s.type === name).innerText;
    let sid = gl.createShader(type);
    gl.shaderSource(sid, src);
    gl.compileShader(sid);
    gl.attachShader(pid, sid);
  }
&lt;/script&gt;

&lt;style&gt;
  body {
    margin: 0;
    overflow: hidden;
  }
&lt;/style&gt;

</body> </html>

SimpleWebServer.java

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map;

public class SimpleWebServer implements HttpHandler {

public static void main(String[] args) throws IOException {
    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
    server.createContext("/", new SimpleWebServer("/", "./static/"));
    server.start();
    System.out.println("server started, please visit http://localhost:8080/index.html");
}

private String routePath;
private String fsPath;

private Map&lt;String, String&gt; headers = new HashMap&lt;String, String&gt;(){{
    put("html", "text/html");
}};

public SimpleWebServer(String path, String filesystemPath) {
    routePath = path;
    fsPath = filesystemPath;
}

@Override
public void handle(HttpExchange http) throws IOException {
    OutputStream outputStream = http.getResponseBody();
    http.getRequestBody();
    String request = http.getRequestURI().getRawPath();
    byte[] result;
    int code;
    try {
        try {
            String path = fsPath + request.substring(routePath.length());
            System.out.println("requested: " + path);
            result = read(new FileInputStream(path)).toByteArray();
            String ext = request.substring(request.lastIndexOf(".") + 1);
            if (headers.containsKey(ext))
                http.getResponseHeaders().add("Content-Type", headers.get(ext));
            code = 200;
        } catch (IOException e) {
            result = (404 + " " + request).getBytes();
            code = 404;
        }
    } catch (Exception e) {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        result = sw.getBuffer().toString().getBytes();
        code = 500;
    }
    http.sendResponseHeaders(code, result.length);
    outputStream.write(result);
    outputStream.close();
}

static ByteArrayOutputStream read(InputStream is) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[1024];
    while ((nRead = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }
    buffer.flush();
    is.close();
    return buffer;
}

}

0

более/менее универсальный (и несложный) ответ/совет:

Сборщик/менеджер зависимостей (Maven или Gradle), Фреймворк (SpringBoot), БД (PostgreSQL или MySQL) + SpringData и Hibernate, контейнер для выполнения java кода (Tomcat), Logger (Log4j), Тестирование (JUnit + Mockito)

кроме этого (позже) пригодится nginx и Linux Server (например Debian) - это чтобы уже написанное приложение в интернете крутилось

P.S. Могут быть вариации

VBugaenko
  • 966