Commit 65bb8a22 by Patryk Czarnik

Dodatkowe wersje kalkulatora - SESJA

parent 4ac1ed5e
...@@ -11,7 +11,7 @@ import jakarta.servlet.http.HttpServlet; ...@@ -11,7 +11,7 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/Kalkulator3") @WebServlet("/kalkulator3")
public class Kalkulator3 extends HttpServlet { public class Kalkulator3 extends HttpServlet {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
......
...@@ -9,9 +9,8 @@ import jakarta.servlet.http.HttpServlet; ...@@ -9,9 +9,8 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/Kalkulator4") @WebServlet("/kalkulator4")
public class Kalkulator4 extends HttpServlet { public class Kalkulator4 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...@@ -73,7 +72,7 @@ public class Kalkulator4 extends HttpServlet { ...@@ -73,7 +72,7 @@ public class Kalkulator4 extends HttpServlet {
try { try {
long liczba1 = Long.parseLong(param1); long liczba1 = Long.parseLong(param1);
long liczba2 = Long.parseLong(param2); long liczba2 = Long.parseLong(param2);
long wynik = oblicz(operacja, liczba1, liczba2); long wynik = LogikaKalkulatora.oblicz(liczba1, liczba2, operacja);
out.printf("<div class='wynik'>%d %s %d = <strong>%d</strong></div>\n", out.printf("<div class='wynik'>%d %s %d = <strong>%d</strong></div>\n",
liczba1, operacja, liczba2, wynik); liczba1, operacja, liczba2, wynik);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
...@@ -82,15 +81,4 @@ public class Kalkulator4 extends HttpServlet { ...@@ -82,15 +81,4 @@ public class Kalkulator4 extends HttpServlet {
out.printf("<div class='error'>Błąd: %s</div>\n", e.getMessage()); out.printf("<div class='error'>Błąd: %s</div>\n", e.getMessage());
} }
} }
private long oblicz(String operacja, long liczba1, long liczba2) {
long wynik = switch(operacja) {
case "+" -> liczba1 + liczba2;
case "-" -> liczba1 - liczba2;
case "*" -> liczba1 * liczba2;
case "/" -> liczba1 / liczba2;
default -> throw new IllegalArgumentException("Nieznane działanie: " + operacja);
};
return wynik;
}
} }
...@@ -12,9 +12,8 @@ import jakarta.servlet.http.HttpServlet; ...@@ -12,9 +12,8 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/Kalkulator5") @WebServlet("/kalkulator5")
public class Kalkulator5 extends HttpServlet { public class Kalkulator5 extends HttpServlet {
private static final long serialVersionUID = 1L;
// Jeśli w serwlecie umieścimy pole, np. listę, to jest ono widoczne i wspólne dla różnych klientów. // Jeśli w serwlecie umieścimy pole, np. listę, to jest ono widoczne i wspólne dla różnych klientów.
// Serwer ma też prawo w dowolnym momencie skasować ten obiekt Kalkulator5 (a wraz z nim listę) i utworzyć nowy. // Serwer ma też prawo w dowolnym momencie skasować ten obiekt Kalkulator5 (a wraz z nim listę) i utworzyć nowy.
......
...@@ -13,9 +13,8 @@ import jakarta.servlet.http.HttpServletRequest; ...@@ -13,9 +13,8 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSession;
@WebServlet("/Kalkulator6") @WebServlet("/kalkulator6")
public class Kalkulator6 extends HttpServlet { public class Kalkulator6 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) protected void doGet(HttpServletRequest request, HttpServletResponse response)
...@@ -115,7 +114,7 @@ public class Kalkulator6 extends HttpServlet { ...@@ -115,7 +114,7 @@ public class Kalkulator6 extends HttpServlet {
private List<String> pobierzHistorieZSesji(HttpServletRequest request) { private List<String> pobierzHistorieZSesji(HttpServletRequest request) {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
final String HISTORIA = "historia6"; final String HISTORIA = "historia6";
// próbuję odczytać listę z sesji // próbuję odczytać listę z sesji
List<String> historia = (List<String>) session.getAttribute(HISTORIA); List<String> historia = (List<String>) session.getAttribute(HISTORIA);
if(historia == null) { if(historia == null) {
// aa jeśli jeszcze nie została utowrzona (bo to jest pierwsze działanie tego klienta), to tworze pustą listę i zapamiętuję w sesji // aa jeśli jeszcze nie została utowrzona (bo to jest pierwsze działanie tego klienta), to tworze pustą listę i zapamiętuję w sesji
......
package serwlety.kalkulator;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
@WebServlet("/kalkulator7")
public class Kalkulator7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = ustawNaglowkiIPobierzWritera(response);
poczatek(out);
formularz(out);
wyswietlHistorie(request, out);
koniec(out);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = ustawNaglowkiIPobierzWritera(response);
poczatek(out);
formularz(out);
obsluzParametryIWyswietlWynik(request, out);
wyswietlHistorie(request, out);
koniec(out);
}
private PrintWriter ustawNaglowkiIPobierzWritera(HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
return response.getWriter();
}
private void poczatek(PrintWriter out) {
out.println("<html>");
out.println("<head>");
out.println("<title>Kalkulator 7</title>");
out.println("<link rel='stylesheet' type='text/css' href='styl.css'>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Kalkulator 7</h1>");
}
private void koniec(PrintWriter out) {
out.println("</body>");
out.println("</html>");
}
private void formularz(PrintWriter out) {
out.println("<form method='post'>");
out.println("<label for='liczba1'>Liczba 1: </label>");
out.println("<input type='text' name='liczba1'/> <br/>");
out.println("<label for='liczba2'>Liczba 2: </label>");
out.println("<input type='text' name='liczba2'/> <br/>");
out.println("<label for='operacja'>Wybierz działanie: </label>");
out.println("<select name='operacja'>");
out.println("<option value='+'>+</option>");
out.println("<option value='-'>-</option>");
out.println("<option value='*'>×</option>");
out.println("<option value='/'>÷</option>");
out.println("</select><br/>");
out.println("<button>Oblicz</button>");
out.println("</form>");
}
private void obsluzParametryIWyswietlWynik(HttpServletRequest request, PrintWriter out) {
String parametr1 = request.getParameter("liczba1");
String parametr2 = request.getParameter("liczba2");
String operacja = request.getParameter("operacja");
if (parametr1 != null && parametr2 != null && operacja != null) {
try {
long liczba1 = Long.parseLong(parametr1);
long liczba2 = Long.parseLong(parametr2);
long wynik = LogikaKalkulatora.oblicz(liczba1, liczba2, operacja);
out.println("<div class='wynik'>");
out.printf("%d %s %d = <strong>%d</strong>", liczba1, operacja, liczba2, wynik);
out.println("</div>");
List<String> historia = pobierzHistorieZSesji(request);
historia.add(String.format("%d %s %d = %d", liczba1, operacja, liczba2, wynik));
} catch (NumberFormatException e) {
out.printf("<div class='error'>Niepoprawny format liczby %s</div>", e.getMessage());
} catch (Exception e) {
out.printf("<div class='error'>Inny wyjątek %s</div>", e);
}
}
}
private void wyswietlHistorie(HttpServletRequest request, PrintWriter out) {
out.println("<h3>Historia</h3>");
out.println("<ul class='historia'>");
List<String> historia = pobierzHistorieZSesji(request);
synchronized (historia) {
for (String s : historia) {
out.printf("<li>%s</li>\n", s);
}
}
out.println("</ul>");
}
private List<String> pobierzHistorieZSesji(HttpServletRequest request) {
HttpSession session = request.getSession();
return (List<String>) session.getAttribute(ListenerHistorii.HISTORIA_KLIENTA);
}
}
package serwlety.kalkulator;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
@WebServlet("/kalkulator8")
public class Kalkulator8 extends HttpServlet {
// Technologia serwletów nie gwarantuje, że wszystkie zapytania będą obsługiwane przez ten sam obiekt serwletu.
// Dlatego nie powinniśmy przechowywać istotnych danych w polach instancyjnych tej klasy.
// Użycie zmiennej statycznej spowodowałoby, że będzie to poprawne, ale to jest uznawane za "brzydkie podejście".
private static List<String> historiaStatyczna = Collections.synchronizedList(new ArrayList<>());
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Kalkulator 8</title>");
out.println("<link rel='stylesheet' type='text/css' href='styl.css'/>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Kalkulator 8</h1>");
out.println("<form method='post'>");
out.println("<label for='liczba1'>Liczba 1: </label>");
out.println("<input type='number' name='liczba1'/> <br/>");
out.println("<label for='liczba2'>Liczba 2: </label>");
out.println("<input type='number' name='liczba2'/> <br/>");
out.println("<label for='operacja'>Wybierz działanie: </label>");
out.println("<select name='operacja'>");
out.println("<option value='+'>+</option>");
out.println("<option value='-'>-</option>");
out.println("<option value='*'>×</option>");
out.println("<option value='/'>÷</option>");
out.println("</select><br/>");
out.println("<button>Oblicz</button>");
out.println("</form>");
// Tutaj zakładamy, że listener przygotował historię działań globalną i klienta.
// ServletContext to jest obiekt, który dostarcza informacji o bieżącej aplikacji na serwerze.
// Pełni też rolę "globalnego schowka" - przechowuje obiekty w zakresie aplikacji. (scope="application")
ServletContext servletContext = this.getServletContext();
List<String> historiaGlobalna = (List<String>) servletContext.getAttribute(ListenerHistorii.HISTORIA_GLOBALNA);
// Sesja jest schowkiem do przechowywania danych skojarzonych z konretnym klientem (np. koszyk w sklepie).
HttpSession sesja = request.getSession();
List<String> historiaKlienta = (List<String>) sesja.getAttribute(ListenerHistorii.HISTORIA_KLIENTA);
String parametr1 = request.getParameter("liczba1");
String parametr2 = request.getParameter("liczba2");
String operacja = request.getParameter("operacja");
if(parametr1 != null && parametr2 != null && operacja != null) {
try {
long liczba1 = Long.parseLong(parametr1);
long liczba2 = Long.parseLong(parametr2);
long wynik = LogikaKalkulatora.oblicz(liczba1, liczba2, operacja);
out.printf("<p>%d %s %d = <strong>%d</strong></p>", liczba1, operacja, liczba2, wynik);
String tekst = String.format("%d %s %d = %d", liczba1, operacja, liczba2, wynik);
historiaStatyczna.add(tekst);
historiaGlobalna.add(tekst);
historiaKlienta.add(tekst);
} catch (NumberFormatException e) {
out.printf("<div class='error'>Niepoprawny format liczby %s</div>", e.getMessage());
} catch (Exception e) {
out.printf("<div class='error'>Inny wyjątek %s</div>", e);
}
}
out.println("<h3>Historia działań (static):</h3>");
out.println("<ul>");
// Gdy na liście wykonujemy wiele operacji, np. w pętli, to powinniśmy synchronizować cały ten fragment.
synchronized(historiaStatyczna) {
for (String dzialanie : historiaStatyczna) {
out.println("<li>" + dzialanie + "</li>");
}
}
out.println("</ul>");
out.println("<h3>Historia działań (ServletContext):</h3>");
out.println("<ul>");
synchronized(historiaGlobalna) {
for (String dzialanie : historiaGlobalna) {
out.println("<li>" + dzialanie + "</li>");
}
}
out.println("</ul>");
out.println("<h3>Historia działań klienta (HttpSession):</h3>");
out.println("<ul>");
synchronized(historiaKlienta) {
for (String dzialanie : historiaKlienta) {
out.println("<li>" + dzialanie + "</li>");
}
}
out.println("</ul>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
\ No newline at end of file
package serwlety.kalkulator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
@WebListener
public class ListenerHistorii implements HttpSessionListener, ServletContextListener {
public static final String HISTORIA_KLIENTA = "historia_klienta";
public static final String HISTORIA_GLOBALNA = "historia_globalna";
public void sessionCreated(HttpSessionEvent se) {
// Gdy podłączy się nowy klient, jest tworzona nowa sesja, a my do tej sesji
// dodajemy pustą listę "historia_dzialan"
List<String> historia = Collections.synchronizedList(new ArrayList<>());
se.getSession().setAttribute(HISTORIA_KLIENTA, historia);
se.getSession().setMaxInactiveInterval(60);
System.out.println("Do sesji została dodana pusta historia");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Koniec sesji");
}
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
List<String> historiaGlobalna = Collections.synchronizedList(new ArrayList<>());
servletContext.setAttribute(HISTORIA_GLOBALNA, historiaGlobalna);
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("aplikacja kończy się");
List<String> historiaGlobalna = (List<String>) sce.getServletContext().getAttribute(HISTORIA_GLOBALNA);
System.out.println("W sumie wykonano " + historiaGlobalna.size() + " działań");
}
// W serwletach mamy trzy obiekty (tak jakby na trzech poziomach), w których za pomocą setAttribute / getAttribute można przechowywać dane
// ServletContext - dane globalne
// HttpSession - dane sesji, skojarzone z konkretnym klientem
// HttpRequest - dane potrzebne podczas obsługi pojedynczego zapytania
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment