Commit 5e7df664 by Patryk Czarnik

Kalkulator - historia i pozostałe wersje

parent 55f8d5c6
package alx.kalkulator;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HistoriaKalkulatoraJSON {
@Autowired
private LogikaKalkulatora logika;
@GetMapping("/historia.json")
public List<String> pokazHistorie() {
return logika.getHistoriaDzialan();
}
}
package alx.kalkulator;
import java.util.List;
// @Component("inna") i potem za pomocą Qualifier wskazać w miejscu użycia (podczas wstrzykiwania)
// albo można za pomocą @Primary wskazać, że teraz ten komponent ma być wybrany
public class InnaLogika implements LogikaKalkulatora {
@Override
public long oblicz(long liczba1, long liczba2, String operacja) {
long wynik = switch(operacja) {
case "+" -> liczba1 + liczba2 + 1000;
case "-" -> liczba1 - liczba2 + 1000;
case "*" -> liczba1 * liczba2 + 1000;
case "/" -> liczba1 / liczba2 + 1000;
default -> 0L;
};
return wynik;
}
@Override
public List<String> getHistoriaDzialan() {
return List.of("Ala", "Ola", "Ela");
}
}
......@@ -22,6 +22,7 @@ public class KalkulatorController {
public String kalkulator(Long liczba1, Long liczba2, String operacja, Model model) {
Long wynik = logika.oblicz(liczba1, liczba2, operacja);
model.addAttribute("wynik", wynik);
model.addAttribute("historia", logika.getHistoriaDzialan());
return "kalkulator.html";
}
}
package alx.kalkulator;
import java.util.List;
public interface LogikaKalkulatora {
long oblicz(long liczba1, long liczba2, String operacja);
List<String> getHistoriaDzialan();
}
......@@ -2,19 +2,36 @@ package alx.kalkulator;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/* LogikaKalkulatora jest przykładem "komponentu".
* Podczas startu aplikacji Spring tworzy jeden obiekt tej klasy (tzw. singleton) i zapamiętuje go jako "bean".
* W starszych wersjach Springa tego typu klasy należało zadeklarować w pliku beans.xml.
* Obecnie używa się raczej adnotacji. Takie działanie mają adnotacje: @Component, @Service, @Repository, @Controller.
*
* Inny sposób tworzenia beanów/kompomentów: klasa fabryczna z metodami oznaczonymi @Bean (będą inne przykłady).
*/
@Component
public class LogikaKalkulatoraImpl implements LogikaKalkulatora {
private final List<String> historiaDzialan = Collections.synchronizedList(new ArrayList<>());
@Override
public long oblicz(long liczba1, long liczba2, String operacja) {
long wynik = switch (operacja) {
long wynik = switch(operacja) {
case "+" -> liczba1 + liczba2;
case "-" -> liczba1 - liczba2;
case "*" -> liczba1 * liczba2;
case "/" -> liczba1 / liczba2;
default -> 0L;
default -> 0L;
};
historiaDzialan.add(String.format("%d %s %d = %d", liczba1, operacja, liczba2, wynik));
return wynik;
}
@Override
public List<String> getHistoriaDzialan() {
return Collections.unmodifiableList(historiaDzialan);
}
}
package alx.kalkulator;
import java.util.stream.Collectors;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class WstrzykiwaniePrzezKonstruktor {
private LogikaKalkulatora logikaKalkulatora;
// Jeśli jedynym dostępnym konstruktorem jest taki, który wymaga parametrów,
// Spring wywoła własnie ten konstruktor i przekaże wymagane parametry, o ile uda mu się takie obiekty znaleźć.
// To też jest forma wstrzykiwania zależności.
// Zauważmy, że działa bez żadnej adnotacji przed tym konstruktorem.
public WstrzykiwaniePrzezKonstruktor(LogikaKalkulatora logikaKalkulatora) {
this.logikaKalkulatora = logikaKalkulatora;
}
// public WstrzykiwaniePrzezKonstruktor(@Qualifier("inna") LogikaKalkulatora logikaKalkulatora) {
// this.logikaKalkulatora = logikaKalkulatora;
// }
@GetMapping(path="/liczenie", produces="text/plain")
@ResponseBody
public String liczenie(Long liczba1, Long liczba2, String operacja) {
return String.valueOf(logikaKalkulatora.oblicz(liczba1, liczba2, operacja));
}
@GetMapping(path="/historia.txt", produces="text/plain")
@ResponseBody
public String dajHistorie() {
return logikaKalkulatora.getHistoriaDzialan()
.stream()
.map(s -> " → " + s)
.collect(Collectors.joining("\n"));
}
}
......@@ -29,6 +29,15 @@
<strong th:text="${wynik}">5</strong>
</div>
<section th:if="${historia != null and !historia.isEmpty()}">
<h2>Historia działań</h2>
<ul>
<li th:each="element: ${historia}" th:text="${element}">2 + 2 = 4</li>
</ul>
</section>
<div><a th:href="@{/historia.json}">historia JSON</a></div>
<div><a th:href="@{/historia.txt}">historia TXT</a></div>
<div><a th:href="@{/}">wróć do strony głównej</a></div>
</body>
......
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