Как можно реализовать с помощью JSP и сервлета. Есть переменные на JSP файле, и к ней кнопки, по которым переменные изменяются. То есть на одну кнопку я могу нажать 10 раз, и хотелось видеть результат изменений в этой переменной.
В инете не нашел. Есть примеры, где передаешь данные, от одного jsp-файла на сервер в другой jsp-файл. А именно работа с одним jsp не нашел((
Вот jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/Game" method = "get">
<h1>Играем в 21(очко).</h1>
У сервера карт: ${serverKart}<br><br><br>
В колоде карт: ${kolodaKart}<br><br><br>
Ваши карты: ${kart}<br>
Очков: ${ozkov} <br>
${Ozibka} <br>
<input type="submit" value="Взять карту" name="button1" > <input type="submit" value="Пропустить ход" name="button2"> <input type="submit" value="Рестарт" name="button3">
</form>
</body>
</html>
и сервлет
package ru.unlimit;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ru.model.CardIgra;
@WebServlet("/Game")
public class Game extends HttpServlet {
private static final long serialVersionUID = 1L;
CardIgra cardIgra;
public Game() {
super();
cardIgra = new CardIgra();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
/* if (request.getParameter("button1") != null) {
String coobzenie = "";
if(cardIgra.getPlayer().getArrayCard().size() == 5)
request.setAttribute("Ozibka", "Пропустите ход, у вас максимум карт");
else {
cardIgra.bratKartyPlayer();
if(cardIgra.getPlayer().getOzki() == 21)
request.setAttribute("Ozibka", "Вы выиграли");
else if(cardIgra.getPlayer().getOzki() > 21)
request.setAttribute("Ozibka", "Вы проиграли");
}
} else if (request.getParameter("button2") != null) {
// myClass.method2();
} else if (request.getParameter("button3") != null) {
cardIgra.startPlayer();
request.setAttribute("serverKart", cardIgra.getPlayerServer().getArrayCard().size());
request.setAttribute("kolodaKart", cardIgra.getCardkoloda().size());
request.setAttribute("kart", cardIgra.getPlayer().getArrayCard().size());
request.setAttribute("ozkov", cardIgra.getPlayer().getOzki());
*/
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
request.setAttribute("Ozibka", 3);
request.getRequestDispatcher("Game.jsp").forward(request, response);
}
}
Изменяться должна какая переменная? cardIgra? Другой вроде нет.
Что jsp, что servlet, оба живут только в течении обработки текущего запроса.
Поэтому Ваша cardIgra пропадает каждый раз по завершении этой обработки.
Вам нужно создать сессию и поместить переменную в сессию. Тогда изменения переменной, сделанные в прошлом запросе, будут видны в следующем.
Самый простой способ, который знаю, это использование CDI (внедрение зависимостей)
К классу CardIgra добавьте аннотацию @SessionScoped. Должно получиться так
import javax.enterprise.context.SessionScoped;
@SessionScoped
public class CardIgra implements Serializable {
...
}
Класс, который размещается в сессии, должен быть Serializable.
(Есть ещё один SessionScoped, тоже должен работать, но с ним я дела не имею. SessionScoped для CDI находится в javax.enterprise.context. Поэтому добавил import)
Теперь сервер знает что класс CardIgra можно внедрять, что экземпляр этого класса должен быть в сессии. И к нашей радости при внедрении сервер сам создаст сессию, если надо.
Осталось только внедрить CardIgr-у. Для этого изменим сервлет таким образом
@WebServlet("/Game")
public class Game extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject CardIgra cardIgra;
public Game() {
super();
// TODO Auto-generated constructor stub
}
...
}
@Inject заставит внедрить поле cardIgra при создании сервлета. Таким нехитрым образом сервлет получит ссылку на переменную из сессии. Из конструктора убрано создание переменной. Сервер сделает всё сам.
Можно ещё дать имя CardIgr-е
@Named
@SessionScoped
public class CardIgra implements Serializable {
...
}
Тогда к ней можно будет обратиться по имени (по умолчанию имя класса с маленькой буквы) в jsp
${cardIgra.playerServer.arrayCard.size()}
${cardIgra.player.ozki}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники