Mam mały problem jeśli o koncepcie mojego projektu wykonywanego w Spring MVC. Utworzyłem sobie listę obiektów ( coś w stylu listy zamówień) i mam wygenerowane te zamówienia na stronie. Chciałbym przy każdym zamówieniu dodać button, który zmieniałby status mojego zamówienia (czyli w praktyce usuwałby zamówienie z listy) i od razu aktualizował stronę z zamówieniami bez tego wybranego zamówienia. Czego do tego użyć najlepiej? Na pewno muszę utworzyć metodę usuwającą obiekt z listy no i powstałą listę dodać do modelu i wygenerować stronę. Tylko jak będę pobierał za pomocą tego buttona idZamowienia ktore chce usunac? Z góry dziękuję za porady.
Nie do końca rozumiem problem. W szablonie tam gdzie wypisujesz sobie listę dodajesz buttona a jego action to jakieś np. /controller/modify/${order.id}
i kontroler oznacza sobie w bazie to zamówienie jako nieaktywne czy co tam sobie chcesz i potem przeładowujesz stronę i już "automatycznie" bo tam nie będzie, bo dane z bazy filtrujesz tak żeby brać tylko te aktywne.
Mam taki button:
<form action="orders/newAll" method="POST">
<input type="submit" value="Zrealizowano" class="btn btn-primary"/>
</form>
oraz takie dwie metody kontrolera:
@RequestMapping("/all")
public String allOrders(Model model) {
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
@RequestMapping("/newAll")
public String newAllProducts(Model model) {
return "redirect:/all";
}
Jak mam powiązać button z konkretnym orderId? Jak zrobić aby button przed wywołaniem metody mapującej usunął jeszcze dany obiekt z listy?
No musisz przekazać ten ID do kontrolera np. jako PathVariable. Poczytaj sobie http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html bo nie będę przepisywał dokumentacji.
A jak oznaczyc w buttonie zeby przekazal orderId do tej zmiennej?
Zakładam ze wstawiasz te buttony jakąś pętlą po wpisach z bazy, więc masz w tej pętli dostępne te obiekty i w tym także ich ID. Więc do action formularza dodajesz sobie na końcu to ID a w kontrolerze łykasz to jako pathvariable. Alternatywnie mozesz zrobić ukrytego inputa z tym ID i odbierać wartość jako model attribute.
A za pomoca jakiego parametru buttona dodaje to id?
Przepraszam ale czy ty masz jakiekolwiek pojęcie o html? Bo odnoszę powoli wrażenie że nie i próbujesz tu coś metodą prób i błędów osiagnąć...
W przypadku path variable ID dorzuciłbym do action formularza, tak jak pokazałem wyzej.
W przypadku parametrów post/get musisz w formularzuz zrobić ukrytego inputa na tą wartość.
W żadnej z tych sytuacji button nie ma nic do rzeczy.
Może to Ci jeszcze pomoże. Na przykładzie listy użytkowników.
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.lastname}</td>
<td>${user.email}</td>
<td>
<c:forEach items="${user.roles}" var="role">
${role.name}
</c:forEach>
</td>
<td>
<a href="<spring:url value="users/edit/?idUser=${user.id}"/>">Edytuj</a> //Interesuje Cie ta linia
</td>
</tr>
</c:forEach>
@RequestMapping(value = "/users/edit/", method = RequestMethod.GET)
public String gedEditUserForm(@RequestParam("idUser") Long idUser, Map<String, Object> modelMap) {
User user = userService.findById(idUser);
modelMap.put("userToEdit", user);
return "editUser";
}
@RequestMapping(value = "/users/edit/", method = RequestMethod.POST)
public ModelAndView gedEditUserForm(@RequestParam("idUser") Long idUser, /*@Valid*/ @ModelAttribute("userToEdit") User userToEdit, BindingResult result) {
//tutaj usuwasz czy to tam chcesz
}
}
Dobra opisze po kolei mój problem:
Pod adresem nazwa_aplikacji/orders/all
wyświetlam sobie wszystkie zamówienia. Teraz dodałem do każdego zamówienia button i chcę za pomocą tego buttona usunąć tą pozycją z listy zamówień i znowu wywołać żądanie nazwa_aplikacji/orders/all
.
Napisałem sobie dwie metody mapujące to samo żądanie ale z różnym parametrem method:
@RequestMapping(value = "/all", method=RequestMethod.GET)
public String allOrders(Model model) {
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
@RequestMapping(value = "/all", method=RequestMethod.POST)
public String newAllProducts(Model model, @RequestParam("orderId") Long key) {
orderService.removeOrder(key);
return "orders";
}
@RequestParam("orderId") Long key
W tej chwili zmienna jest pobierana z parametru ścieżki i tutaj mi się nie zgadza.
Mój widok:
<c:forEach items="${orders}" var="order">
<h3>Zamówienie nr:${order.value.orderId}</h3>
<h4>Dane klienta</h4>
<p><b>Imię:</b> ${order.value.customer.name}</p>
<p><b>Nazwisko:</b> ${order.value.customer.surname}</p>
<a href="<spring:url value="orders/all/?orderId=${order.value.orderId}"/>">Edytuj</a>
</c:forEach>
Zrobiłem na podstawie tego co napisał gcmarcin.
W widoku ustawione jest hiperłącze do tak jakby strony z konkretnym zamówieniem, ale ja nie chcę mieć takiej strony w ogóle dlatego moje pytanie brzmi tak: jak mam pobrać orderId (i zapisać do jakiejś zmiennej) danego zamówienia nie używając do tego takiego hiperłącza?
Wiem, że pewnie nie wyrażam się nieprecyzyjnie i chaotycznie ale jestem początkującym i potrzebuje podpowiedzi co do kilku zagadnień.
No jak zrobiłeś zwykłego linka to kliknięcie w niego powoduje GET a nie POST a ty taki parametr łykasz tylko kiedy leci POST. Postaw breakpointy w tych kontrolerach i zobacz gdzie sie debuger zatrzymuje ;)
Shalom napisał(a):
No jak zrobiłeś zwykłego linka to kliknięcie w niego powoduje GET a nie POST a ty taki parametr łykasz tylko kiedy leci POST. Postaw breakpointy w tych kontrolerach i zobacz gdzie sie debuger zatrzymuje ;)
Inaczej to mamy takie coś:
<form action="all" method="POST"> <input type="submit" value="Usuń" class="btn btn-primary" /> </form>Z tego formularza da radę już wywołać POST. Teraz jak przekazać to orderId? Tutaj mam problem główny.
No teraz to masz formularz BEZ tego parametru :D
<form action="all" method="POST">
<input type="hidden" id="cośtam" value="cośtam" />
<input type="submit" value="Usuń" class="btn btn-primary" />
</form>
Robię tak i nie działa.
<form action="all" method="POST"> <input type="hidden" id="${order.value.orderId}" /> <input type="submit" value="Usuń" class="btn btn-primary" /> </form>No i czego się niby spodziewasz skoro wysyłasz parametr o ID takim jak twoje OrderID a nie o takiej wartości? o_O Jak w kontrolerze chcesz przyjmować orderId
to nie wydaje ci się że gdzieś ta nazwa musi sie pojawić? Logika lvl over 9000
Shalom napisał(a):
No i czego się niby spodziewasz skoro wysyłasz parametr o ID takim jak twoje OrderID a nie o takiej wartości? o_O Jak w kontrolerze chcesz przyjmować
orderId
to nie wydaje ci się że gdzieś ta nazwa musi sie pojawić? Logika lvl over 9000
Zrobiłem tak i działa jak należy, troche mnie zjechałeś ale dziękuję bardzo za pomoc. ;)
<form action="all" method="POST"> <input type="hidden" name="orderId" id="${order.value.orderId}" /> <input type="submit" value="Usuń" class="btn btn-primary" /> </form>A nie jeszcze jeden problem. Po kliknięciu na ten button usuwane są wszystkie zamówienia zamiast tego do którego przypisany jest button. Jak to rozwiązać? Gdzie mogę mieć błąd?:
@RequestMapping(value = "/all", method=RequestMethod.GET)
public String allOrders(Model model) {
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
@RequestMapping(value = "/all", method=RequestMethod.POST)
public String newAllProducts(@RequestParam("orderId") Long key) {
orderService.removeOrder(key);
return "orders";
}
<input type="hidden" name="orderId" id="${order.value.orderId}" />
Serio? Weź no przeczytaj jakie atrybuty ma input w HTMLu :) nie id a value
To nic nie zmienia u mnie, nadal usuwane są wszystkie produkty i wyświetlana pusta strona.
Zmienia zmienia, tyle, że masz gdzie indziej problem.
Jak przy metodzie post dodaje zamowienia do model to nadal nie działa:
@RequestMapping(value = "/all", method=RequestMethod.POST)
public String newAllProducts(Model model, @RequestParam("orderId") Long orderId) {
orderService.removeOrder(orderId);
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
No i liczysz że wywróżymy to z fusów nie widząc kodu? o_O Postaw breakpoint w kontrolerze i zobacz co się usuwa z bazy i co dostajesz jako listę wszystkich orderów. I nie pisz mi że "nie umiem debugować". Jak nie umiesz to odstaw to co robisz. Naucz się. I dopiero wtedy wróć do pracy nad tym kodem.
To po kolei:
Metody - zwracające listę i usuwająca obiekt o danym key z listy - warstwa danych.
private Map<Long, Order> listOfOrders;
public Map <Long, Order> getListOfOrders() {
return listOfOrders;
}
public void removeOrder(Long key) {
listOfOrders.remove(key);
}
Warstwa usług:
public Map <Long, Order> getListOfOrders() {
return orderRepository.getListOfOrders();
}
public void removeOrder(Long key) {
orderRepository.removeOrder(key);
}
Kontroler:
@RequestMapping(value = "/all", method=RequestMethod.GET)
public String allOrders(Model model) {
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
@RequestMapping(value = "/all", method=RequestMethod.POST)
public String newAllProducts(Model model, @RequestParam("orderId") Long orderId) {
orderService.removeOrder(orderId);
model.addAttribute("orders", orderService.getListOfOrders());
return "orders";
}
Widok:
<c:forEach items="${orders}" var="order">
<h3>Zamówienie nr:${order.value.orderId}</h3>
<h4>Dane klienta</h4>
<p><b>Imię:</b> ${order.value.customer.name}</p>
<p><b>Nazwisko:</b> ${order.value.customer.surname}</p>
<form action="/orders/all" method="POST">
<input type="hidden" name="orderId" value="${order.value.orderId}"/>
<input type="submit" value="Usuń" class="btn btn-primary"/>
</form>
</c:forEach>
Pytanie: Dlaczego po kliknięciu na przycisk pojawia się error i to nie działa?
Rozumiem że nie uważasz za istotne JAKI BŁĄD SIE POJAWIA? o_O
Proszę bardzo HTTP Status 404 - /orders/all jednak sam nie jestem w stanie naprawić aplikacje jak należy. Pomożesz?
Pytałem o bład w logach serwera a nie to co ci się wyświeta na ekranie. Logi, wiesz, tam gdzie ci w IDE pojawia się dużo takich dziwnych literek...
Mam jakieś warningi w logach ale to na 100% nie jest nic co dotyczy tego problemu.
czy ten action='/orders/all' jest na pewno dobry?
Wchodzi do metody?
public String newAllProducts(Model model, @RequestParam("orderId") Long orderId)
Swr napisał(a):
czy ten action='/orders/all' jest na pewno dobry?
Wchodzi do metody?
public String newAllProducts(Model model, @RequestParam("orderId") Long orderId)
Nie wiem jak to wykonałem ale złą ścieżkę podałem. DZIAŁA WRESZCIE DZIAŁA !!!! Dziękuję bardzo za naprowadzenie ;))