JSP и сервлет реализация

250
29 мая 2017, 23:56

Как можно реализовать с помощью 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); 
        }
        }
Answer 1

Изменяться должна какая переменная? 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}
READ ALSO
Атака одним юнитом другого

Атака одним юнитом другого

Добрый день! Подскажите пожалуйста идеи того как реализовывается атака юнитов(дальнего боя) То бишь стоит лучник, стреляет по движущемуся...

228
Google maps marker infowindow

Google maps marker infowindow

Гуру кодинга, подскажите как узнать на каком именно маркере было нажатие на infowindow? Код:

206
Как правильно использовать doGet и doPost?

Как правильно использовать doGet и doPost?

У меня простое web приложение на tomcat с несколькими функциямиЕсть меню навигации и я пытаюсь реализовать одну из функций(удаление), она должна...

260