Spring MVC - usuwanie pozycji listy za pomocą buttona

0

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.

0

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.

0

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?

0

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.

0

A jak oznaczyc w buttonie zeby przekazal orderId do tej zmiennej?

0

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.

0

A za pomoca jakiego parametru buttona dodaje to id?

0

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.

1

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
        }

    }
0

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ń.

0

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 ;)

0
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.

0

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>
0

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>
0

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

0
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>
0

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";
	}
 
0
   <input type="hidden" name="orderId" id="${order.value.orderId}" />

Serio? Weź no przeczytaj jakie atrybuty ma input w HTMLu :) nie id a value

0

To nic nie zmienia u mnie, nadal usuwane są wszystkie produkty i wyświetlana pusta strona.

0

Zmienia zmienia, tyle, że masz gdzie indziej problem.

0

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";
	}
0

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.

0

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?

0

Rozumiem że nie uważasz za istotne JAKI BŁĄD SIE POJAWIA? o_O

0

Proszę bardzo HTTP Status 404 - /orders/all jednak sam nie jestem w stanie naprawić aplikacje jak należy. Pomożesz?

0

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...

0

Mam jakieś warningi w logach ale to na 100% nie jest nic co dotyczy tego problemu.

0

czy ten action='/orders/all' jest na pewno dobry?

Wchodzi do metody?

public String newAllProducts(Model model, @RequestParam("orderId") Long orderId)
0
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 ;))

1 użytkowników online, w tym zalogowanych: 0, gości: 1