Mapowanie akcji w formularzach Spring.

0

Witam. Mam pewien problem ze zrozumieniem wykonywania akcji w springu. Przykładowo mam taką stronkę wyświetlającą wszystkich użytkowników:

	<form action="addAdminForm" method="post">
		<input type="submit" value="Dodaj administratora" />
	</form>
	<table id="myTable">
		<tr>
			<th width="200px">Login</th>
			<th width="200px">Imię</th>
			<th width="200px">Nazwisko</th>
			<th width="200px">Email</th>
			<th width="140px">Edytuj</th>
			<th width="140px">Usuń</th>
		</tr>
		<c:forEach items="${admins}" var="admin">
			<tr>
				<td><c:out value="${admin.username}" /></td>
				<td><c:out value="${admin.firstName}" /></td>
				<td><c:out value="${admin.lastName}" /></td>
				<td><c:out value="${admin.email}" /></td>
				<td><a
					href="<c:url value='/admin/editAdminForm/${admin.id}' />">Edytuj</a></td>
				<td><a href="<c:url value='/admin/removeAdmin/${admin.id}' />">Usuń</a></td>
			</tr>
		</c:forEach>
	</table> 

U góry mam prosty przycisk, który przekierowuję żądanie do kontrolera:

	@RequestMapping(value = "/admin/addAdminForm", method = RequestMethod.POST)
	public ModelAndView goAddAdminForm() {
		ModelAndView mav = new ModelAndView("admin/addadmin");
		mav.addObject("user", new UserDto());
		return mav;
	}

i potem wyświetla nam się formularz do wypełnienia z danymi użytkownika. Tylko jest jeden problem, jeśli w formie parametr action wygląda tak

<form action="/admin/addAdminForm" method="post">

to przy próbie przekierowania dostaję błąd 404

The requested resource is not available
a w URL mam

http://localhost:8181/admin/addAdminForm 

A po tym przekierowaniu powinien wyglądać:

http://localhost:8181/ibank/admin/addAdminForm 

To samo dalej na stronie addAdmin mam formularz <form:form action="/admin/addAdmin" modelAttribute="user" method="post">

 i ono też w takiej formie daje identyczny błąd, ale jeśli zmienię w form na <code class="java"><form:form action="addAdmin" modelAttribute="user" method="post">

wszystko działa jak należy. Przecież kontroler reaguje na żądanie "admin/addAdminForm" a nie samo "addAdminForm". W innych miejsach przy przekierowaniu na strony itp działa to normalnie, że podaję np. a href="<c:url value='/admin/manageaccount' />">Zarządzaj kontami</a>

Tak samo mam przy przejściu 
```html
<td><a href="<c:url value='/admin/editAdminForm/${admin.id}' />">Edytuj</a></td> 

do strony z formularzem do edycji muszę dokleić kontekst aplikacji żeby zadziałało:

	<form:form action="${pageContext.request.contextPath}/admin/editAdmin"
		modelAttribute="user" method="post">

a w kontrolerze oczywiście mam:

	@RequestMapping(value = "/admin/editAdmin", method = RequestMethod.POST) 

Czy nie powinno zadzialać action="/admin/editAdmin"

Sam już tego nie rozumiem czemu tak a nie inaczej i to zawsze przy formularzach.

Jeszcze drugie pytanie na marginesie, mając stronę z listą userów jak powyżej i takiego typu tabelę gdzie operacje edytuj i usuń wykonujemy przez taki odsyłacz

```html
				<td><a
					href="<c:url value='/admin/editAdminForm/${admin.id}' />">Edytuj</a></td>
				<td><a href="<c:url value='/admin/removeAdmin/${admin.id}' />">Usuń</a></td>

Czy nie da się przesłać całego obiektu admin? Tylko muszę przesyłać samo ID i potem w kontrolerze najpierw wyszukiwać po id tego użytkownika:

User user = userService.findUser(id);

i dopiero potem mogę zrobić edycję, bo metoda merge przyjmuje cały obiekt. Poszukałem trochę, ale nic takiego nie znalazłem jedyna alternatywa jak mi do głowy przychodzi to dać tą listę w formularz i pod edytuj i usuń dodać przyciski zamiast odsyłaczy i w formie dać modelAttribute="admin"

1
  1. Poważnie? Piszesz aplikacje webowe w springu a nie wiesz czym się różni ścieżka wzlędna od bezwzględnej? o_O Jak ścieżka zaczyna się od / to jest bezwzględna i leci od roota...
  2. Da się, ale za pomocą POSTa a nie GETa, więc tak, musisz zrobić formularz. Pomyśl trochę. GET to jest parametr w pasku adresu! Jak chcesz tam wcisnąć "obiekt"? Mógłbyś ręcznie go zamienić na JSONa i tak przesłac a potem deserializować, ale więcej z tym kłopotu niż jest to warte.
0

@Shalom Pozwolę sobie odświeżyć bo przypomniał mi się ten temat i mam pewne niejasności jeszcze. Ok jak jest / to leci do roota a jak nie ma to dokleja do tego co jest. Więc czemu jeśli mam:

<form action="/admin/addAdminForm" method="post"> 

to nie zwraca mi jak każde inne przekierowanie: http://localhost:8181/ibank/

 i dalej to co tam mam, tylko dostaję: <code class="html">http://localhost:8181/admin/addAdminForm 

Inne odwołania zwracają dobre stronę np. takie

<a href="<c:url value='/admin/manageaccount' />">Zarządzaj kontami</a>

tylko w formularzach coś nie gra.

1

o_O bo jak używasz tagu c:url to JSTL automagicznie uwzględnia nazwę lokalnej aplikacji przed podanym URLem w trakcie renderowania htmla. Jak wpisujesz samo /cośtam to dokładnie to dostaniesz w wynikowym formularzu html (bo przecież tego htmla NIC już nie przetwarza po drodze) więc będziesz miał to /cośtam doklejone do roota.

0
Shalom napisał(a):

o_O bo jak używasz tagu c:url to JSTL automagicznie uwzględnia nazwę lokalnej aplikacji przed podanym URLem w trakcie renderowania htmla. Jak wpisujesz samo /cośtam to dokładnie to dostaniesz w wynikowym formularzu html (bo przecież tego htmla NIC już nie przetwarza po drodze) więc będziesz miał to /cośtam doklejone do roota.

Ok dzięki, czyli jedynym rozwiązaniem jest doklejenie w formularzu:

pageContext.request.contextPath
1

A nie możesz uzyć c:url albo ścieżki względnej? o_O

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