Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Закрыт 1 год назад.
Около полугода учу java, на данный момент довольно неплохо знаю core, перерешал кучу задач и написал одного вк бота. И сейчас загорелся идеей сделать свое web-приложение (сайт с редактированием картинок). Так вот хотелось бы узнать, с помощью каких технологии сейчас реализуют web-проекты? Что мне нужно изучать, чтобы создать свое web-приложение? Как мне научиться правильно планировать структуру своего проекта? Свободного времени у меня много и я хочу полностью посвятить себя java.
Конечно 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>
<script type='glsl/vertex'>
attribute vec2 coords;
void main(void) {
gl_Position = vec4(coords.xy, 0.0, 1.0);
}
</script>
<script type='glsl/fragment'>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 < 13; i++)
q = abs(q)/dot(q,q) - mr.xy/mr.zw;
gl_FragColor = vec4(q, q.x/q.y, 1.0);
}
</script>
<script>
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 && 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 => s.type === name).innerText;
let sid = gl.createShader(type);
gl.shaderSource(sid, src);
gl.compileShader(sid);
gl.attachShader(pid, sid);
}
</script>
<style>
body {
margin: 0;
overflow: hidden;
}
</style>
</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<String, String> headers = new HashMap<String, String>(){{
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;
}
}
более/менее универсальный (и несложный) ответ/совет:
Сборщик/менеджер зависимостей (Maven или Gradle), Фреймворк (SpringBoot), БД (PostgreSQL или MySQL) + SpringData и Hibernate, контейнер для выполнения java кода (Tomcat), Logger (Log4j), Тестирование (JUnit + Mockito)
кроме этого (позже) пригодится nginx и Linux Server (например Debian) - это чтобы уже написанное приложение в интернете крутилось
P.S. Могут быть вариации
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
1Покрасить имя людей в зависимости от пола в розовый или голубой цвет
Всем привет! Хотелось узнать какие сейчас самые лучшие полноэкранные слайдеры для содержания контента сайта и перемещения по немуНапример...